久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機制作的多位連續四則運算的計算器 Proteus仿真程序
[打印本頁]
作者:
qingrao
時間:
2019-12-23 21:23
標題:
51單片機制作的多位連續四則運算的計算器 Proteus仿真程序
基于單片機制作的多位連續四則運算的計算器
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
#include<reg52.h>//52單片機頭文件
#include<math.h>//要用到數學計算公式,所以調用
#include <intrins.h>//移位
#define key P2 //定義矩陣鍵盤的I/O口
#define GPIO_LCD P0//定義LCD1602 數據/命令的輸入端
unsigned char number[20];//用來儲存我們所按鍵按下去的字符和數字
unsigned char add=0;//是否按過+號
unsigned char subtract=0;//是否按過-號
unsigned char ride=0;//是否按過*號
unsigned char divide=0;//是否按過/號
unsigned char eliminate=0;//是否按過清除鍵
unsigned char minus=0;//是否計算的數據需要添加負號
unsigned char decimals=0;//是否計算的數據需要小數點
unsigned char equal=0;//是否按下等號鍵
sbit LCD_RS =P3^4;//定義LCD的模式選擇,1為寫數據,0為寫命令
sbit LCD_RW =P3^5;//定義LCD功能 1是讀,0是寫
sbit LCD_E =P3^6;//定義LCD使能端
unsigned long a=0,b=0;//用于儲存我們所要運算的數據
unsigned char i;//定義一個全局變量
unsigned char LCD_Wait(void)//判忙函數
{
LCD_RS=0;
LCD_RW=1;
_nop_();
LCD_E=1;
_nop_();
LCD_E=0;
return GPIO_LCD;
}
void delay(void) //延時函數
{
unsigned char x,z;
for(z=19;z>0;z--)
for(x=130;x>0;x--);
}
void LCD_Write_Com(unsigned char com)//LCD1602寫命令函數
{
LCD_RS =0;
LCD_RW =0;
GPIO_LCD=com;
delay() ;
LCD_E=1;
delay() ;
LCD_E=0;
delay() ;
}
void LCD_Write_Date( unsigned char input)//LCD1602寫數據函數
{
LCD_RS=1;
LCD_RW=0; ;
LCD_E=0;
_nop_();
GPIO_LCD =input;
_nop_();
LCD_E=1;
_nop_();
LCD_E=0;
_nop_();
LCD_Wait();
}
void LCD_Initial()//LCD1602初始化函數
{
delay();
LCD_Write_Com (0x38);
delay() ;
LCD_Write_Com (0x38);
delay() ;
LCD_Write_Com (0x08);
delay() ;
LCD_Write_Com (0x0c);
delay() ;
LCD_Write_Com (0x06);
delay() ;
LCD_Write_Com (0x01);
delay() ;
}
以上函數是LCD1602的模塊化函數庫,如果看不懂,需要先學習一下LCD1602.如果懶得學的話,可以直接用這個函數庫,前提是上面定義的變量要整體一一對應,各個端口的引腳也要和你的實際端口一一對應
unsigned long calculate()//計算數據模塊
{
unsigned long value=0;
if(add)//如果我們按鍵按下了加號,那么在計算時進入這個加運算
{
value=a+b;
}
if(subtract) //如果我們按鍵按下了減號,那么在計算時進入這個減運算
{
if(a>=b)
value=a-b;
else
{
value=b-a;
minus=1;//說明后面的數大于前面的額數,將其標志為一,在輸出結果是,可以利用它判斷是否輸出負號
}
}
if(ride)//乘法運算
{
value=a*b;
}
if(divide)//除法運算
{
value=(unsigned long)(((float)a/b)*1000);//因為此計算器是,保留小數點后三位,所以,兩數相除,1/2=0.5,那么通過這個,可以讓其先等于200,方便我們后續的結果處理
decimals=1;//標示結果已經<0,最后結果要出現小數點,
}
return value;//返回計算的結果
}
void result()
{
unsigned char f=0;//標志結果需要保留什么數
unsigned long value;
if(equal==1)
{
value=calculate();//將上面計算算出來的值賦值給這個函數中的value
LCD_Write_Com (0x40);//寫LCD1602的命令,使得結果數據顯示在第二排
delay();
LCD_Write_Com (0xcf); //從第二排最后一個位置依次向左寫數據
delay();
LCD_Write_Com (0x04);//光標從第二排最后一個數據向左移動
delay();
do
{
LCD_Write_Date(0x30+value%10);//0x30是LCD字符庫中數字0的代號,例如我們想寫入 2這個結果,根據前面計算函數,計算函數已經將2變成2000,所以這里是讓其變回來從后往前依次寫數據到LCD1602上,
delay();
f++;//value的位數如果計算結果是0.2,則通過計算函數變成200,那么這時的f就會被加到3,
if(decimals&&f==3)//接上如果f被加到三
LCD_Write_Date(0x2e);//就在LCD1602上顯示小數點
delay();
value/=10;//如果經過計算函數后是2000,則經過一次這個 value減少一位(減少的哪一位的數據已經寫入LCD1602中了)
delay();
}
while(value);//當value 被用盡后跳出循環
if(decimals&&f<=3)//decimals是標志是否進行的是除法運算
{
if(f==3)
{
LCD_Write_Date(0x30);//如果是三,因為前面程序已經在對應位置加了小數點了,這時我們住需要再在前面加一個0就可以了,如果沒有這條語句,0.5 的顯示就是.5
}
else
{
while(3-f)//當f<3時進入這程序
{LCD_Write_Date(0x30);
f++;
}
LCD_Write_Date(0x2e);//寫小數點
delay();
LCD_Write_Date(0x30);//寫數據0
}
}
if(minus)//如果有負號標志
LCD_Write_Date(0x2d);//在LCD1602上顯示負號
add=0;
subtract=0;
ride=0;
divide=0;
equal=0;
decimals=0;
minus=0;
eliminate=0;
}
}
void main()
{
int j,k=0,g;
i=0;
LCD_Initial();//初始化LCD1602
j=0;
while(1)
{
P2=0xfe;//掃描第一行是否有按鍵按下
while((P2&0xf0)!= 0xf0)
{
delay(); //延時消抖
while((P2&0xf0)!=0xf0) //確認按下
{
switch(key) //鎖定按的是哪一個鍵
{
case 0xee: number[i]= 7; i++;k=1;break;//k=1表明按下的是數字鍵
case 0xde: number[i]=8;i++;k=1; break;
case 0xbe: number[i] =9; i++;k=1;break;
case 0x7e: number[i]= '/';divide++;i++;break;//計算對應的表示功能鍵的變量按鍵次數
default: number[i] = '#';
}
while((P2& 0xf0) != 0xf0) ;//掃描第二行
}
}
P2= 0xfd;
while((P2&0xf0) != 0xf0)
{
delay();
while((P2& 0xf0) != 0xf0)
{
switch(key)
{
case 0xed: number[i]= 4;i++;k=1; break;
case 0xdd: number[i] = 5; i++;k=1;break;
case 0xbd: number[i] = 6;i++;k=1; break;
case 0x7d: number[i] = '*';ride++;i++;break;
default: number[i] = '#';
}
while((P2&0xf0)!= 0xf0)
;
}
}
P2= 0xfb;//掃描第三行
while((P2& 0xf0) != 0xf0)
{
delay();
while((P2& 0xf0) != 0xf0)
{
switch(key)
{
case 0xeb: number[i] =1; i++;k=1;break;
case 0xdb: number[i]= 2; i++;k=1;break;
case 0xbb: number[i] = 3; i++;k=1;break;
case 0x7b: number[i]= '-';subtract++;i++;break;
default: number[i] = '#';
}
while((P2&0xf0)!= 0xf0);
}
}
P2= 0xf7;//掃描第四行
while((P2&0xf0)!=0xf0)
{
delay();
while((P2&0xf0)!=0xf0)
{
switch(P2)
{
case 0xe7: number[i]= 'eliminate=1;i++; break;
case 0xd7: number[i]=0;i++;k=1; break;
case 0xb7: number[i]= '=';i++;equal++;break;
case 0x77: number[i]= '+';add++;i++;break;
default: number[i] = '#';
}
while((P2&0xf0)!= 0xf0);
}
}
if(k==1)//如果有數字鍵按下,進入此程序
{
if(add+subtract+ride+divide==1)//如果有第一個加減乘除鍵被按下則進入負號符號鍵后面的數據存儲,如1+2 這里的b存 的是2
{
b=b*10+number[i-1];
g=calculate();
}
if(add+subtract+ride+divide==2)//如果2+2+1,這里面的a=2+2, b=1,因為g村存儲了前面只有一個加號時的value
{
a=g;
b=0;
b=b*10+number[i-1];
}
if(add+subtract+ride+divide==3)//如2+2+2+3,這里的a=2+2+2,b=3,同理往下
{
a=g;
b=0;
b=b*10+number[i-1];
}
if(add+subtract+ride+divide==4)
{
a=g;
b=0;
b=b*10+number[i-1];
}
if(add+subtract+ride+divide==0)
{
a=a*10+number[i-1];
}
g=calculate();
k=0;
}
LCD_Write_Com (0x80); //將要輸入的數據放在首行
delay();
for(j=0;j<i;j++)
{
if(number[j]=='+'||number[j]=='||number[j]=='-'||number[j]=='*'||number[j]=='/'||number[j]=='=')
LCD_Write_Date( number[j]);//寫符號位
else
LCD_Write_Date( number[j]+0x30);//寫數據位
delay();
}
if(eliminate==1)//一旦按下清除鍵,LCD1602內數據會自動清零,可以反復輸入
{
LCD_Initial();
eliminate=0;
i=0;
a=0;
b=0;
}
result(); //調用結果函數
}
}
復制代碼
51hei.png
(7.29 KB, 下載次數: 73)
下載附件
2019-12-24 13:05 上傳
全部資料51hei下載地址:
簡易計算器.rar
(375.26 KB, 下載次數: 125)
2019-12-23 21:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ykxdsy
時間:
2019-12-31 13:06
能不能實現連乘啊
作者:
2667498081
時間:
2021-6-4 08:58
里面能進行小數的運算嗎
作者:
時空來客
時間:
2021-7-10 08:40
計算的都是錯的,你還直接超過來了?臥槽
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲人人舔人人
|
久久午夜精品
|
久久草在线视频
|
久久麻豆精品
|
成人午夜电影网
|
久久久夜
|
亚洲黄色国产
|
91视在线国内在线播放酒店
|
久久久久国产成人精品亚洲午夜
|
日韩成人精品视频
|
日韩精品一区二区在线观看
|
精品国产免费一区二区三区演员表
|
国产精品永久免费观看
|
天天干天天操天天看
|
在线视频一区二区
|
99久9
|
国产欧美一区二区三区另类精品
|
色av一区二区三区
|
欧美精品一区在线
|
一区二区亚洲
|
一级片免费观看
|
97精品国产97久久久久久免费
|
欧美精品中文字幕久久二区
|
精品国产一区一区二区三亚瑟
|
欧美性一区二区三区
|
欧美一区二区三区在线观看
|
午夜极品
|
日韩精品一区二区三区中文在线
|
国产精品1
|
一级毛片免费完整视频
|
国产羞羞视频在线观看
|
日韩播放
|
国产成人91视频
|
欧美午夜一区
|
91精品久久久久久综合五月天
|
国产成人在线一区
|
成人在线观看免费
|
99免费精品视频
|
在线观看欧美一区
|
中国一级毛片免费
|
国产成人短视频在线观看
|