51单片机-按键加减

  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 }

猜你喜欢

转载自www.cnblogs.com/clam-hao/p/10080146.html