键盘及LED显示实验C源程序 #include <regx52.h> #define uchar unsigned char #define uint unsigned int //段码 uchar code DSY_CODE[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x00}; sbit BEEP=P3^7; //上次按键和当前按键的序号,该矩阵中序号范围 0~15,16表示无按键 uchar Pre_KeyNo=16,KeyNo=16; //延时 void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } //矩阵键盘扫描 void Keys_Scan() { uchar Tmp; P0=0xf0; //低4位置0 DelayMS(1); Tmp=P0>>4^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯0变为1 switch(Tmp)//判断按键发生于 0~3 列 { case 1: KeyNo=0;break; case 2: KeyNo=1;break; case 4: KeyNo=2;break; case 8: KeyNo=3;break; default:KeyNo=16; //无键按下 } P0=0x0f; //高4位置0 DelayMS(1); Tmp=P0^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值 switch(Tmp)//对0~3 列分别附加起始值 0,4,8,12 { case 1: KeyNo+=0;break; case 2: KeyNo+=4;break; case 4: KeyNo+=8;break; case 8: KeyNo+=12;break; default:KeyNo=16; //无键按下 } } //蜂鸣器 void Beep() { uchar i; for(i=0;i<100;i++) { DelayMS(1); BEEP=~BEEP; } BEEP=0; } //主程序 void main() { P1=0x00; BEEP=0; while(1) { P0=0xf0; if(P0!=0xf0) Keys_Scan(); //获取键序号 if(Pre_KeyNo!=KeyNo) { P1=DSY_CODE[KeyNo]; Beep(); Pre_KeyNo=KeyNo; } DelayMS(100); } } |