按鍵控制數碼管顯示
要求:
1.繪制仿真圖,包含四個按鍵和一個四位的數碼管。(20分)
2.按鍵1按下數碼管顯示數值加1。(20分)
3.按鍵2按下數碼管顯示數值減1。(20分)
4.按鍵3按下數碼管顯示數值清0。(20分)
5.按鍵4按下數碼管自動開始/暫停自加1。(20分)
uj5u.com熱心網友回復:
獎勵的是C幣?uj5u.com熱心網友回復:
這種代碼應該很容易找到吧
uj5u.com熱心網友回復:
在proteus模式程序中數碼管超過9后顯示例外,可能跟電腦重繪頻率有關,所以程式是否可行還需要實際檢驗,這兩天沒時間沒弄,有時間我在驗證一下,新手如果有不對的地方請大家指教
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數碼管顯示0-9
uchar flag,temp; //標記
uint index;
void delay(uint t){ //延時函式
uint n;
while(t--){
for(n=0;n<6245;n++);
}
}
void show(uint m){ //數碼管顯示函式,根據不同位數顯示
if(index<10){ //當m<10時,只顯示一位
P3=0xf7;
P2=led[m];
}else if(m>=10 && m<100){ //當m>=19并且m<100時,顯示2位
P3=0xf7;
P2=led[m%10];
P3=0xfb;
P2=led[m/10];
}else if(m >=100 && m <1000){ //當m>=100并且m<1000時,顯示3位
P3=0xf7;
P2=led[m%10];
P3=0xfb;
P2=led[m%100/10];
P3=0xfd;
P2=led[m/100];
}else if(m >1000 && m<10000){ //當m>=1000并且m<10000時,顯示4位
P3=0xf7;
P2=led[m%10];
P3=0xfb;
P2=led[m%100/10];
P3=0xfd;
P2=led[m%1000/100];
P3=0xfe;
P2=led[m/1000];
}
}
void main(){
P3=0xf7;
P2=led[0];
while(1){
if(P1 != 0xff){ //當4個按鍵任意一個按下時,進行如下判斷
if(P1 == 0xfe && flag==0){ //第一個按鍵按下,index數值+1
flag=1;
index++;
if(index <0 || index >9999){index=0;} //index的上限和下限
}
if(P1 == 0xfd && flag==0){ //第二個按鍵按下,index數值-1
flag=1;
index--;
if(index <0 || index >9999){index=0;}
}
if(P1 == 0xfb && flag==0){ //第三個按鍵按下,index數值=0
index=0;
}
if(P1 == 0xf7 && flag==0 && temp==0){ //第四個按鍵第一次按下,對temp標記進行更改,同時index自增+1
flag=1;
temp=1;
while(1){ //index回圈自增+1
delay(5);
index++;
if(index <0 || index >9999){index=0;}
show(index); //顯示
if(P1 != 0xff){ //在index自增的程序中如果有按鍵被按下則終止自增
break;
}
}
}
if(P1 == 0xf7 && flag==0 && temp==1){ //同上部,只是index自增變成自減
flag=1;
temp=0;
while(1){
delay(5);
index--;
if(index <0 || index >9999){index=0;}
show(index);
if(P1 != 0xff){
break;
}
}
}
}else{
flag=0;
}
show(index); //顯示
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/83300.html
標籤:單片機/工控
下一篇:BMP280
