**
数码管显示51单片机矩阵按键的对应键值(c语言)**
代码如下:
#include#define uchar unsigned char #define uint unsigned int sbit duan=P2^6; sbit wei=P2^7; uchar key; uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; void yanshi(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void xianshi()//显示函数 { wei=1; P0=0xfe; wei=0; duan=1; P0=table[key/10]; duan=0; P0=0xff; yanshi(5); wei=1; P0=0xfd; wei=0; duan=1; P0=table[key%10]; duan=0; P0=0xff; yanshi(5); } void keyscan()//键盘扫描函数 { uchar temp; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { yanshi(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0;break; case 0xde: key=1;break; case 0xbe: key=2;break; case 0x7e: key=3;break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; xianshi(); } } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { yanshi(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4;break; case 0xdd: key=5;break; case 0xbd: key=6;break; case 0x7d: key=7;break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; xianshi(); } } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { yanshi(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8;break; case 0xdb: key=9;break; case 0xbb: key=10;break; case 0x7b: key=11;break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; xianshi(); } } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { yanshi(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: key=12;break; case 0xd7: key=13;break; case 0xb7: key=14;break; case 0x77: key=15;break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; xianshi(); } } } } void main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; while(1) { xianshi(); } } void t0_time()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; keyscan(); }
注:这里在等待按键释放程序中加入了显示函数,避免按键按下时数码管不显示;
这里单独使用了中断来扫描keyscan;
标注不完全,如有错误,还请指正;



