-第14章单片机C语言程序设计基础.ppt

-第14章单片机C语言程序设计基础

由图14-3,当P1口某一位为0时,表明该位所接的按键被按下,然后在计算机屏幕上输出按下的按键的信息。 例如,3号键按下,则在PC机显示屏上显示“key No. 3 down”。程序如下: #includereg51.h #includestdio.h /*因为用到printf( )函数,所以要包含stdio.h */ Uart_Init(); sbit P10=0x90; /*定义P1口各位的位名*/ sbit P11=0x91; sbit P12=0x92; 14.3.5 行列式键盘查询方式 【例14-7】本例为2008年某省电子大赛D题“电能质量检测装置”某参赛者设计中的一部分。单片机外接行列式键盘,用于控制单片机向FPGA(现场可编程门阵列)发出指令启动AD对信号采样分析,并控制单片机向LCD传输数据以显示波形和参数。 采用查询方式对实现行列式键盘的键值读取。独立式4×4键盘的接口电路如下页图(见第10章的图10-10)。 * * 图10-10 行列式键盘的接口电路 图中,每个按键行数与P1口高半字节对应,列数与P1口低半字节对应,行列号结合即可确定键位。首先查询判断是否有键按下:驱动P1口高半字节为全0,低半字节为全1,当读回P1口低半字节存在某位为0时,表明有键按下。 延时去抖后,获取键位。先获取键位列号:按照之前的驱动方式对P1口驱动高半字节为全0,低半字节全1,读回P1口的低半字节值。然后获取行号:驱动P1口低半字节为全0,高半字节为全1,读回P1口的低半字节值。得到键位值后,进入键位服务程序。 * 头文件key.h如下: #ifndef KEY_H #include AT89C51.h #include stdio.h #define KEY_H #define KEY_PORT P1 #define KV_FALSE 0Xff /*无键按下* / /*宏定义键位值* / #define KV_START 0x11 /*“开始采样”键* / #define KV_END 0x12 /*“结束采样”键* / #define KV_wave 0x14 /*“显示波形”键*/ #define KV_parameter 0x18 /*“显示基本参数”键*/ * #define KV_U_harmon 0x21 /*“显示电压谐波分析”键*/ #define KV_I_harmon 0x22 /*“显示电流谐波分析”键* / #define KV_7 0x24 /*未使用的按键,下同*/ #define KV_8 0x28 #define KV_9 0x41 #define KV_10 0x42 #define KV_11 0x44 #define KV_12 0x48 #define KV_13 0x81 #define KV_14 0x82 #define KV_15 0x84 #define KV_16 0x88 uchar KeyScan(void); * /*宏定义几种数据类型*/ typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; #endif 用于扫描键盘以得到键值的子程序如下: #include key.h uchar KeyScan(void) { uchar keyValue; /*检测是否有键按下*/ KEY_PORT = 0x0F; if(~(KEY_PORT | 0xF0) == 0) return KV_FALSE; /*延时去抖*/ * DelayMs(5); /*检测是否仍有键按下并获取P1口键位列号*/ KEY_PORT = 0x0F; keyValue = ~(KEY_PORT | 0xF0); if(keyValue==0) return KV_FALSE; /*补充P1口键位行号*/ KEY_PORT= 0xF0; keyValue |= ~(KEY_PORT | 0x0F); /*等待按键释放*/ do { KEY_PORT = 0x0F; if(~(KEY_PORT | 0xF0) != 0) continue; /*仍然被按下*/ /*判断是否真的释放*/ DelayMs(5); if(~(KEY_PORT | 0xF0) != 0) con

文档评论(0)

1亿VIP精品文档

相关文档