- #include<reg51.h>
- #define GPIO_DIG P0
-
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit P26=P2^6;
- sbit P27=P2^7;
- sbit KEY1=P3^0;
- sbit KEY2=P3^1;
- sbit KEY3=P3^2;
- sbit KEY4=P3^3;
- unsigned char code DIG_CODE[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
- //unsigned char DisplayData[8];
- //用来存放要显示的8位数的值
- void DigDisplay(); //动态显示函数
- void Delay10ms( ); //延时10ms
- void delayms(unsigned char xms);
- unsigned char keyscanf(); //unsigned char keyscanf();
- unsigned char time[4]={2,0,1,6};
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main(void)
- { static unsigned char st=0;
- // unsigned char key;
- unsigned int i;
- P26=1;
- P27=1;
-
- while(1)
- {
- DigDisplay();
- if(KEY2==0) //检测按键K1是否按下
- {
- Delay10ms(); //消除抖动
- if(KEY2==0)
- {
- for(;KEY2==0;)
- P26=0;
- if(time[st]<9)//if(time[0]<9&time[1]<9&time[2]<9&time[3]<9)
- time[st]++;
- else time[st]=0;
- while((i<50)&&( KEY1=1)) //检测按键是否松开
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
- }
- // key2
- if(KEY1==0) //检测按键K1是否按下
- {
- Delay10ms(); //消除抖动
- if(KEY1==0)
- {
- for(;KEY1==0;)
- P26=0;
- if(time[st]!=0)
- time[st]--;
- else time[st]=9;
- while((i<50)&&( KEY1=1)) //检测按键是否松开
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
- }
- // key3
- if(KEY3==0) //检测按键K1是否按下
- {
- Delay10ms(); //消除抖动
- if(KEY3==0)
- {
- for(;KEY3==0;)
- P26=0;
- if(st>=0&&st<=2)
- st++;
- else st=0;
- while((i<50)&&( KEY1=1)) //检测按键是否松开
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
- }
- // key4
- if(KEY4==0) //检测按键K1是否按下
- {
- Delay10ms(); //消除抖动
- if(KEY4==0)
- {
- for(;KEY4==0;)
- P26=0;
- if(st!=0)
- st--;
- else st=3;
- while((i<50)&&( KEY1=1)) //检测按键是否松开
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
- }
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : DigDisplay
- * 函数功能 : 使用数码管显示
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- for(i=0;i<4;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=1;LSB=1;LSC=0; break;//显示第0位
- case(1):
- LSA=0;LSB=1;LSC=0; break;//显示第1位
- case(2):
- LSA=1;LSB=0;LSC=0; break;//显示第2位
- case(3):
- LSA=0;LSB=0;LSC=0; break;//显示第3位
- }
- GPIO_DIG=DIG_CODE[time];//发送段码
- j=10; //扫描间隔时间设定
- while(j--);
- GPIO_DIG=0x00;//消隐
- }
- }
- /*******************************************************************************
- * 函 数 名 : keyscanf
- * 函数功能 : 扫描按键
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- unsigned char keyscanf() /// unsigned char keyscanf()
- {
- if(KEY1&KEY2&KEY3&KEY4)
- {
- delayms(10);
- if(KEY1&KEY2&KEY3&KEY4)
- {
-
- if(!KEY1)
- { P26=0;
- return(1);}
- else if(!KEY2)
- { P27=0;
- return(2);}
- else if(!KEY3)
- { while(!KEY3)
- return(3);}
- else if(!KEY4)
- { while(!KEY4)
- return(4);}
-
- }
- }
- return (0);
- }
- /*******************************************************************************
- * 函 数 名 : delayms
- * 函数功能 : 延迟
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void delayms(unsigned int xms)
- {
- unsigned int i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Delay10ms(void) //误差 0us
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
|