今天恰好學到了按鍵這部分!所以結合之前編寫數碼管動態掃描顯示數字的有關知識編了代碼實現了一個小功能~
功能:按一下按鍵,數碼管顯示的數字加一(1-999)。
具體代碼:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DIOLA=P2^5;//控制八個LED燈點亮的芯片的某控制端
sbit key=P3^4;//某按鍵~可以任意噠
sbit dula=P2^6;
sbit wela=P2^7;
uint num,i,number;
uchar temp;
uchar code table[]={ 0x3f ,0x06 ,0x5b ,0x4f,0x66 ,0x6d, 0x7d ,0x07 ,0x7f, 0x6f};
//數字0-9對應段選
uchar code b[]={0xdf,0xef,0xf7};//動態掃描位
uint a[3];
void delay(uint z);
void main()
{
P1=0xff;
P0=0xff;
DIOLA=1;
P3=0xff;
dula=0;
wela=0;
number=0;
while(1)
{
P1=0xff;//LED燈未按下按鍵
a[2]=number/100;
a[1]=(number%100)/10;
a[0]=(number%100)%10;
if(a[2]==0&&a[1]==0) num=1;
else if(a[2]==0&&a[1]!=0) num=2;
else num=3;
i=num;
wela=0;
while(1)
{
temp=b[i-1];//位選
wela=1;
P0=temp;
wela=0;
P0=0xff;//消隱
dula=1;
P0=table[a[i-1]];//段選
dula=0;
delay(5);
if(i>1)i--;
else i=num;
if(temp!=0xdf)temp=_crol_(temp,1);//位選改變
else temp=b[i-1];
P0=0xff;
if(key==0)
{
P1=0x0; //按鍵按下時LED點亮
while(!key);
P1=0xff;//按鍵未按下時LED熄滅狀態
number++;//顯示數字加一
if(number==999) number=0;
break;
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
做個筆記!
1.按鍵按下再擡起計數才加一 不等於按鍵按下就計數加一!否則你按下的時間很長時計數會一直增加。
while(!key);語句可以解決問題,把這句話看作“固定某個狀態,讓程序暫停了。”
2.設置了兩個大循環,按鍵按完後跳出一層循環(數碼管位選段選動態刷新顯示),進入大循環(重新計算需顯示數字的各位)。
3.在Main函數中使用的數據類型只能作爲全局變量聲明(在main函數外面)?不然會報錯~
仿真效果:
中間下方那個按鈕s2在被按!
問題:注意到在按鈕被按下的時候,數碼管顯示是不正常的...沒有辦法顯示穩定的多位數,只能顯示一位。
畢竟用while(!key);語句給暫停住程序了嘛,,,沒辦法正常動態刷新顯示啦。
暫時不知道怎麼改,以後沒準就會了哦。
碎碎念:加了實驗室但是還是好迷茫啊哭哭,大創連個方向都沒有申報啥呀(再次哭哭)。
感覺我寫的代碼也蠢蠢的和我一樣迷茫....害!快樂當條鹹魚不好麼哼!!