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...