用单片机中断来扫描键盘的程序

发布者:CreativeMind最新更新时间:2012-11-24 来源: 21IC 关键字:单片机中断  扫描键盘  数码管 手机看文章 扫描二维码
随时随地手机看文章

/*
程序效果:用51单片机的中断来扫描键盘,按下按键,蜂鸣器响,数码管有相应的键值
       显示,按下E键继电器关,按下C键继电器开。
       这与上一程序的功能相同,比上一程序简洁
       但理解相对困难些。
开发设计:http://www.51hei.com/
*/

#include //头文件
#include
#define uchar unsigned char //宏定义
#define uint  unsigned int
sbit jdq=P3^5; //位声明,驱动继电器管脚
sbit  fmq=P3^4; //位声明,驱动蜂鸣器管脚
code uchar table[]={0x3f,0x06,0x5b,//数码管显示的数值
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
code uchar key_tab[17]={   //此数组为键盘编码
0xed,0x7e,0x7d,0x7b,   // 0,1,2,3,
0xbe,0xbd,0xbb,0xde,  // 4,5,6,7,
0xdd,0xdb,0x77,0xb7,     // 8,9,a, b,
0xee,0xeb,0xd7,0xe7,0xff}; //  c,d,e,f,
uchar l_key=0x00; //定义变量,存放键值
uchar l_keyold=0xff; //作为按键放开否的凭证
void readkey();    //扫描键盘,获取键值
void display(uchar *lp,uchar lc); //显示子函数
void delay();  //延时子函数
void main()  //主函数
{
   EA=1;  //打开总中断
   EX0=1; //打开外部中断
   P0=0xf0; //键值高4位为高电平,低4位为低电平
    while(1)
    {
      display(&l_key,1); //调用显示子函数
      if(l_key==14)  //是否按下E键,是则关闭继电器
       jdq=1;  
      if(l_key==12)  //是否按下C键,是则打开继电器
       jdq=0;
    } 
}
void key_scan() interrupt 0//外部中断0,0的优先级最高
{
   EX0=0;  //在读键盘时,关闭外部中断,防止干扰带来的多次中断
   TMOD&=0xf1; //设置定时器为工作方式1          
   TH0=0x2e;  //设置初值,为12毫秒,十进制值为11776
   TL0=0x00;
   ET0=1;  //开启定时器中断0
   TR0=1;  //启动定时器计数
}
void time0() interrupt 1   //定时器0的中断函数
{
   TR0=0;     //关闭定时器0
   readkey(); //定时12ms后产生中断,调用此函数,读取键值
}
void readkey()    //扫描键盘子函数
{
   uchar i,j,key; //定义局部变量
   j=0xfe;   //设定初值
   key=0xff;
   for(i=0;i<4;i++) // 逐列扫描键盘
   {
      P0=j;
      if((P0&0xf0)!=0xf0) //有按键按下,高4位不可能全为1
      {
         key=P0; //读取P0口的值,推出循环,否则循环下次
         break;
      }
      j=_crol_(j,1); //此函数的功能是:左移循环
   }
   if(key==0xff)   //如果读取不到P0口的值,如干扰,则返回
   {
      l_keyold=0xff;
      P0=0xf0;    // 恢复P0口的值,等待按键按下
      fmq=1;
      EX0=1;    //在返回前,打开外部中断
      return;
   }
   fmq=0;   //有按键按下,打开蜂鸣器
   if(l_keyold==key) // 检查按键放开否,如果相等表明没有放开
   {
      TH0=0x2e; //设置初值
      TL0=0x00;
      TR0=1; //继续启动定时器,检查按键放开否
      return;
   }
   TH0=0x2e; 
   TL0=0;
   TR0=1;  //启动定时器
   l_keyold=key; //获取键值,作为放开否的凭证
   for(i=0;i<17;i++)   //查表获得相应的16进制值存放到l_key中
   {
      if(key==key_tab[i])
      {
         l_key=i;
         break;
      }
 }
 //程序运行到此,就表明有键值存放到l_key中,主程序
 //就可以检测键盘值并作相应的处理
}
void display(uchar *lp,uchar lc) //显示子函数
{
   uchar i;   //定义局部变量
   P1=0xf8; //点亮第一个数码管
   P2=0;    //P2口为输出值
   for(i=0;i   {
      P2=table[lp[i]]; //查表获得相应的要显示的数字的数码段
      delay();  //延时
      P2=0;  //清零,准备显示下一个数值
   }
}
void delay() //延时子函数
{
   _nop_();_nop_();_nop_();_nop_();_nop_();
}
如果程序无法编译,请删除所有前导空白.

关键字:单片机中断  扫描键盘  数码管 引用地址:用单片机中断来扫描键盘的程序

上一篇:非常简单的8*8LED点阵c51源代码
下一篇:51单片机驱动1602液晶显示器c程序

推荐阅读最新更新时间:2024-03-16 13:13

数码管显示51单片机DS18B20温度测量源程序及仿真
这是一款数码管显示51单片机DS18B20温度测量源程序及仿真资料,特别适合单片机初学者学习参考,这款数码管显示51单片机DS18B20温度测量源程序使用模块化编程,方便移置,单片机使用AT89C51单片机,数码使用四位共阴数码管,这样简化了硬件电路,降低了硬件的制作难度。这款数码管显示51单片机DS18B20温度测量源程序是在Keil4环境下编译通过,并在Proteus7.8仿真软件下仿真通过。温度测量范围是:-55-125度。由于源程序直接贴出来会丢后些重要内容,所以特别将这款数码管显示51单片机DS18B20温度测量源程序及仿真资料打包后放在百度网盘上,需要的爱好者可以自己去下载。更多单片机源程序与仿真请到电子乐屋。 数
[单片机]
<font color='red'>数码管</font>显示51<font color='red'>单片机</font>DS18B20温度测量源程序及仿真
4*4矩阵键盘制作电路+键盘扫描法89c52c程序驱动数码管
这里介绍最常用的4*4矩阵键盘,其他的更多键在此基础上拓展。 一般我们用的电路就如下,此图我随手画下,看懂意思就好了 如果你有兴趣可以按照此电路制作,下面附上焊接实物图 矩阵键盘的识别方法一般有扫描法,线反转法 扫描法: 矩阵式键盘结构:输出行线锁存器,输入列线缓冲器。 工作过程: 1.CPU先使行线P1.0为低,其余行线为高 2.CPU读入输入缓冲器的状态,以确定哪条列线为0状态,若此时P1.7为0,则 C 键按下;若P1.5为0,则 E 键按下 3.若输入缓冲器(列线)状态全部为1,说明P1.0行没有键盘按下,CPU急继续使P1.1为0,其余行线为高,再读入输入缓冲器的状态,以确定哪条列线为0
[单片机]
DIY制作LED数码管定时器
由于只有一个数码管,只能显示0到15,所以这个定时器可以定时0到15分,0到15个小时,0到15天,0到15个星期,本来想在程序中加上定时0到15个月,但想想在实际情况中定时15个月都有一年多了,估计好少用到,就不写了。这个定时器我加上了继电器,所以可以控制220V交流电,且定时误差在几个毫秒内,还算精确吧。。。 先来几张初期的原理图: 下面是单片机的源程序: #include reg52.h #define uint unsigned int #define uchar unsigned char sbit ledg=P1^0;//秒闪烁(一秒钟亮一秒钟灭) sbit ledb=P1^1;//分闪烁(一分钟
[单片机]
DIY制作LED<font color='red'>数码管</font>定时器
单片机AT89C51--6.数码管显示(含动态,静态)
1. 数码管显示原理 a为共阴极,b为共阳极 2. 静态与动态显示 静态显示 每个数码管的选段必须接入一个8位的数据线来保持显示字形码。当输入一次字形码后显示字形可以一直保持,直到输入新的字形码为止。 动态显示 将所有数码管的段选并联在一起,由位选控制,控制那个数码管有效。亮的数码管采用动态扫描方式。轮流向各位数码管送出字形码和对应位选,利用发光管的余晖和人肉眼的残留,使人们感觉数码管都在显示 3. 74HC573锁存器的工作原理 锁存器的作用:把数据输入端与输出端进行隔离或连接 OE端需要接地,才能让输出口Q有高低电平的转换 LE脚高,输出端Q随输入端D的数据变化而变化 LE脚低,输出端Q数据保持不变
[单片机]
<font color='red'>单片机</font>AT89C51--6.<font color='red'>数码管</font>显示(含动态,静态)
单片机常用功能模块的使用 Part2. 共阴共阳数码管
本质就是发光二极管 LED 的连接方式,多个 LED 摆成 日 的形状就叫数码管,共阴共阳就是一端统一接地或者统一接 VCC。 1、具体参数: 好像少了个⑨ 2、连接方法: 注:数码管本来就是 10 引脚:7 个字形,1 个小数点,2 个电源(为嘛是 2 个,没有考证过 )
[单片机]
<font color='red'>单片机</font>常用功能模块的使用 Part2. 共阴共阳<font color='red'>数码管</font>
驱动大尺寸数码管的方法与电路
相信大家都见过数码管,数码管上面有abcdefg七个笔画,构成一个“日”字,一般还有一个小数点dp。 数码管的外形有不同的大小,其度量标准是其中“日”字的高度,单位一般都是英寸。 市场上数码管的尺寸范围一般为 0.25~8 英寸。   驱动大尺寸数码管 在实验室中,常见的数码管是 0.5 英寸的,它的高和宽分别为 0.7 英寸和 0.5 英寸。 这种数码管,每个笔画的内部,仅仅含有一个 LED,驱动一个笔画,和驱动一个普通的发光二极管无异。 在大厅或者户外,就要使用大尺寸的数码管。 做而论道用过最大的数码管是 8 英寸的。 8 英寸数码管中的每个笔画内部,都含有 8 个 LED,它们之间是两两并联后再串联;小数点 dp 的内部,
[单片机]
驱动大尺寸<font color='red'>数码管</font>的方法与电路
嵌入式学习笔记10——51单片机中断定时器中断
1. CPU时序的有关知识 (1)振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。 (2)状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 (3)机器周期:1个机器周期含6个状态周期,12个振荡周期(使用计时器时,每隔一个机器周期计时器加1)。 (4)指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 2. 学习定时器前须明白: (1)51单片机有2组定时器/计数器(52单片机有三组),可定时或计数。 (2)定时器/计数器和单片机的CPU是相互独立的,定时器/计数器工作的过程是自动完成的,不需要CPU的参与。 (3)51单片机中的定时器/计
[单片机]
嵌入式学习笔记10——51<font color='red'>单片机</font>之<font color='red'>中断</font>定时器<font color='red'>中断</font>
PIC16F87X单片机中断系统应用须关注的问题
  摘要: 美国微芯公司研制的PIC系列单片机,其硬件结构和指令系统采用了与众不同的设计手法。在架构上和概念上对传统单片机进行了一些突破性的变革,但也给这类单片机的应用带来了一些特殊问题。本文针对PIC16F87X系列单片机中断的特点,及其在应用过程中应该注意的几个问题进行必要的说明。内容包括中断源、中断逻辑、中断相关的寄存器、中断的延时、中断的现场保护以及注意事项等。 关键词: 单片机 PIC16F87X 中断系统 中断源   目前在世界一些著名的单片机产品系列中,PIC16F87X系列单片机是芯片内部包含有外围设备模块数量最多的单片机品种之一。PIC16F87
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved