《新型键盘程序编程讲解》由会员分享,可在线阅读,更多相关《新型键盘程序编程讲解(14页珍藏版)》请在金锄头文库上搜索。
1、独立键盘电路基本编程方法,要求:通过按下一次按键INT0,使小灯D1 亮灭交替变换。,实验原理: 只要判断P3.2 的电平就可以知道按键是否被按下;而在按键按下的过程中,由于机械抖动,将产生干扰,电平高低变化。可以采用软件滤波的方法去除这些干扰信号,在程序设计时,一旦发现P3.2 为低电平,进入按键判断状态,软件延时10-20ms,从而避开了干扰信号区域,再重新检测P3.2 状态,看按键是否真的已经按下。,参考程序(传统的延时消抖按键程序) include sbit INT_0=P32; /定义按键的输入端 sbit D1=P30; /D1小灯定义 void delay10ms(void) /
2、延时程序 unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); key( ) /按键判断程序 if(INT_0=0) /判断是否按下键盘 delay10ms( ); /延时,软件去干扰 if(INT_0=0) /确认按键按下 D1=!D1; /D1亮灭交替变化 while(INT_0=0);/按键锁定,每按一次D1只变化一次 ,续前页: main() while(1) /永远循环,扫描判断按键是否按下 key(); /对于此处CPU只按键判断 一直扫描; ,课后请实践: 1.用两个按键来控制D1 的亮灭; 2. 使用一个按键,控制小灯亮的顺序
3、D1D2D3D4D8D7D0 亮重复循环;,4X4矩阵键盘基本编程方法,要求:用AT89S51 的并行口P2 接44 矩阵键盘,以P3.0P3.3 作输入线,以P3.4P3.7 作输出线;在每一个数码管上显示每个按键的“0F”序号。,实验原理 每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU 通信。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表
4、,查出该键的功能。,键盘识别的两种方法,逐行扫描法: (1)首先判断有无键按下:令矩阵行线输出全0信号,检测列线状态,若有一列电平为低,则有键按下。 (2)确定闭合键位置:依次将各行线置为低电平,逐行检测各列线的电平状态,若某列为低,则该行线和列线交叉处按键就是闭合键。 线反转法: (1)令矩阵键盘列线输出全0信号,行线作为输入接口接收信号,可判断按键处于哪一行。 (2)令矩阵键盘行线输出全0信号,列线作为输入接口接收信号,可判断按键处于哪一列。 (3)将输入信号相或后形成键盘的唯一键码。,程序:(线反转法) #include unsigned char code seg7code=0x3f,
5、0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; unsigned char k; void delay10ms(void) /延时程序 unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void Getch ( ) unsigned char X,Y,Z; P2=0xff; P2=0x0f; /先对P2置数 行扫描 if(P2!=0x0f) /判断是否有键按下 delay10ms(); /延时,软件去干扰 if(P2!=0x0f)
6、 /确认按键按下X = P2; ,续前页: X=P2; /保存行扫描时有键按下时状态 P2=0xf0; /列扫描 Y=P2; /保存列扫描时有键按下时状态 Z=X|Y; /取出键值 switch ( Z ) /判断键值(那一个键按下) case 0x77: k=0; break; /对键值赋值 case 0x7b: k=1; break; case 0x7d: k=2; break; case 0x7e: k=3; break; case 0xb7: k=4; break; case 0xbb: k=5; break; case 0xbd: k=6; break; case 0xbe: k=7
7、; break; case 0xd7: k=8; break; case 0xdb: k=9; break; case 0xdd: k=10;break; case 0xde: k=11;break; case 0xe7: k=12;break; case 0xeb: k=13;break;,续前页: case 0xed: k=14;break; case 0xee: k=15;break; void main(void) while(1) P2=0xff; Getch( ); P0=seg7codek; /查表LED输出 P1=0xf0; /输出相同的四位数据。 ,该程序的缺陷: 1、虽然线
8、反转法识别键盘的思路正确,但本程序按键扫描中消除按键抖动采用了传统的延时方法,这种办法会使CPU陷入无谓的等待,在延时的过程中CPU无法并行处理其它事件。采用定时扫描法(比如采用定时中断每隔100ms扫描1次键盘),可以解决这一问题; 2、如果要求实现“短促”按键和“长按”按键的区分,使程序能应用在功能要求更为复杂的场合,继续编制该程序则有繁琐和可读性变差的缺点。因此有必要采用更为便捷和高效的键值识别算法以实现本程序的功能。,新型键盘识别程序,基本思想: unsigned char Trg; unsigned char Cont; void KeyRead( void ) unsigned c
9、har ReadData = P30xff; / 1 Trg = ReadData / 3 分析: (1) 没有按键的时候 ReadData 0x00;Trg 0x00;Cont 0x00; (2) 第一次按下按键的情况 (假设按键接在P3.0上面) ReadData 0x01;Trg 0x01;Cont 0x01; (3) 按键按着不松(长按键)的情况 ReadData 0x01;Trg 0x00;Cont 0x01; (4) 按键松开的情况 ReadData 0x00;Trg 0x00;Cont 0x00;,Trg 表示的就是触发的意思,也就是跳变,只要有按键按下,Trg在对应按键的位上面
10、会置1;最关键的地方,Trg 的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,所谓精粹即此!Cont代表的是长按键,如果按键按着不放,那么Cont的值就为 0x01。,应用一:一次触发的按键处理假设为蜂鸣器按键,按一下,蜂鸣器beep的响一声,#define KEY_BEEP 0x01 void KeyProc(void) if (Trg / 执行蜂鸣器处理函数 ,应用二:长按键的处理,#define KEY_MODE 0x01 / 此模式按键也 #define KEY_PLUS 0x02 / 此加键也 void Key
11、Proc(void) if (Trg / 则执行所需执行之功能程序也 ,延时消抖问题?真正的单片机入门,是从学会处理多任务开始的。,加入延时消抖程序的架构如下: volatile unsigned char Intrcnt; void InterruptHandle() / 中断服务程序 Intrcnt+; / 1ms 中断1次,可变 void main(void) SysInit(); while(1) / 每20ms 执行一次大循环 KeyRead(); / 将每个子程序都扫描一遍 KeyProc(); Func1(); Funt2(); while(1) if (Intrcnt20) / 一直在等,直到20ms时间到 Intrcnt=“0“;break; / 返回主循环 ,怎么判断按键释放?再增加一个按键释放检测功能,程序如下:,volatile unsigned char Trg; volatile unsigned char Cont; volatile unsigned char Release; / 再增加新功能! void KeyRead( void ) unsigned char ReadData = PINB0xff; / 1 读键值 Trg = ReadData / 4 得到所有未释放的键值 ,