1樓:匿名使用者
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code tab1=; //通過液晶字元手冊查詢得來
uchar code tab2=;
uchar num; //判斷按鍵的值
uchar flag; //判斷按鍵的標誌位
uchar count; //判斷按鍵位數標誌位
int value;
int sum; //求和,
uchar plus,minus,mul,duvision,equal_flag;//加,減,乘,除,等標誌位
uchar work_num;
uchar power;
sbit rs=p2^5;
sbit rw=p2^6;
sbit e=p2^7;
void delayms(uint count) //延時了程式
uint i,j;
for(i=0;ifor(j=0;j<120;j++);
/**************液晶初始化************************/
void write_com(uchar com)
e=0;
rs=0;
rw=0;
p0=com;
delayms(1);
e=1;
delayms(1);
e=0;
void write_data(uchar num)
e=0;
rs=1;
rw=0;
p0=num;
delayms(1);
e=1;
delayms(1);
e=0;
void int0()
delayms(15);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
/*********鍵盤掃描程式;以確定按鍵位置************/
void keyscanf()
uchar temp;
p1=0xfe;
temp=p1;
temp=temp&0xff;
while(temp!=0xfe)
delayms(5);
temp=p1;
temp=temp&0xff;
while(temp!=0xfe)
temp=p1;
switch(temp)
case 0xee:num=1;flag=1;break;
case 0xde:num=2;flag=1;break;
case 0xbe:num=3;flag=1;break;
case 0x7e:num=10;plus=1;break;
default :num=0;break;
while(temp!=0xfe)
temp=p1;
temp=temp&0xff;
p1=0xfd;
temp=p1;
temp=temp&0xff;
while(temp!=0xfd)
delayms(5);
temp=p1;
temp=temp&0xff;
while(temp!=0xfd)
temp=p1;
switch(temp)
case 0xed:num=4;flag=1;break;
case 0xdd:num=5;flag=1;break;
case 0xbd:num=6;flag=1;break;
case 0x7d:num=11;minus=1;break;
default :num=0;break;
while(temp!=0xfd)
temp=p1;
temp=temp&0xff;
p1=0xfb;
temp=p1;
temp=temp&0xff;
while(temp!=0xfb)
delayms(5);
temp=p1;
temp=temp&0xff;
while(temp!=0xfb)
temp=p1;
switch(temp)
case 0xeb:num=7;flag=1;break;
case 0xdb:num=8;flag=1;break;
case 0xbb:num=9;flag=1;break;
case 0x7b:num=12;mul=1;break;
default :num=0;break;
while(temp!=0xfb)
temp=p1;
temp=temp&0xff;
p1=0xf7;
temp=p1;
temp=temp&0xff;
while(temp!=0xf7)
delayms(5);
temp=p1;
temp=temp&0xff;
while(temp!=0xf7)
temp=p1;
switch(temp)
case 0xe7:power=1;break; //復位;
case 0xd7:num=0;flag=1;break;
case 0xb7:equal_flag=1;break; //等於;
case 0x77:num=13;duvision=1;break;
default :num=0;break;
while(temp!=0xf7)
temp=p1;
temp=temp&0xff;
/**********顯示部分*******************************/
void display(uchar num)
uchar workdata; //處理顯示標誌位
if(flag==1) //鍵值資訊顯示
flag=0;
write_data(tab1[num]);
switch(count)
case 0: value+=tab2[num];break;
case 1: value=((value*10)+tab2[num]);break;
case 2: value=((value*10)+tab2[num]);break;
case 3: value=((value*10)+tab2[num]);break;
default: value=0;break;
count++;
if(count>=4)
count=0;
if(plus==1) //處理加法運算
write_com(0x01);
write_data('+');
write_com(0x80);
plus=0;
count=0;
sum+=value;
value=0;
work_num=1;
if(minus==1) //處理減法運算
write_com(0x01);
write_data('-');
write_com(0x80);
minus=0;
count=0;
sum+=value;
value=0;
work_num=2;
if(mul==1) //處理乘法運算
write_com(0x01);
write_data('*');
write_com(0x80);
mul=0;
count=0;
sum+=value;
value=0;
work_num=3;
if(duvision==1) //處理除法運算
write_com(0x01);
write_data('/');
write_com(0x80);
duvision=0;
count=0;
sum+=value;
value=0;
work_num=4;
if(equal_flag==1)//求出運算結果
equal_flag=0;
workdata=1;
switch(work_num)
case 1:work_num=0;sum+=value;value=0;break;
case 2:work_num=0;sum-=value;value=0;break;
case 3:work_num=0;sum*=value;value=0;break;
case 4:work_num=0;sum/=value;value=0;break;
default:;break;
if(workdata==1) //顯示處理
workdata=0;
write_com(0x01);
write_com(0x80);
if(sum<0)
write_data('-');
sum=abs(sum);
if((sum<10)&&(sum>=0))
write_data(tab1[sum]);
else if((sum<100)&&(sum>=10))
write_data(tab1[sum/10]);
write_data(tab1[sum%10]);
else if((sum<1000)&&(sum>=100))
write_data(tab1[sum/100]);
write_data(tab1[sum%100/10]);
write_data(tab1[sum%100%10]);
else if((sum<10000)&&(sum>=1000))
write_data(tab1[sum/1000]);
write_data(tab1[sum%1000/100]);
write_data(tab1[sum%1000%100/10]);
write_data(tab1[sum%1000%100%10]);
else
write_data('e');
write_data('r');
write_data('r');
write_data('o');
write_data('r');
write_data('!');
write_data('!');
write_data('!');
main()
int0();
while(1)
keyscanf();
display(num);
if(power==1)
power=0;
write_com(0x01);
sum=0;
value=0;
看看能不能幫到你
怎樣讓數碼管顯示不同的數字,怎樣讓數碼管顯示2個不同的數字
先讓來你的第一個數碼管顯示要 源顯示的第一個數字,其他數碼管關閉 然後關閉第一個數碼管顯示 然後讓你的第二個數碼管顯示要顯示的第二個數字,其他數碼管關閉 然後關閉第二個數碼管 然後讓第三個數碼管顯示要顯示的第三個數字,其他數碼管關閉 然後關閉第三個數碼管 依次類推,到最後一個後返回到第一個重新顯示。...
這是共陽極數碼管顯示吧,如果是共陰極數碼管,程式應該怎麼改呢?我改了總是出錯
直接將共陽極數 來碼管換成共源陰極.是不行的。比如二極體,連線方向改變後肯定不能工作了。但是,如果將共陽極數碼管錯買成了共陰極的 如果腳位和驅動筆畫是一樣的話,還是可以用的。改動如下 1 將共陽訊號改為共陰訊號 2 將原來所有驅動訊號都反一次相。不能正常工作的,如果是靜態顯示的話你需要做兩件事 1硬...
關於微控制器4位數碼管段選位選問題求解答
根據你這圖可以斷定 p2 的 0 1 2 3 為位選 p0 是段選,分別對應數碼管的 a b c d e f g dp 微控制器數碼管 段選 位選 是什麼?位選,就是選擇你想要點亮哪個數碼管 段選,就是選擇你想要點亮哪個數碼管的哪個一段。關於微控制器控制數碼管段選和位選的先後順序 數碼管不是一定要先...