单片机4*4矩阵键盘程序及Protues仿真
1、截图如下
2、键盘及显示程序
#include #define uchar unsigned char #define uint unsigned int #define key P1 sbit ledle=P3^0; sbit lede=P3^1; void delay(uint z)//延迟函数 { uint x,y; for(x=z;x>0;x--) for(y=112;y>0;y--); } uchar code table[]={ //显示数据编码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0x76,0x79,0x38,0x3f,0}; //#include uchar keyboard1()//带返回值的子程序:键盘扫描的子程序 { uchar temp,num; key=0xfe; //扫描要经过四个过程段,0xfe,0xfd,0xfb,0xf, temp=key; //读取P3口的信心 temp=temp&0xf0; // 位与,为下面的判断提供条件 while(temp!=0xf0)//判断P3口(即键盘)有无被按下,若是,则temp不等于0xf0,否则等于 { delay(5); // 延时再做一次判断,消抖、防抖动 temp=key; temp=temp&0xf0; while(temp!=0xf0) { //确定有按键被按下,进入判断阶段,以判断那一个键被按下 temp=key; switch(temp) { case 0xee: num=1; break; case 0xde: num=2; break; case 0xbe: num=3; break; case 0x7e: num=4; break; } while(temp!=0xf0) //松键判断,若键盘被按下后且被松开,则temp=0xf0;即跳过该while循环,若否,重新取P3口值,再做判断 { temp=key; temp=temp&0xf0; } } } key=0xfd; temp=key; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=key; temp=temp&0xf0; while(temp!=0xf0) { temp=key; switch(temp) { case 0xed: num=5; break; case 0xdd: num=6; break; case 0xbd: num=7; break; case 0x7d: num=8; break; } while(temp!=0xf0) { temp=key; temp=temp&0xf0; } } } key=0xfb; temp=key; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=key; temp=temp&0xf0; while(temp!=0xf0) { temp=key; switch(temp) { case 0xeb: num=9; break; case 0xdb: num=10; break; case 0xbb: num=11; break; case 0x7b: num=12; break; } while(temp!=0xf0) { temp=key; temp=temp&0xf0; } } } key=0xf7; temp=key; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=key; temp=temp&0xf0; while(temp!=0xf0) { temp=key; switch(temp) { case 0xe7: num=13; break; case 0xd7: num=14; break; case 0xb7: num=15; break; case 0x7e: num=16; break; } while(temp!=0xf0) { temp=key; temp=temp&0xf0; } } } return num; //返回值, } void main() { lede=0; ledle=1; while(1) { P2=table[keyboard1()]; //P2=table[4]; delay(5); } } 因篇幅问题不能全部显示,请点此查看更多更全内容