/******************************************************************************* * 实 验 名 : 动态显示数码管实验 * 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4 * 实验效果 : 数码管显示76543210。 * 注 意 : *******************************************************************************/ #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--); }
|