|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
设计一个单片机键盘接口电路,实现4*4矩阵键盘,用数码管显示相应按键内容,当指定某一个按键连续被按三次时,显示“口”字符号,按键有去抖动功能,数码管可以通过清零键清零。
1 F% X& d7 h% U- a
, k; w, {- K! x) l* g( K! d仿真原理图
" S% q6 Q' \2 U
2 z: f8 }5 I4 }8 ~+ n单片机源程序如下:" R: [5 J* d5 _; B O2 a8 h
- //0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 共阴
- //0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E 共杨
- #include <reg52.h>
- #define GPIO_DIG P0 //段选数码管
- #define GPIO_KEY P2 //矩阵按键
- sbit led = P1^0;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uint keynum = 0;
- uint count=0;
- uchar code table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
- uchar code table0[]={0x5c};
- void delay( uchar i ){
- while( i-- );
- }
- void key44scan(void)//键盘扫描函数
- {
- // uint count=0;
- uint t;
- P2=0xfe;
- t=P2;
- t=t&0xf0;
- if(t!=0xf0){
- delay(100);
- if(t!=0xf0)
- {
- t=P2;
- count++;
- switch(t)
- {
- case 0xee:keynum=1; break;
- case 0xde:keynum=5; break;
- case 0xbe:keynum=9; break;
- case 0x7e:keynum=13; break;
- }
- P0=table[keynum];
- while(t!=0xf0)
- {
- t=P2;
- t=t&0xf0;
- }
- }
- }
- P2=0xfd;
- t=P2;
- t=t&0xf0;
- if(t!=0xf0){
- delay(100);
- if(t!=0xf0)
- {
- t=P2;
- count++;
- switch(t)
- {
- case 0xed:keynum=2; break;
- case 0xdd:keynum=6; break;
- case 0xbd:keynum=10; break;
- case 0x7d:keynum=14; break;
- }
- P0=table[keynum];
- while(t!=0xf0)
- {
- t=P2;
- t=t&0xf0;
- }
- }
- }
- P2=0xfb;
- t=P2;
- t=t&0xf0;
- if(t!=0xf0){
- delay(100);
- if(t!=0xf0)
- {
- t=P2;
- count++;
- switch(t)
- {
- case 0xeb:keynum=3; break;
- case 0xdb:keynum=7; break;
- case 0xbb:keynum=11; break;
- case 0x7b:keynum=15; break;
- }
- P0=table[keynum];
- while(t!=0xf0)
- {
- t=P2;
- t=t&0xf0;
- }
- }
- }
- P2=0xf7;
- t=P2;
- t=t&0xf0;
- if(t!=0xf0){
- delay(100);
- if(t!=0xf0)
- {
- t=P2;
- count++;
- switch(t)
- {
- case 0xe7:keynum=4; break;
- case 0xd7:keynum=8; break;
- case 0xb7:keynum=12; break;
- case 0x77:keynum=0; break;
- }
- P0=table[keynum];
- while(t!=0xf0)
- {
- t=P2;
- t=t&0xf0;
- }
- }
- }
- // if(count==3){
- // count = 0;
- // led =~ led;
- // P0=table0[0];
- // delay(1000);
- // }
- }
- void main (){
- led = 0;
- while(1) {
- key44scan();
- if(count==3){
- //count = 0;
- led =~ led;
- P0=table0[0];
- // delay(1000);
- }
- if(count==4){
- count = 0;
- led =~ led;
- P0=table[0];
- // delay(1000);
- }
- }
- }
& U7 u* N+ R, T# @
6 a+ p+ ?! O& q1 S' M% e) j
8 R1 J$ T ^+ B% d5 ^7 s3 B0 a1 f2 e5 m) r1 ]
8 f2 a6 {* m0 l+ |6 Y% D3 G
|
|