本帖最后由 51黑电子会员 于 2020-5-22 08:38 编辑
- /*****
- 本程序分两个程序。一个是程序一,按键控制数码管带来闪灭显示问题的程序。
- 另一个是程序二,解决按键控制数码管带来闪灭显示问题的程序。通过利用数码
- 管显示函数代替按键扫描函数内的按键延时,以及在按键扫描函数内按键松手时,
- 再次调用数码管显示函数。提醒:先试程序一,再试程序二,之后两者对比,找
- 出不同点,取最适合的。
- *****/
- //程序一:按键控制数码管带来闪灭显示问题的程序
- //#include<reg51.h>
- //#define uchar unsigned char
- //#define uint unsigned int
- //sbit add=P3^0;
- //sbit dec=P3^4;
- //uchar lingweiflag;
- //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
- //uint num;
- //uint qian,bai,shi,ge;//定义拆字变量
- // /**ms级延时子程序**/
- // void delay(uint x)
- //{
- // uint i,j;
- // for(i=0;i<x;i++)
- // for(j=0;j<110;j++);
- // }
- // void display()
- //{
- // qian=num/1000;//取得千位数字
- // bai=num%1000/100;//取得百位数字
- // shi=num%100/10;//取得十位数字
- // ge=num%10;//取得个位数字
- //
- // P2=0xfe;//数码管千位显示位
- // P1=table[qian];//数码管千位数值显示
- // delay(2);//延时
- //
- // P2=0xfd;//数码管百位显示位
- // P1=table[bai];//数码管百位数值显示
- // delay(2);//延时
- //
- // P2=0xfb;//数码管十位显示位
- // P1=table[shi];//数码管十位数值显示
- // delay(2);//延时
- //
- // P2=0xf7;//数码管个位显示位
- // P1=table[ge];//数码管个位数值显示
- // delay(2);//延时
- // }
- // void keyscan()
- //{
- // if(add==0)
- // {
- // delay(5);
- // if(add==0)
- // {
- // num++;
- // while(!add);
- // lingweiflag=0;
- // }
- // }
- // if(dec==0&&lingweiflag==0)
- // {
- // delay(5);
- // if(dec==0)
- // {
- // num--;
- // while(!dec);
- // }
- // }
- // if(num>9999)
- // {
- // num=0;
- // }
- // if(num==0)
- // {
- // num=0;
- // lingweiflag=1;
- // }
- // }
- // void main()
- //{
- // while(1)
- // {
- // display();
- // keyscan();
- // }
- // }
- //程序二:解决按键控制数码管带来闪灭显示问题的程序
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit add=P3^0;
- sbit dec=P3^4;
- uchar lingweiflag;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
- uint num;
- uint qian,bai,shi,ge;//定义拆字变量
- /**ms级延时子程序**/
- void delay(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++);
- }
- void display()
- {
- qian=num/1000;//取得千位数字
- bai=num%1000/100;//取得百位数字
- shi=num%100/10;//取得十位数字
- ge=num%10;//取得个位数字
- P2=0xfe;//数码管千位显示位
- P1=table[qian];//数码管千位数值显示
- delay(2);//延时
- P2=0xfd;//数码管百位显示位
- P1=table[bai];//数码管百位数值显示
- delay(2);//延时
- P2=0xfb;//数码管十位显示位
- P1=table[shi];//数码管十位数值显示
- delay(2);//延时
- P2=0xf7;//数码管个位显示位
- P1=table[ge];//数码管个位数值显示
- delay(2);//延时
- }
- void keyscan()
- {
- if(add==0)
- {
- // delay(5);
- display();
- if(add==0)
- {
- num++;
- // while(!add);
- while(!add)
- {
- display();
- }
- lingweiflag=0;
- }
- }
- if(dec==0&&lingweiflag==0)
- {
- // delay(5);
- display();
- if(dec==0)
- {
- num--;
- // while(!dec);
- while(!dec)
- display();
- }
- }
- if(num>9999)
- {
- num=0;
- }
- if(num==0)
- {
- num=0;
- lingweiflag=1;
- }
- }
- void main()
- {
- while(1)
- {
- display();
- keyscan();
- }
- }
复制代码
|