《C51单片机05(键盘).ppt》由会员分享,可在线阅读,更多相关《C51单片机05(键盘).ppt(23页珍藏版)》请在第壹文秘上搜索。
1、第第5讲讲 单片机键盘单片机键盘独立按键独立按键独立按键触发的中断独立按键触发的中断#includevoid main()TCON=0 x00;/设置外部中断为电平触发方式设置外部中断为电平触发方式EA=1;/中断总控开放中断总控开放EX0=1;/外部中断外部中断INT0开放开放EX1=1;/外部中断外部中断INT1开放开放P0=0 x00;/数码管不显示任何内容数码管不显示任何内容while(1);/等待中断发生等待中断发生void keypress0() interrupt 0 /外部中断外部中断INT0服务程序服务程序P0=0 x3f;/数码管数码管0显示数字显示数字0P2=0 x00;
2、void keypress1() interrupt 2 /外部中断外部中断INT1服务程序服务程序P0=0 x06;/数码管数码管1显示数字显示数字1P2=0 x01;练习练习 用查询方式检测独立按键用查询方式检测独立按键S19是否按下,若是否按下,若第一次按下,第一次按下,LED0发光;第二次按下,发光;第二次按下,LED0熄灭,循环往复。熄灭,循环往复。程序代码程序代码#include#define uchar unsigned char#define uint unsigned intsbit KEY1 = P32;/独立按键独立按键S19连接的端口连接的端口sbit LED0 = P
3、00;/独立发光二极管连接端口独立发光二极管连接端口void Delay(uint milisec)/延时延时10msuint i,j;for(i=0; imilisec; i+)for(j=0; j1827; j+);程序代码程序代码void KEY()if(KEY1=0)/如果检测到有键按下如果检测到有键按下Delay(2); /20毫秒软件防抖毫秒软件防抖if(KEY1=0)/再次确认是否有键按下再次确认是否有键按下 LED0 = LED0;/LED显示取反显示取反Delay(50);/延时延时0.5秒再进行下次按键的检测秒再进行下次按键的检测void Main(void)while(1
4、) KEY();/查询方式持续检测是否有键按下查询方式持续检测是否有键按下练习练习 用查询方式检测独立按键用查询方式检测独立按键S19按下的次数,按下的次数,并在数码管并在数码管LED7上显示,最大计数值为上显示,最大计数值为9,超过超过9则从则从0开始重新计数。开始重新计数。#include#define uchar unsigned char#define uint unsigned intuchar code table16 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0
5、x5e,0 x79,0 x71;sbit KEY1 = P32;/独立按键独立按键S19连接的端口连接的端口uint k=0;void Delay(uint milisec)/延时延时10msuint i,j;for(i=0; imilisec; i+)for(j=0; j9) k=0; P0=tablek;/获取获取LED段位码段位码 Delay(50);/延时延时500ms再进行下次按键的检测再进行下次按键的检测练习练习 按下独立键按下独立键S19,使独立发光二极管,使独立发光二极管LED8发光发光1秒,然后自行熄灭(利用定时器实现秒,然后自行熄灭(利用定时器实现准确定时)准确定时)练习练
6、习 连续多次按下独立键连续多次按下独立键S19,使独立发光二极,使独立发光二极管管LED0LED8依次轮流发光,到头以后能依次轮流发光,到头以后能自行返回开始,循环执行自行返回开始,循环执行4 * 4 键盘阵列键盘阵列 若无键按下,读回的低若无键按下,读回的低4位为全位为全“1”0111练习练习 用查询方式扫描用查询方式扫描4 * 4键盘阵列,在最右侧键盘阵列,在最右侧数码管数码管LED(LED7)上显示用户按键的位置上显示用户按键的位置(0F)分析是否有键按下分析是否有键按下 先向先向P0口输出口输出0 xf0(高四位列选为全(高四位列选为全1 ,低四位行选为全低四位行选为全0),然后读回)
7、,然后读回 由于由于P0口输出有锁存,若无键按下,从口输出有锁存,若无键按下,从P0口读回应该仍为口读回应该仍为0 xf0,低四位行选保持全,低四位行选保持全0 若读回值不为若读回值不为0 xf0,即低四位行选不为全,即低四位行选不为全0,说明有键按下说明有键按下111100001分析是哪个键按下分析是哪个键按下 双重循环双重循环 先选定一列,再逐行扫描,获得键位置码先选定一列,再逐行扫描,获得键位置码 将键位置码送到将键位置码送到LED7显示显示第第0次扫描,次扫描,P1输出输出0 xef(11101111)01111111 第第0次读回次读回P1,P1 & 00000001,结果不为,结果
8、不为0 第第1次读回次读回P1,P1 & 00000010,结果不为,结果不为0 第第2次读回次读回P1,P1 & 00000100,结果不为,结果不为0 第第3次读回次读回P1,P1 & 00001000,结果不为,结果不为0说明按下的键不在P14对应的列第第1次扫描,次扫描,P1输出输出0 xdf(11011111)10111111 第第0次读回次读回P1,P1 & 00000001,结果不为,结果不为0 第第1次读回次读回P1,P1 & 00000010,结果不为,结果不为0 第第2次读回次读回P1,P1 & 00000100,结果不为,结果不为0 第第3次读回次读回P1,P1 & 00
9、001000,结果不为,结果不为0说明按下的键不在P15对应的列第第2次扫描,次扫描,P1输出输出0 xbf(10111111)11011111 第第0次读回次读回P1,P1 & 00000001,结果不为,结果不为0 第第1次读回次读回P1,P1 & 00000010,结果为,结果为0 找到了按键所在的列找到了按键所在的列(2)与行与行(1)说明按下的键在P16对应的列0程序代码程序代码#include#include#define uint unsigned int#define uchar unsigned charuchar code table16 = 0 x3f,0 x06,0 x
10、5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void Delay_1ms(uint i)/1ms延时延时uchar x,j;for(j=0;ji;j+) for(x=0;x=148;x+);void delay()/一个很短的延时一个很短的延时int i,j;for(i=0; i=20; i+);键盘扫描的关键代码键盘扫描的关键代码uchar Keyscan(void)/返回一个返回一个0F的键位置码的键位置码uchar i, j, temp; uchar Buffer4 =
11、0 xef, 0 xdf, 0 xbf, 0 x7f;for(j=0; j4; j+)/从第从第0列开始,逐列扫描列开始,逐列扫描P1 = Bufferj;/向向P1口输出列扫描码口输出列扫描码(高高4位含有一个位含有一个0)delay();/短暂延时,等待短暂延时,等待 P1 口的状态稳定口的状态稳定temp = 0 x01; /从第从第0行开始,逐行扫描行开始,逐行扫描 for(i=0; i4; i+) if(!(P1 & temp) /若有键按下,若有键按下, P1 & temp为全为全“0” return (j*4+i);/返回键位置返回键位置(j表示列号,表示列号, i表示行号表示行
12、号) temp = 1;/左移一位,扫描下一行左移一位,扫描下一行主程序主程序void Main(void)uchar Key_Value; /读出的键值读出的键值while(1)P1 = 0 xf0;/检测是否有键按下检测是否有键按下if(P1 != 0 xf0)/若有键按下若有键按下 Delay_1ms(15);/等待等待15ms,按键消抖,按键消抖 if(P1 != 0 xf0)/确实有键按下确实有键按下 Key_Value = Keyscan();/获得键位置码获得键位置码 P0 = tableKey_Value;/获取段位码获取段位码P2 = 0 x07;/在在LED7显示键盘输入的值显示键盘输入的值练习练习 在在4 * 4 键盘阵列中逐次按键,在数码管键盘阵列中逐次按键,在数码管LED中按右对齐方式显示按下的键(最多中按右对齐方式显示按下的键(最多8次)次)Thank you