矩阵键盘1-F,使用2位数码管,实现连续的2位数的输入,即按下第一个按键个位数,按下第二个按键为十位数。
附件里面包含源代码和proteus仿真工程文件,请大家多多指教!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg52.h"
- typedef unsigned int u16; //对系统默认数据类型进行重定义
- typedef unsigned char u8;
- #define KEY_MATRIX_PORT P2 //使用宏定义矩阵按键控制口
- #define SMG_A_DP_PORT P1 //使用宏定义数码管段码口
- void Dispaly();
- void delay(u16 ms);
- u8 key_matrix_ranks_scan(void);
- u8 DATE[2];
- //共阴极数码管显示0~F的段码数据
- u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
-
- void main()
- {
- u8 key;
- while(1)
- {
- key=key_matrix_ranks_scan(); //判断按键是否按下
- if(key!=0) //若按键按下,数组中每一位数字向前移动一位
- {
- DATE[1]=DATE[0];
- DATE[0]=key-1;
- }
- Dispaly(); //数码管显示
- }
-
- }
- void Dispaly()
- {
- P3=0xFd;SMG_A_DP_PORT=gsmg_code[DATE[0]];delay(1); SMG_A_DP_PORT=0x00;
- P3=0xFe;SMG_A_DP_PORT=gsmg_code[DATE[1]];delay(1); SMG_A_DP_PORT=0x00;
-
- }
- u8 key_matrix_ranks_scan(void)
- {
- u8 key_value=0;
- KEY_MATRIX_PORT=0xf7;//给第一列赋值0,其余全为1
- if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下
- {
- delay(10);//消抖
- switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值
- {
- case 0x77: key_value=1;break;
- case 0xb7: key_value=5;break;
- case 0xd7: key_value=9;break;
- case 0xe7: key_value=13;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xf7);//等待按键松开
-
- KEY_MATRIX_PORT=0xfb;
- if(KEY_MATRIX_PORT!=0xfb)
- {
- delay(10);//消抖
- switch(KEY_MATRIX_PORT)
- {
- case 0x7b: key_value=2;break;
- case 0xbb: key_value=6;break;
- case 0xdb: key_value=10;break;
- case 0xeb: key_value=14;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xfb);
-
- KEY_MATRIX_PORT=0xfd;
- if(KEY_MATRIX_PORT!=0xfd)
- {
- delay(10);//消抖
- switch(KEY_MATRIX_PORT)
- {
- case 0x7d: key_value=3;break;
- case 0xbd: key_value=7;break;
- case 0xdd: key_value=11;break;
- case 0xed: key_value=15;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xfd);
-
- KEY_MATRIX_PORT=0xfe;
- if(KEY_MATRIX_PORT!=0xfe)
- {
- delay(10);//消抖
- switch(KEY_MATRIX_PORT)
- {
- case 0x7e: key_value=4;break;
- case 0xbe: key_value=8;break;
- case 0xde: key_value=12;break;
- case 0xee: key_value=16;break;
- }
- }
- while(KEY_MATRIX_PORT!=0xfe);
-
- return key_value;
- }
- void delay(u16 ms)//延时函数1=1ms
- {
- int p,j;
- for(p=0;p<ms;p++)
- {
- for(j=0;j<110;j++);
- }
- }
复制代码
Keil代码与Proteus7.5 8.13版本的仿真下载(注意:可能不能兼容其他版本 建议用7.5 ;8.13版本打开):
矩阵键盘滚动显示.7z
(55.32 KB, 下载次数: 43)
|