51微控制器-按鍵加減
阿新 • • 發佈:2018-12-06
1 #include "reg52.h" //此檔案中定義了微控制器的一些特殊功能暫存器 2 3 typedef unsigned int u16; //對資料型別進行宣告定義 4 typedef unsigned char u8; 5 6 sbit LSA=P2^2; 7 sbit LSB=P2^3; 8 sbit LSC=P2^4; 9 10 sbit k1=P3^1; 11 sbit k2=P3^0; 12 sbit k3=P3^2; 13 sbit k4=P3^3; //定義按鍵埠 1415 u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 16 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值 17 18 19 #define KEY1 1 20 #define KEY2 2 21 #define KEY3 3 22 #define KEY4 4 23 24 int keynum; 25 u8 DisplayData[8]; 26 /*******************************************************************************27 * 函 數 名 : delay 28 * 函式功能 : 延時函式,i=1時,大約延時10us 29 *******************************************************************************/ 30 void delay(u16 i) 31 { 32 while(i--); 33 } 34 35 //mode=0 單次 1:連續 36 u8 KeyScan(u8 mode) 37 { 38 static u8 keyen=1; 39 if(mode==1) 40 { 41 keyen=1; 42 } 43 if(keyen==1&&(k1==0||k2==0||k3==0||k4==0)) 44 { 45 delay(1000); //消抖處理 46 keyen=0; 47 if(k1==0)return KEY1; 48 else if(k2==0)return KEY2; 49 else if(k3==0)return KEY3; 50 else if(k4==0)return KEY4; 51 } 52 else if(k1==1&&k2==1&&k3==1&&k4==1) 53 { 54 keyen=1; 55 } 56 return 0; 57 } 58 59 60 /******************************************************************************* 61 * 函 數 名 : DigDisplay 62 * 函式功能 : 數碼管動態掃描函式,迴圈掃描8個數碼管顯示 63 *******************************************************************************/ 64 void DigDisplay() 65 { 66 u8 i; 67 for(i=0;i<8;i++) 68 { 69 switch(i) //位選,選擇點亮的數碼管, 70 { 71 case(0): 72 LSA=0;LSB=0;LSC=0; break;//顯示第0位 73 case(1): 74 LSA=1;LSB=0;LSC=0; break;//顯示第1位 75 case(2): 76 LSA=0;LSB=1;LSC=0; break;//顯示第2位 77 case(3): 78 LSA=1;LSB=1;LSC=0; break;//顯示第3位 79 case(4): 80 LSA=0;LSB=0;LSC=1; break;//顯示第4位 81 case(5): 82 LSA=1;LSB=0;LSC=1; break;//顯示第5位 83 case(6): 84 LSA=0;LSB=1;LSC=1; break;//顯示第6位 85 case(7): 86 LSA=1;LSB=1;LSC=1; break;//顯示第7位 87 } 88 P0=DisplayData[i];//傳送段碼 89 delay(100); //間隔一段時間掃描 90 P0=0x00;//消隱 91 } 92 } 93 94 void datapros() 95 { 96 u8 key=KeyScan(0); 97 switch(key) 98 { 99 case 1: keynum++;if(keynum==1000)keynum=0; break; 100 case 2: keynum--;if(keynum<=0)keynum=999; break; 101 case 3: keynum=0; break; 102 case 4: break; 103 } 104 105 DisplayData[2]=smgduan[keynum/100]; //123 106 DisplayData[1]=smgduan[keynum/10%10]; 107 DisplayData[0]=smgduan[keynum%10]; 108 } 109 /******************************************************************************* 110 * 函 數 名 : main 111 * 函式功能 : 主函式 112 * 輸 入 : 無 113 * 輸 出 : 無 114 *******************************************************************************/ 115 void main() 116 { 117 while(1) 118 { 119 datapros(); 120 DigDisplay(); 121 } 122 }