单片机 【独立键盘】
1 #include<reg52.h> 2 #include<intrins.h> 3 #define uchar unsigned char 4 #define uint unsigned int 5 sbit buzzer=P2^3; 6 sbit key=P3^0; 7 void delay(uint x) 8 { 9 uchar i; 10 while(x--) 11 { 12 for(i=0;i<120;i++); 13 } 14 } 15 16 void main() 17 { 18 P1=0x7f; 19 20 while(1) 21 { 22 buzzer =1; //蜂鸣器 -- 关 23 if(key==0) //键盘按下为“0” 24 { 25 delay(5); 26 if(key==0) //消抖 27 { 28 P1=_cror_(P1,1); 29 buzzer = 0; //蜂鸣器----开 30 } 31 while(!key);//松手检测 32 } 33 } 34 }
1 uchar KeyScan() //带返回值的子函数 2 { 3 uchar cord_l,cord_h;//声明列线和行线的值的储存变量 4 P3 = 0xf0;//1111 0000 5 if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下 6 { 7 delay(5);//软件消抖 8 if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下 9 { 10 cord_l = P3 & 0xf0;// 储存列线值 11 P3 = cord_l | 0x0f; 12 cord_h = P3 & 0x0f;// 储存行线值 13 while( (P3 & 0x0f) != 0x0f );//松手检测 14 return (cord_l + cord_h);//返回键值码 15 } 16 } 17 18 } 19 20 void KeyPro() 21 { 22 switch( KeyScan() ) 23 { 24 //第一行键值码 25 case 0xee: P0 = leddata[0]; break; 26 case 0xde: P0 = leddata[1]; break; 27 case 0xbe: P0 = leddata[2]; break; 28 case 0x7e: P0 = leddata[3]; break; 29 30 //第二行键值码 31 case 0xed: P0 = leddata[4]; break; 32 case 0xdd: P0 = leddata[5]; break; 33 case 0xbd: P0 = leddata[6]; break; 34 case 0x7d: P0 = leddata[7]; break; 35 36 //第三行键值码 37 case 0xeb: P0 = leddata[8]; break; 38 case 0xdb: P0 = leddata[9]; break; 39 case 0xbb: P0 = leddata[10]; break; 40 case 0x7b: P0 = leddata[11]; break; 41 42 //第四行键值码 43 case 0xe7: P0 = leddata[12]; break; 44 case 0xd7: P0 = leddata[13]; break; 45 case 0xb7: P0 = leddata[14]; break; 46 case 0x77: P0 = leddata[15]; break; 47 } 48 }
一个二次元的生物

浙公网安备 33010602011771号