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; //定义按键端口 14 15 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 }
51单片机-按键加减
猜你喜欢
转载自www.cnblogs.com/clam-hao/p/10080146.html
今日推荐
周排行