/***** 本程序分两个程序。一个是程序一,按键控制数码管带来闪灭显示问题的程序。 另一个是程序二,解决按键控制数码管带来闪灭显示问题的程序。通过利用数码 管显示函数代替按键扫描函数内的按键延时,以及在按键扫描函数内按键松手时, 再次调用数码管显示函数。提醒:先试程序一,再试程序二,之后两者对比,找 出不同点,取最适合的。 *****/ //程序一:按键控制数码管带来闪灭显示问题的程序 //#include<reg51.h> //#define uchar unsigned char //#define uint unsigned int //sbit add=P3^0; //sbit dec=P3^4; //uint num; //uint qian,bai,shi,ge;//定义拆字变量 //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。 // /**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;//转速/10000的余数/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); // } // } // if(dec==0) // { // delay(5); // if(dec==0) // { // num--; // while(!dec); // } // } // if(num>9999) // { // num=0; // } // if(num<0) // { // num=0; // } // } // 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; uint num; uint qian,bai,shi,ge;//定义拆字变量 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。 /**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;//转速/10000的余数/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(); } } if(dec==0) { // delay(5); display(); if(dec==0) { num--; // while(!dec); while(!dec) display(); } } if(num>9999) { num=0; } if(num<0) { num=0; } } void main() { while(1) { display(); keyscan(); } }
原文:https://www.cnblogs.com/AChenWeiqiangA/p/12925859.html