標(biāo)題:
51單片機(jī)簡單計(jì)算器用數(shù)碼管顯示
[打印本頁]
作者:
liuda
時(shí)間:
2015-1-21 22:03
標(biāo)題:
51單片機(jī)簡單計(jì)算器用數(shù)碼管顯示
是用51hei單片機(jī)開發(fā)板 電路圖詳見:
http://www.torrancerestoration.com/f/51hei-5.pdf
的數(shù)碼管部分, 用2個(gè)74hc573 鎖存,p0口作為數(shù)據(jù)口 ,p3.6和p3.7分別是段和位的鎖存端口.
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^6;//573段選使能
sbit wela=P3^7;//573位選使能
sbit beep=P3^4;//蜂鳴器
uchar temp,key;//按鍵變量
uchar fun;//加,減,乘,除,標(biāo)志位
long int num1,num2,res;//num1與num2是2個(gè)要運(yùn)算的變量,res是結(jié)果
uchar aa,dis;//aa 2個(gè)運(yùn)算數(shù)標(biāo)志位 dis 2個(gè)運(yùn)算數(shù)與結(jié)果標(biāo)志
uchar code table[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數(shù)碼管段碼
uchar code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//數(shù)碼管位碼
void delay(unsigned char i)//延時(shí)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void bee()//蜂鳴器
{
beep=0;
delay(255);
delay(255);
beep=1;
}
key_scan()//按鍵檢測
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
void Init()//初始化
{
num1=0;
num2=0;
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table[1];
dula=0;
key=16;
aa=0;
dis=0;
res=0;
}
void dis_play(long int nm)//顯示函數(shù)
{
uchar a1,a6;//a1位段選變量,a6為位選變量
long int shu;
shu=nm;
if(shu==0)
{
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table[1];
dula=0;
}
else
{
for(a6=0;a6<6;a6++)
{
a1=shu%10;//shu%10 shu比10小a1=shu本身
if(shu!=0)
{
a1=a1+1;
}
shu=shu/10;//shu/10 shu比10小 shu為0
P0=table[a1];
dula=1;
dula=0;
P0=weixuan[a6];
wela=1;
wela=0;
delay(5);
}
}
}
void display()//顯示選擇函數(shù),dis 0或1顯示運(yùn)算數(shù),dis為2顯示結(jié)果
{
switch (dis)
{
case 0:{
dis_play(num1);
}
break;
case 1:{
dis_play(num2);
}
break;
case 2:{
dis_play(res);
}
break;
}
}
void shanshuo()//數(shù)碼管閃爍
{
wela=1;
P0=0xff;
wela=0;
delay(255);
}
void check()//運(yùn)算函數(shù)
{
if(key!=16)
{
bee();
if(key>=10)
{
switch (key)
{
case 10:Init();break; // CE
case 11:{
switch (fun)//加,減,乘,除選擇標(biāo)志位
{
case 0:res=num1+num2,dis=2;break;//加法
case 1:res=num1-num2,dis=2;break;//減法
case 2:res=num1*num2,dis=2;break;//乘法
case 3:res=num1/num2,dis=2;break;//除法
}
};break; // =
case 12:fun=0,aa=1,shanshuo();break; // +
case 13:fun=1,aa=1,shanshuo();break; // -
case 14:fun=2,aa=1,shanshuo();break; // *
case 15:fun=3,aa=1,shanshuo();break; // /
}
}
else
{
switch (aa)//運(yùn)算變量賦值標(biāo)志位
{
case 0:{
num1=num1*10+key;//把按鍵檢測到的值賦給num1運(yùn)算變量1
};break;
case 1:{
dis=1;
num2=num2*10+key;//把按鍵檢測到的值賦給num2運(yùn)算變量2
};break;
}
}
}
key=16;
}
void main()
{
Init();
while(1)
{
key_scan();
check();
display();
}
}
復(fù)制代碼
作者:
南天白云
時(shí)間:
2015-1-23 14:47
學(xué)習(xí)中
作者:
綠源學(xué)習(xí)者
時(shí)間:
2015-1-23 16:16
呵呵很好不過沒有仿真就不想用你的程序了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1