資源簡介
基于AT89C51單片機的簡易計算器的仿真和源碼,仿真是用Proteus軟件畫的,程序用keil軟件編寫的。
仿真可以實現(xiàn)100以內(nèi)的數(shù)字的連續(xù)加減乘除運算,超過100系統(tǒng)會報錯,并觸發(fā)蜂鳴器。
按鍵部分為16個按鍵,顯示部分為4個數(shù)碼管。

代碼片段和文件信息
#include?
#define?uchar?unsigned?char
sbit?speaker=P1^3;//蜂鳴器
sbit?ADDR0=P1^4;
sbit?ADDR1=P1^5;
sbit?ADDR2=P1^6;
sbit?ADDR3=P1^7;
sbit?KEY_IN_1=P2^4;
sbit?KEY_IN_2=P2^5;
sbit?KEY_IN_3=P2^6;
sbit?KEY_IN_4=P2^7;
sbit?KEY_OUT_1=P2^3;
sbit?KEY_OUT_2=P2^2;
sbit?KEY_OUT_3=P2^1;
sbit?KEY_OUT_4=P2^0;
uchar?code?LedChar[10]={0xc00xf90xa40xb00x990x920x820xf80x800x90};
uchar?code?LedChar2[10]={0x400x790x240x300x190x120x020x780x000x10};
uchar?LedBuff[4]={0xFF0xFF0xFF0xFF};
uchar?KeySta[4][4]={{1111}{1111}{1111}{1111}};//全部矩陣按鍵的當(dāng)前狀態(tài)
uchar?a[4]={0000};//按鍵數(shù)字記錄
uchar?sz=0;//數(shù)字
uchar?ysfh=0;//運算符號
uchar?gl=0;//歸零
uchar?dy=0;//等于
uchar?cs=0;//數(shù)字按下次數(shù)
uchar?SPEAKER=1;
void?display(uchar?n)//鍵號處理
{
?switch(n)
?{
?case?0:gl=1;break;//ce
?case?1:sz=0;break;//0
?case?2:dy=1;break;//=
?case?3:ysfh=1;break;//+
?case?4:sz=1;break;//1
?case?5:sz=2;break;//2
?case?6:sz=3;break;//3
?case?7:ysfh=2;break;//-
?case?8:sz=4;break;//4
?case?9:sz=5;break;//5
?case?10:sz=6;break;//6
?case?11:ysfh=3;break;//×
?case?12:sz=7;break;//7
?case?13:sz=8;break;//8
?case?14:sz=9;break;//9
?case?15:ysfh=4;break;//÷
?default:?break;
?}
}
void?main()//主函數(shù)
{
?uchar?k=0;
?uchar?ij;//鍵號確定變量
?uchar?b0=0b1=0b2=0;//按鍵數(shù)字備份,保存前一次的值
?uchar?jh;//鍵號
?long?x=0y=0z=0;
?uchar?xsd=0;//小數(shù)點
?uchar?backup[4][4]={{1111}{1111}{1111}{1111}};//按鍵值備份,保存前一次的值
?TMOD=0x01;//選用定時器的工作方式1
?TH0=(65536-9000)/256;//9ms定時,存入高8位
?TL0=(65536-9000)%256;//9ms定時,存入低8位
?TR0=1;//開始定時
?EA=1;//開總中斷
?ET0=1;//開T0中斷
?P0=LedChar[0];//默認(rèn)顯示?0
?while(1)
?{
??if(SPEAKER==0)
???speaker=!speaker;
??LedBuff[0]=LedChar[a[0]];
??LedBuff[1]=LedChar[a[1]];
??if(xsd==0)
???LedBuff[2]=LedChar[a[2]];
??else
??{
???LedBuff[2]=LedChar2[a[2]];
??}
??LedBuff[3]=LedChar[a[3]];
??switch(k)
??{
???case?0:ADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;k++;P0=LedBuff[0];break;//數(shù)碼管動態(tài)顯示第一位
???case?1:ADDR3=1;ADDR2=1;ADDR1=0;ADDR0=1;k++;P0=LedBuff[1];break;//數(shù)碼管動態(tài)顯示第二位
???case?2:ADDR3=1;ADDR2=0;ADDR1=1;ADDR0=1;k++;P0=LedBuff[2];break;//數(shù)碼管動態(tài)顯示第三位
???case?3:ADDR3=0;ADDR2=1;ADDR1=1;ADDR0=1;k=0;P0=LedBuff[3];break;//數(shù)碼管動態(tài)顯示第四位
???default:?break;
??}
??for(i=0;i<4;i++)//循環(huán)檢測?4*4?的矩陣按鍵
??{?
???for(j=0;j<4;j++)
???{
????if(backup[i][j]!=KeySta[i][j])//檢測按鍵動作
{
?????if(backup[i][j]!=0)//按鍵按下時執(zhí)行動作
?{?
??jh=i*4+j;
??display(jh);//對鍵號進(jìn)行處理
??if(jh==1?||?jh==4?||?jh==5?||?jh==6?||?jh==8?||?jh==9?||?jh==10?||?jh==12?||?jh==13?||?jh==14)//0~9
??{
???if(dy==1)
???{
??? dy=0;
a[0]=0;
????a[1]=0;
????a[2]=0;
????a[3]=0;
????b0=0;
????b1=0;
????b2=0;
????cs=0;
????ysfh=0;
????SPEAKER=1;
xsd=0;
???}
???cs++;
???b0=a[0];
???b1=a[1];
???b2=a[2];
???a[0]=sz;
???a[1]=b0;
???a[2]=b1;
???a[3]=b2;
??}
??if(cs>2)//溢出?數(shù)字必須小于100
??{
???if(cs==3)
???{
??? SPEAKER=0;
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
xsd=0;
???}
???if(cs==4)
???{
??? SPEAKER=1;
cs=1;
???}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6589??2016-06-22?21:19??計算器仿真\JSQ.c
?????文件?????122289??2016-06-22?21:19??計算器仿真\JSQ.DSN
?????文件???????7473??2016-06-22?21:14??計算器仿真\JSQ.hex
?????目錄??????????0??2019-04-12?11:04??計算器仿真
-----------?---------??----------?-----??----
???????????????136351????????????????????4
- 上一篇:超級模塊POST學(xué)習(xí)工具
- 下一篇:ELK安裝手冊
評論
共有 條評論