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

2021-08-10 10:16:43 字數 5583 閱讀 5409

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;

看看能不能幫到你

8位數碼管同時動態顯示09程式

不知道你具體什麼要求,先提供乙個類似的給你參考,是實現0 9迴圈顯示。附件是 和 文件。不清楚的地方可追問。先說明你用的顯示電路。微控制器,求程式?數碼管動態顯示驅動,有八個數碼管,要求先顯示0 7,然後顯示8 f。怎麼寫啊?急 你用什麼微控制器的,用動態掃瞄啊,就是八個數碼管乙個乙個的顯示數字,然...

用C51系列的微控制器控制在8位數碼管動態顯示秒錶要c語言版程式謝謝

顯示程式和硬體關聯,如驅動方式 位數等,所以沒有統一的程式,假定動態顯示,大概思路如下 1 設定定時中斷,定時中斷時間是5毫秒 2 中斷程式完成秒計時,秒數發生變化時,要將秒數對應的顯示碼放到顯示緩衝區 3 每次中斷迴圈顯示一位數碼管 下面是我曾經寫的乙個顯示程式 顯示緩衝區g disp buf d...

51微控制器數字秒錶設計用4位數碼管分別顯示十秒,秒,百毫秒

include sbit axs p1 3 sbit bxs p1 2 sbit cxs p1 1 sbit dxs p1 0 數碼管位選埠 char table 10 數碼管顯示編碼 void ys char hs void xs int xm,int xs void time1 void int...