新闻  |   论坛  |   博客  |   在线研讨会
键盘扫描原理和源程序
tongxin | 2009-04-13 15:22:14    阅读:4787   发布文章

键盘扫描原理和源程序
%A
%A
%A 键盘工作原理
%A
%A
%A
%A 74ls08的输出断接到mcu的外部中断入口,当有键按下时申请中断,进行扫描
%A
%A
%A
%A 先向端口输出0x07,使三根列线为1,5根行线为0,74ls08返回1;
%A 当有键按下时如图2
%A
%A
%A
%A
%A 一、 第二根列线由高电平降为低电平,74ls08产生下降沿,向mcu申请中断
%A
%A
%A
%A
%A 图2
%A
%A
%A
%A 二、 由于373是只写,mcu扫描是通过不断向373送数据并判断74ls08的状态得到的
%A 扫描方法:
%A 1 向行线一个一个地送高电平,如图2所示,当向1行送高电平时,74ls08输出地电
%A 平,按下的键不在此行;把1行降为低电平并向第2行送高电平,此时74ls08将产生电平翻
%A 转,由低电平变为高电平,mcu通过此状态可判断按键是在此行上,得到了按键的行号为
%A 2,保持此行线的高电平,开始进行列扫描
%A 2 三根列线起初都为高电平,2号行线为高电平,74ls08为高电平,向列线送低电平
%A 即可使74ls08变为低电平,若送低电平而74ls08输出不变,就会得到按键的列地址,具体
%A 操作如下,当向1列送低电平时,74ls08翻转为低电平,说明按键不在此列,将1号列线变
%A 为高电平并将2号列线变为低电平,通过电阻74ls08的引脚通过按键由2号行线(注意扫描
%A 行线时已将此行线保持为高电平)上拉为高电平,74ls08并未翻转,由此可判断按键在2号
%A 列线上
%A 3 得出按键的行列地址为(2,2),结束扫描,返回键值
%A 三、 说明:
%A 1 此案例为一个3×5的键盘为例,其它数目的键盘可由此原理扩充
%A 2 此方案只需要一片74ls373与3个电阻,74ls08是系统中剩余的门电路,若系统中没有剩
%A 余的门,就需要专门准备了
%A 3 此方案不能识别组合试的按键
%A
%A
%A
%A
%A 工作源代码(c51函数)
%A
%A
%A
%A //key_temp 为返回的键值,XBYTE[0X8001]为键盘在总线中的地址
%A
%A
%A
%A unsigned char key_io()
%A {
%A unsigned char key_temp;
%A key_i = 1;
%A key_temp = 0xff;
%A XBYTE[0x8001] = 0x07;
%A if(key_i == 0)
%A {
%A sleep(30);
%A if(key_i == 0)
%A {
%A XBYTE[0x8001] = 0x87;//μúò?áD
%A if(key_i)
%A {
%A XBYTE[0x8001] = 0x83;
%A if(key_i)
%A key_temp = 10;
%A else
%A {
%A XBYTE[0x8001] = 0x85;
%A if(key_i)
%A key_temp = 6;
%A else
%A {
%A XBYTE[0x8001] = 0x86;
%A if(key_i)
%A key_tem = 1;
%A else
%A key_temp = 0xff;
%A }
%A }
%A }
%A else
%A {
%A XBYTE[0x8001] = 0x47;
%A if(key_i)
%A {
%A XBYTE[0x8001] = 0x43;
%A if(key_i)
%A key_temp = 11;
%A else
%A {
%A XBYTE[0x8001 ]= 0x45;
%A if(key_i)
%A key_temp = 7;
%A else
%A {
%A XBYTE[0x8001] = 0x46;
%A if(key_i)
%A key_temp=2;
%A else
%A key_temp=0xff;
%A }
%A }
%A }
%A else
%A {
%A XBYTE[0x8001]=0x27;
%A if(key_i)
%A {//μúèyáD
%A XBYTE[0x8001]=0x23;
%A if(key_i)
%A key_temp=12;
%A else
%A {
%A XBYTE[0x8001]=0x25;
%A if(key_i)
%A key_temp=8;
%A else
%A {
%A XBYTE[0x8001]=0x26;
%A if(key_i)
%A key_temp=3;
%A else
%A key_temp=0xff;
%A }
%A }
%A }
%A else
%A {
%A XBYTE[0x8001]=0x17;
%A if(key_i)
%A {//μú??áD
%A XBYTE[0x8001]=0x13;
%A if(key_i)
%A key_temp=13;
%A else
%A {
%A XBYTE[0x8001]=0x15;
%A if(key_i)
%A key_temp=9;
%A else
%A {
%A XBYTE[0x8001]=0x16;
%A if(key_i)
%A key_temp=4;
%A else
%A key_temp=0xff;
%A }
%A }
%A }
%A else
%A {
%A XBYTE[0x8001]=0x0f;
%A if(key_i) //μú??á?
%A {
%A XBYTE[0x8001]=0x0b;
%A if(key_i)
%A key_temp=14;
%A else
%A {
%A XBYTE[0x8001]=0x0d;
%A if(key_i)
%A key_temp=0;
%A else
%A {
%A XBYTE[0x8001]=0x0e;
%A if(key_i)
%A key_temp=5;
%A else
%A key_temp=0xff;
%A }
%A }
%A }
%A else
%A key_temp=0xff;
%A }
%A }
%A }
%A }
%A for(;;)
%A {
%A dog=!dog;
%A key_i=1;
%A sleep(10);
%A XBYTE[0x8001]=0x07;
%A if(key_i==1)
%A {
%A sleep(30);
%A if(key_i==1)
%A break;
%A }
%A } //μè′y?ü?ì?é?a
%A }
%A else
%A key_temp=0xff;
%A }
%A XBYTE[0x8001]=0x07;
%A return(key_temp);
%A }
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客