8位數碼管計算器51彙編程式4 4矩陣鍵盤

2021-08-10 10:16:42 字數 5583 閱讀 6603

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 微控制器數碼管 段選 位選 是什麼?位選,就是選擇你想要點亮哪個數碼管 段選,就是選擇你想要點亮哪個數碼管的哪個一段。關於微控制器控制數碼管段選和位選的先後順序 數碼管不是一定要先...