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