基于51单片机简易计算器LCD1602显示
生活随笔
收集整理的這篇文章主要介紹了
基于51单片机简易计算器LCD1602显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?????????protues中有KEYPAD-SMALLCALC直接就是4*4的矩陣:
???????????????????????????????????????
????????做完之后才發現了,當時不知道,自己畫了一個4*4的矩陣鍵盤
1.protues仿真圖
2.源程序
? ? ? ? 注釋我寫的很詳細
#include "reg52.h" typedef unsigned int uint; //定于無符號int typedef unsigned char uchar; //定義無符號char sbit rw=P2^5; sbit rs=P2^6; sbit e=P2^7; uint fuhao,flag,k,i,j,num; uchar disp[]=" ERROR!";//除數為0時,顯示 uchar wel[]=" Welcome!";//初始化時顯示 long a,b,c,x;void delay(long i) //延時 {while(i--); }void Delay1000ms() //@11.0592MHz STC-ISP軟件延時計算器生成延時一秒函數 {unsigned char i, j, k;i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i); }void lcdwrc(uint c) //設置LCD寫命令 {delay(1000);rs=0;rw=0;e=0;P0=c;e=1;delay(1000);e=0; }void lcdwrd(uint dat) //設置LCD寫數據 {delay(1000);rs=1;rw=0;e=0;P0=dat;e=1;delay(1000);e=0;rs=0; }void lcdinit() //初始化LCD {delay(1500);lcdwrc(0x38);delay(500);lcdwrc(0x38);delay(500);lcdwrc(0x38);delay(500);lcdwrc(0x38); //功能設定指令lcdwrc(0x08); //lcdwrc(0x01); //清屏lcdwrc(0x06); //設置LCD顯示lcdwrc(0x0c); //顯示開關控制指令num=0;fuhao=0;flag=0;a=0;b=0;c=0;x=0;k=0;j=0; }void KeyDown() //按鍵函數 {k=0; P1=0x0f; //后列前行 列都為高電平1,行都為低電平0 if(P1!=0x0f)//有按鍵被按下 {delay(1000);if(P1!=0x0f)//延時再次判斷,軟件消抖 {P1=0x0f;//列都為高電平1,行都為低電平0switch(P1){case 0x07: //0000 0111 第一列有按鍵被按下 {P1=0xf0;//列都為低電平0,行都為高電平1 switch(P1)//判斷哪一行的按鍵被按下 {case 0x70: num = 1;k=7;break; //0111 0000第一列第一行 case 0xb0: num = 5;k=4;break; //1011 0000第一列第二行 case 0xd0: num = 9;k=1;break; //1101 0000第一列第三行 case 0xe0: num = 13;break; //1110 0000第一列第四行 } if(num!=13)//被按下的按鍵不是清零鍵 {if(fuhao==0)//fuhao==0,表示第一個數a,fuhao==1,表示第二個數b a=a*10+k;elseb=b*10+k;}lcdwrd(0x30+k);//顯示按下的數,0x3y:顯示y if(num==13)//按下的按鍵是清零鍵{ lcdwrc(0x01); //清屏指令 lcdinit();//重新初始化LCD1602 } }while(P1!=0xf0);break;//當有按鍵被按下時,結束此次判斷,進行下一次判斷 case 0x0b: //0000 1011 第二列有按鍵被按下 {P1=0xf0;//列都為低電平0,行都為高電平1switch(P1)//判斷哪一行有按鍵被按下 {case 0x70: k=8;break;//第二列第一行 case 0xb0: k=5;break;//第二列第二行 case 0xd0: k=2;break;//第二列第三行 case 0xe0: k=0;break;//第二列第四行 } if(fuhao==0)a=a*10+k;elseb=b*10+k; lcdwrd(0x30+k); }while(P1!=0xf0);break;case 0x0d: //0000 1101 第三列有按鍵被按下 {P1=0xf0;switch(P1){case 0x70: num=3;k=9;break;//第三列第一行 case 0xb0: num=7;k=6;break;//第三列第二行 case 0xd0: num=11;k=3;break;//第三列第三行 case 0xe0: num=15;break;//第三列第四行 } if(num!=15){ if(fuhao==0)a=a*10+k;elseb=b*10+k; lcdwrd(0x30+k);}if(num==15)//按下的鍵為=鍵 {switch(flag)//判斷進行哪種運算 {case 1://+{c=a+b;//計算結果 lcdwrc(0x4f+0x80);//光標置于第二行末尾 lcdwrc(0x04);//設置顯示方式:顯示后指針減一 if(c==0)//若結果為0 lcdwrd(0x30);//顯示0 while(c!=0){lcdwrd(0x30+c%10);//從最后一位開始顯示 c=c/10; }lcdwrd(0x3d);//顯示= }break;case 2://-{if(a>b)c=a-b;elsec=b-a;//計算兩數相減的絕對值 lcdwrc(0x4f+0x80);//將光標置于第二行末尾 lcdwrc(0x04);//設置顯示方式:顯示后指針減一 if(c==0)//若結果為零 lcdwrd(0x30);//顯示0 while(c!=0) {lcdwrd(0x30+c%10);//從最后一位開始顯示c=c/10;}if(a<b)//若結果為負數 lcdwrd(0x2d);//ROM字符庫-lcdwrd(0x3d);//顯示= }break;case 3://*{c=a*b; //計算結果 lcdwrc(0x4f+0x80);//光標置于第二行末尾 lcdwrc(0x04);//顯示設置:顯示后指針減一 if(c==0)//若結果為0 lcdwrd(0x30);//顯示0 while(c!=0) { lcdwrd(0x30+c%10); //從最后一位開始顯示c=c/10; }lcdwrd(0x3d); //顯示= } break;case 4: //÷ { if(b==0)//若除數為0 { lcdwrc(0x01);//清屏 for(j=0;j<11;j++){lcdwrd(disp[j]);//顯示語句:ERROR! }delay(5000);//延時 lcdwrc(0x01);//初始化LCD1602delay(5000);}else{ //將結果放大10000倍 c=(long)(((float)a/b)*10000);//例36/6=6.0000 60000x=c;lcdwrc(0x4f+0x80);//光標第二行最后lcdwrc(0x04);//I/D==0while(c!=0) //一位一位顯示{k++;lcdwrd(0x30+c%10);//顯示結果的最后一位在0x4f的位置 //0 00 000 0000c=c/10;//取前面的結果數據if(x>0&&x<=9){if(k==1)//只有小數點后最后一位{ lcdwrd(0x30);//0lcdwrd(0x30);//0lcdwrd(0x30);//0 lcdwrd(0x2e);//.k=0;}}if(x>9&&x<=99){ if(k==2)//只有小數點后最后兩位{ lcdwrd(0x30);//0lcdwrd(0x30);//0lcdwrd(0x2e);//.k=0;}}if(x>99&&x<=999){if(k==3)//只有小數點后最后三位{lcdwrd(0x30);//0lcdwrd(0x2e);//.k=0;} }else if(k==4)//小數點后四位都有{lcdwrd(0x2e);//.k=0;} }if(x<10000)lcdwrd(0x30);//若結果小于1,在各位補充0 lcdwrd(0x3d);//顯示= } } break;}}}while(P1!=0xf0);break;case 0x0e: //0000 1110{ fuhao=1; //有符號鍵被按下 P1=0xf0; //1111 0000switch(P1){case 0x70:/*0111 0000*/flag=4;lcdwrd(0xfd);break;//除號第四列第一行 case 0xb0:/*1011 0000*/flag=3;lcdwrd(0x2a);break;//* 第四列第二行 case 0xd0:/*1101 0000*/flag=2;lcdwrd(0x2d);break;//- 第四列第三行 case 0xe0:/*1110 0000*/flag=1;lcdwrd(0x2b);break;//+ 第四列第四行 } } while(P1!=0xf0);break;}}} }void main() { uint x;lcdinit();//LCD1602初始化 for(x=0;x<12;x++)lcdwrd(wel[x]);//顯示歡迎語句:Welcome Delay1000ms();//STC-ISP軟件延時計算器1s延時函數 lcdwrc(0x01);//LCd1602清屏 while(1) KeyDown();//按鍵判斷函數 }總結
以上是生活随笔為你收集整理的基于51单片机简易计算器LCD1602显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css background 充满自适应
- 下一篇: 1-2docker-基本的使用