51单片机控制lcd1602实现计算器

合集下载

基于51单片机的简易计算器

基于51单片机的简易计算器

基于51单片机的简易计算器51单片机是一种广泛应用于嵌入式系统中的常用微控制器。

我们可以利用51单片机的强大功能和丰富的外设资源,设计一个简易计算器。

这个计算器可以进行基本的加减乘除运算,并且具备显示结果的功能。

首先,我们需要准备一块51单片机开发板,一块1602液晶显示屏模块,以及一些按键开关和电阻。

我们可以将运算器主要分为以下几个模块:数码管显示模块、键盘输入模块、运算模块和存储模块。

数码管显示模块:我们使用1602液晶显示屏模块来显示计算器的结果。

我们可以通过51单片机的IO口,将计算结果发送给液晶显示屏模块,实现结果的显示。

键盘输入模块:我们可以使用几个按键开关来实现数字和运算符的输入。

通过对按键的检测,我们可以将用户输入的数字和运算符转化为字符形式,并保存到内存中。

运算模块:我们需要根据用户输入的数字和运算符,进行相应的运算。

我们可以使用栈来实现这个功能。

栈是一种常用的数据结构,具有"先进后出"的特点。

我们可以将用户输入的数字和运算符按照一定的规则入栈,然后按照相应的顺序进行出栈和运算。

最后将结果保存到内存中。

存储模块:我们可以使用内部RAM来保存运算结果。

51单片机的内部RAM具有一定的存储能力,可以满足我们的基本需求。

在编写程序时,我们可以使用汇编语言或者C语言。

通过合理的编程,我们可以实现计算器的各项功能。

总结一下,基于51单片机的简易计算器主要包括数码管显示模块、键盘输入模块、运算模块和存储模块。

我们可以通过合理的编程,将这些模块相互配合,实现一个功能完善的计算器。

这个计算器不仅可以进行基本的加减乘除运算,还可以显示结果,方便用户进行计算。

51单片机的1602计算器

51单片机的1602计算器

■KT :<IPD D ■皿 PO i.闻]I冲扭©PtgAMF*TZ)W PTCJM PII ■阀 P2.^AJO RJi !Ail]4MI ±pj.Wij? P2島泊M R2.?i !AI5Film PLIOTB *1 2 P1JP3.MTI阳SOPJ.BffiKOw ,V■ ' u .-r7■E !■L9S回回mH □ □□X :]XI ...• TFT • •御題1 灯⑷ESQT 1FOU/AD] PD.VMJA M.IMIU PD.1.'AEI 科■«呦其 =u r.>rcF5ER ALE 峦P2 血ue P2.1.IA1 P22W DPJ3?A llP2.4/A 12 卩WIN PlJO/Aj4 PZ.T^O PHjoirao 申1/W PSl-IiTIT** 1 at 1•£ •i.i/ner ai T - ■ I 4n fft ri .w RJ■耳 直!■B38 :■1 ■:4« ■ 1!■ :Mt}?■■掘if?$■竺. ill .蜚-.MWLCO1IntitL3254+9656225=?85947?<U 回回冃刁⑤回 c0HBD#in clude<at89x52.h>#define uchar un sig ned char #define uint un sig ned int #define ulong un sig ned long #define rs P3_5 // #define e P3_4 // #define rw P2 7 //指令寄存器或数据寄存器的选择 读写操作的使能信号 读写操作的选择#defi ne BF 0X80 // 忙检测标志位uchar code tab1[]={'c',0,'=','+',1,2,3,'-',4,5,6,'*',7,8,9,7'}; //数据uchar code key[]={0xef,0xdf,0xbf,0x7f};〃voiddelay(ui nt z) // 延时1ms 子程序{ui nt x,y;for(x=z;x>0;x--)for(y=115;y>0;y--);}*************************************************1602夜晶显示器***************************************************/uchar busy() //1602 忙碌检测{rs=0;rw=1;e=1;delay(1);while(P0&BF);e=0;return P0;}void wdat(uchar dat) // 数据在1602 显示{P0=dat;busy();rs=1;rw=0;delay(5);e=1;delay(5);e=0;}void wcmd(uchar cmd,uchar BFC) // 写命令或写数据输出到1602的地址{PO=cmd; 键盘的对应的uchar nu mber; // bit flag0=0; // bit flag 1=0; // bit flag2=0; // bit flag3=0; // bit flag4=0; // bit fuhao=0; // bit poi nt=0; //按键输入键盘号“=”号按键标志“ +”号按键标志“-”号按键标志“ * ”号按键标志"/ ”号按键标志正负号标志小数点标志ulong a=0,b=0;〃第一个整数存入a,第二个数整数存入行扫描按键检测/**if(BFC) busy();rs=0;rw=0;delay(5);e=1;delay(5);e=0;}void ini t() 〃1602 初始化{e=0;wcmd(0x38,0);wcmd(0x38,0);wcmd(0x38,0);wcmd(0x38,1);wcmd(0x08,1);wcmd(0x01,1);wcmd(0x06,1);wcmd(0x0c,1);}/******************************************4*4键盘,并得到按键值******************************************/void ankey() // 取4*4键盘输入代表键值number{uchar i,j,temp;for(i=0;i<4;i++){P1=key[i];temp=P1;temp=temp<<4|0x0f;for(j=0;j<4;j++){if(key[j]==temp){nu mber=i*4+j;〃按键对应的键号switch( number)// 对按键作相应的处理{case0:{wcmd(0x01,1);flag0=0;flag1=0;flag2=0;flag3=0;flag4=0;fuhao=0;poi nt=0;}break; // 清零按键case 2:flag0=1;break; // “ =” 号按键case 3:{flag1=1;wdat(0x2b);}break; // case 7:{flag2=1;wdat(0x2d);}break; // case 11:{flag3=1;wdat(0x2a);}break; // case 15:{flag4=1;wdat(0x2f);}break; // case 4: case 5: case 6: case 8: case 9: case 10: case 12: case 13: case 14:case 1:if(flag2||flag3||flag4||flag1)//b=b*10+tab1[ nu mber];wdat(0x30+tab1[ nu mber]);// 显示所按的键对应的值} else {if(flag0) {flag0=0; wcmd(OxO1,1);wdat(0x30+tab1[ nu mber]); //显示所按的键对应} else {a=a*10+tab1[ nu mber]; wdat(0x30+tab1[ nu mber]);// }}break;default:break; }}while(key[i]!=P1) //按键是否松开,若否,则在 4*4键盘对应那个键的行列为低电平 P1=key[i];“+”号按键 “-”号按键 “* ”号按键 “/”号按键不是符号键时,按键对应的数值放入入第二个数中//第一个数中,是时,放的值的值显示所按的键对应}}void keysure()〃延时消除按键抖动{P仁OxOf;if((P1 &0x0f)!=0x0f){delay(10);if((P1 &0x0f)!=0x0f)an key();}}/***************************************计算器的运算公式及结果输出***************************************/ulo ng flagOO(){计算结果变量是否按了“ =”,若是,则执行运算法则else{value=b-a;fuhao=1; // 结果是负数的标志位}if(flag3==1)value=a*b; if(flag4==1) // { //乘法运算除法运算value=(ulo ng)(((float)a/b)*1000);poi nt=1;}return value;}void result() // { 结果显示ulong value; // if(flag0==1) // {if(flag 仁=1)value=a+b; if(flag2==1) { // //if(a>=b)value=a-b; //加法运算减法运算判断减数的大小uchar i=0;ulong value;value=flagOO();if(flagO==1){wcmd(0x04,1);〃设置从后住前写数据,每写完一个数据,光标后退一格wcmd(0xcf,0); // 光标至第二行最后一个显示处do{wdat(0x30+value%10);〃显示数值i++;if(point&&i==3) // 取3 位小数wdat(0x2e); // 显示小数点value/=10;delay(10);}while(value); // 计算结果输出if(poi nt&&i<3){while(3-i){wdat(0x30);i++;}wdat(0x2e);wdat(0x30);}if(fuhao)wdat(0x2d); // 显示负号wdat(0x3d);flag仁flag2=flag3=flag4=0; // 全部清零a=0;b=0;}}void mai n(){ini t();while(1){keysure();result();}}。

51单片机44矩阵和1602屏幕的计算器代码

51单片机44矩阵和1602屏幕的计算器代码

while(P0!=0xf0)
keyscan();
//获得键码
if(count<30)
{
time++;
count=0;
}
else
//超过 1.5 秒计数 2 次
{
time+=2;
count=0;
}
wcmd(0xC6);
//设置键值显示位置
wdat(key_val[16‐key]);
51 单片机 4*4 矩阵和 1602 屏幕的计算器代码 一、要求:
液晶显示器第一行显示“Hello World!”;
第二行显示键值和按键次数,且按键时间大于 1.5 秒时,识别为 2 次按键。
单片机型号:STC‐‐12C5A16AD
二、程序代码:
#include <reg52.h>
#include <intrins.h>
U4_595(0x00); U3_595(cmd); U4_595(0x40); U4_595(0x00); } //写要显示的数据到 LCD void wdat(unsigned char dat) { U4_595(0x10);
U3_595(dat); U4_595(0x50); U4_595(0x10); } //初始化 LCD void init() { wcmd(0x38);//设置 8 位总线双行显示,5*7 点阵 delay(20); wcmd(0x0C);//开显示,开光标,不闪烁 delay(20); wcmd(0x06);//读写字符时地址加 1 delay(20); wcmd(0x01);//清屏 delay(20); wcmd(0x80+2); for(x=0;x<12;x++) //第一行显示 hello world! wdat(dis[x]); delay(20); wcmd(0xC2); for(x=0;x<4;x++)//第二行显示按键和次数 wdat(dis1[x]);

51单片机的1602计算器

51单片机的1602计算器

51单片机的1602计算器一、51 单片机和 1602 液晶显示屏简介51 单片机是指英特尔公司生产的 8051 系列单片机,它具有丰富的资源,包括 I/O 端口、定时器、中断等。

通过编程,可以让 51 单片机完成各种复杂的任务。

1602 液晶显示屏是一种字符型液晶显示模块,它能够显示两行,每行 16 个字符。

1602 液晶显示屏的控制方式相对简单,通过发送特定的指令和数据,就可以实现字符的显示。

二、硬件设计要实现 51 单片机的 1602 计算器,首先需要进行硬件设计。

硬件部分主要包括 51 单片机最小系统、1602 液晶显示屏、按键等。

51 单片机最小系统通常包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路则保证单片机能够正常启动。

1602 液晶显示屏与51 单片机的连接需要用到一些数据线和控制线。

数据线用于传输要显示的数据,控制线用于控制显示屏的工作状态。

按键用于输入数字和运算符,常见的按键有数字键 0 9 、运算符+、、、/以及等于号=等。

三、软件编程软件编程是实现 51 单片机 1602 计算器的关键。

在编程过程中,需要实现以下几个主要功能:1、初始化 1602 液晶显示屏在程序开始时,需要对 1602 液晶显示屏进行初始化,设置显示模式、光标显示等。

2、按键扫描通过不断扫描按键状态,获取用户输入的数字和运算符。

3、数据处理根据用户输入的数字和运算符,进行相应的计算,并将结果存储起来。

4、显示结果将计算结果显示在 1602 液晶显示屏上。

```cinclude <reg52h> //包含 51 单片机的头文件//定义 1602 液晶显示屏的控制引脚sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;//定义 1602 液晶显示屏的数据引脚sbit D0 = P0^0;sbit D1 = P0^1;sbit D2 = P0^2;sbit D3 = P0^3;sbit D4 = P0^4;sbit D5 = P0^5;sbit D6 = P0^6;sbit D7 = P0^7;//定义按键引脚sbit key0 = P1^0;sbit key1 = P1^1;sbit key2 = P1^2;sbit key3 = P1^3;sbit key4 = P1^4;sbit key5 = P1^5;sbit key6 = P1^6;sbit key7 = P1^7;sbit key8 = P3^0;sbit key9 = P3^1;sbit key_add = P3^2;sbit key_sub = P3^3;sbit key_mul = P3^4;sbit key_div = P3^5;sbit key_eq = P3^6;//定义变量unsigned char num1, num2, op, result;unsigned char flag = 0; //标志位,用于判断输入状态//写指令函数void write_command(unsigned char command){RS = 0;RW = 0;EN = 0;P0 = command;EN = 1;EN = 0;}//写数据函数void write_data(unsigned char data){RS = 1;RW = 0;EN = 0;P0 = data;EN = 1;EN = 0;}//初始化 1602 液晶显示屏函数void init_1602(){write_command(0x38);// 8 位数据,2 行显示,5x7 点阵write_command(0x0c);//显示开,光标关,闪烁关write_command(0x06);//字符右移,地址指针加 1 write_command(0x01);//清屏}//按键扫描函数void key_scan(){if (key0 == 0){delay_ms(10);//消抖if (key0 == 0){if (flag == 0){num1 = num1 10 + 0;write_data('0');}else{num2 = num2 10 + 0;write_data('0');}}while (!key0);//等待按键松开}//其他按键扫描类似}//计算函数void calculate(){switch (op){case '+':result = num1 + num2;break;case '':result = num1 num2;break;case '':result = num1 num2;break;case '/':if (num2!= 0)result = num1 / num2;elsewrite_data('E');//除数为 0 ,显示错误break;}}//主函数void main(){init_1602();while (1){key_scan();if (key_add == 0 || key_sub == 0 || key_mul == 0 ||key_div == 0){delay_ms(10);//消抖if (key_add == 0){op ='+';flag = 1;write_data('+');}//其他运算符处理类似}if (key_eq == 0){delay_ms(10);//消抖if (key_eq == 0){calculate();write_data(result);num1 = 0;num2 = 0;flag = 0;}}}}```上述代码只是一个简单的示例,实际应用中还需要进行更多的优化和完善,比如处理输入错误、添加更多的功能等。

基于51单片机1602液晶显示简易计算器设计..

基于51单片机1602液晶显示简易计算器设计..

#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned char#define PI 3.141592sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit led=P2^4;sbit speek=P3^7;uchar table0[]={"Welcome to use"};uchar table1[]={"made by Ms. Li"};uchar table2[]={"error"};uchar count;void main(void){uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标记、小数点标记以及小数点个数负号标记、负号个数uchar Sin,Cos,Tan,ln;uchar Key_num,last_key_num; //键号uchar flag=0,equal_flag;double num1=0,num2=0,num=0,result=0,save_result; //运算符、等于符//第一个数、第二个数、计算结果uchar first_num=0,Ans=0,second_num=0; InitLcd();EA=1;ET0=1;TMOD=0X01;TH0=(65536-500)/256;TL0=(65536-500)%256;write_com(0x80+0x40+15);write_Dat('0');write_com(0x80);while(1){while(key_scan()==0xff);TR0=1;if(first==0){first=1;write_com(0x01);}Key_num=key_scan();switch(key_scan()){case 1:if(last_key_num!=Key_num){write_Dat('l');write_Dat('n');ln=1;}break;case 2:if(last_key_num!=Key_num){write_Dat('s');write_Dat('i');write_Dat('n');Sin=1;}break;case 3:if(last_key_num!=Key_num){write_Dat('c');write_Dat('o');write_Dat('s');Cos=1;}break;case 4:if(last_key_num!=Key_num){write_Dat('t');write_Dat('a');write_Dat('n');Tan=1;}break;case 5:if(last_key_num!=Key_num){write_Dat('^');flag=5;}break;case 6:write_Dat('7');num=7;break; case 7:write_Dat('8');num=8;break; case 8:write_Dat('9');num=9;break; case 9:if(last_key_num!=Key_num){write_Dat('+');flag=1;}break;case 10:if(last_key_num!=Key_num){write_Dat('T');flag=6;}break;case 11:write_Dat('4');num=4;break; case 12:write_Dat('5');num=5;break; case 13:write_Dat('6');num=6;break; case 14:if(last_key_num!=Key_num){write_Dat('-');flag=2;}break;case 15:if(last_key_num!=Key_num){if(equal_flag==1){write_com(0x01);write_com(0x80);write_Dat('A');write_Dat('n');write_Dat('s');write_Dat('=');save_result=result;}else{if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=22&&Key_num!=23 &&Key_num!=25){write_Dat('A');write_Dat('n');write_Dat('s');if(flag==0){num1=save_result;first_num=1;}else{num2=save_result;second_num=1;}}}}break;case 16:write_Dat('1');num=1;break;case 17:write_Dat('2');num=2;break;case 18:write_Dat('3');num=3;break;case 19:if(last_key_num!=Key_num){write_Dat('*');flag=3;}break;case 21:write_Dat('0');num=0;break;case 22:if(last_key_num!=Key_num){if(flag==0){minus1++;if(minus1==1){write_Dat('-');}}else{minus2++;if(minus2==1){write_Dat('-');}}} break;case 23:if(last_key_num!=Key_num){if(flag==0){dot1++;if(dot1==1){write_Dat('.');}}else{dot2++;if(dot2==1){write_Dat('.');}}} break;case 24:if(last_key_num!=Key_num){write_Dat('/');flag=4;}break;case 25:if(last_key_num!=Key_num){write_Dat('=');equal_flag=1;}break;}if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=15&&Key_num!=22 &&Key_num!=23&&Key_num!=25)// 第一个数{if(flag==0){num1=num1*10+num;num=0;if(dot1!=0){dot1_num++;}first_num=1;}if(flag!=0){num2=num2*10+num;num=0;if(dot2!=0){dot2_num++;}second_num=1;}}if(equal_flag==1&&first_num==1){if(dot1!=0){num1=num1/pow(10,dot1_num);dot1=0;}if(dot2!=0){num2=num2/pow(10,dot2_num);dot2=0;}if(minus1!=0){num1=num1*(-1);}if(minus2!=0){num2=num2*(-1);}if(second_num!=0){switch(flag){case 1:result=num1+num2;break;case 2:result=num1-num2;break;case 3:result=num1*num2;break;case 4:if(num2!=0){result=num1/num2;}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;} break;case 5: result=pow(num1,num2);break;case 6: result=pow(num1,1/num2);break;}}else if(second_num==0&&Sin==0&&Cos==0&&Tan==0&&ln==0) result=num1;else if(second_num==0&&(Sin==1||Cos==1||Tan==1||ln==1)) {if(Sin==1)result=sin(num1/180*PI)+0.005;if(Cos==1)result=cos(num1/180*PI)+0.005;if(Tan==1)result=tan(num1/180*PI)+0.005;if(ln==1){if(num1>0)result=log(num1)+0.005;else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;}}}if(error!=1)display(result);}// 清零if(Key_num==20){num1=num2=result=0;flag=equal_flag=0;error=0;first=0;dot1_num=dot2_num=0;minus1=0;minus2=0;first_num=0,second_num=0;Sin=Cos=Tan=ln=0;write_com(0x01);write_com(0x80+0x40+15);write_Dat('0');}last_key_num=Key_num;while(key_scan()!=0xff);}}void time0() interrupt 1{TH0=(65536-600)/256;TL0=(65536-600)%256;count++;speek=!speek;if(count>50){TR0=0;count=0;}}void delay(uint x){uchar y;while(x--)for(y=0;y<120;y++);}void write_com(unsigned char c) {RS=0;RW=0;EN=1;delay(5);P0=c;EN=0;}void write_Dat(unsigned char c) {RS=1;RW=0;EN=1;delay(5);P0=c;EN=0;}void InitLcd(){write_com(0x38); //display modewrite_com(0x06); // write_com(0x0c); // write_com(0x01); // } 显示光标挪动地点显示开及光标设置显示清屏uchar key_scan(){uchar key_num=0xff;uint temp;P3=0x03;P1=0xe0;temp=(P3<<8)|P1;if((temp&0x03e0)!=0x03e0){delay(10);if((temp&0x03e0)!=0x03e0){// 第一行P3=0x03;P1=0xfe;temp=(P3<<8)|P1;switch(temp){case 0x03de:key_num=1; break;case 0x03be:key_num=2; break;case 0x037e:key_num=3; break;case 0x02fe:key_num=4; break;case 0x01fe:key_num=5; break;}//第二行P3=0x03;P1=0xfd;temp=(P3<<8)|P1;switch(temp){case 0x03dd:key_num=6; break;case 0x03bd:key_num=7; break;case 0x037d:key_num=8; break;case 0x02fd:key_num=9; break;case 0x01fd:key_num=10; break;}//第三行P3=0x03;P1=0xfb;temp=(P3<<8)|P1;switch(temp){case 0x03db:key_num=11; break;case 0x03bb:key_num=12; break;case 0x037b:key_num=13; break;case 0x02fb:key_num=14; break;case 0x01fb:key_num=15; break;}//第四行P3=0x03;P1=0xf7;temp=(P3<<8)|P1;switch(temp){case 0x03d7:key_num=16; break;case 0x03b7:key_num=17; break;case 0x0377:key_num=18; break;case 0x02f7:key_num=19; break;case 0x01f7:key_num=20; break;}P3=0x03;//第五行P1=0xef;temp=(P3<<8)|P1;switch(temp){case 0x03cf:key_num=21; break;case 0x03af:key_num=22; break;case 0x036f:key_num=23; break;case 0x02ef:key_num=24; break;case 0x01ef:key_num=25; break;}}}return key_num;}void display(double Data){uchar xs=0,fs=0,i;if(Data<0){fs=1;Data=Data*(-1);}if(Data>(long)Data){xs=1;}if(Data<10)//0~9{if(xs==1){Data=Data*100;write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+14);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data+'0');}}else if(Data<100)//10~99{if(xs==1){Data=Data*100;write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+13);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000)//100~999 {if(xs==1){Data=Data*100;write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+12);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<10000)//1000~9999 {if(xs==1){Data=Data*100;write_com(0x80+0x40+8);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<100000)//10000~99999 {if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000000+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000000) //100000~999999{if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000000+'0');write_Dat((long)Data/1000000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');}else if(xs==0){write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}}}。

基于51单片机1602液晶显示简易计算器设计

基于51单片机1602液晶显示简易计算器设计

#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned char#define PI 3.141592sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit led=P2^4;sbit speek=P3^7;uchar table0[]={"Welcome to use"};uchar table1[]={"made by Ms. Li"};uchar table2[]={"error"};uchar count;void main(void){uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标志、小数点标志以及小数点个数负号标志、负号个数uchar Sin,Cos,Tan,ln;uchar Key_num,last_key_num; //键号uchar flag=0,equal_flag; //运算符、等于符double num1=0,num2=0,num=0,result=0,save_result; //第一个数、第二个数、计算结果uchar first_num=0,Ans=0,second_num=0;InitLcd();EA=1;ET0=1;TMOD=0X01;TH0=(65536-500)/256;TL0=(65536-500)%256;write_com(0x80+0x40+15);write_Dat('0');write_com(0x80);while(1){while(key_scan()==0xff);TR0=1;if(first==0){first=1;write_com(0x01);}Key_num=key_scan();switch(key_scan()){case 1:if(last_key_num!=Key_num){write_Dat('l');write_Dat('n');ln=1;}break;case 2:if(last_key_num!=Key_num){write_Dat('s');write_Dat('i');write_Dat('n');Sin=1;}break;case 3:if(last_key_num!=Key_num){write_Dat('c');write_Dat('o');write_Dat('s');Cos=1;}break;case 4:if(last_key_num!=Key_num){write_Dat('t');write_Dat('a');write_Dat('n');Tan=1;}break;case 5:if(last_key_num!=Key_num){write_Dat('^');flag=5;}break;case 6:write_Dat('7');num=7;break;case 7:write_Dat('8');num=8;break;case 8:write_Dat('9');num=9;break;case 9:if(last_key_num!=Key_num){write_Dat('+');flag=1;}break;case 10:if(last_key_num!=Key_num){write_Dat('T');flag=6;}break;case 11:write_Dat('4');num=4;break;case 12:write_Dat('5');num=5;break;case 13:write_Dat('6');num=6;break;case 14:if(last_key_num!=Key_num){write_Dat('-');flag=2;}break;case 15:if(last_key_num!=Key_num){if(equal_flag==1){write_com(0x01);write_com(0x80);write_Dat('A');write_Dat('n');write_Dat('s');write_Dat('=');save_result=result;}else{if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=22&&Key_num!=23 &&Key_num!=25){write_Dat('A');write_Dat('n');write_Dat('s');if(flag==0){num1=save_result;first_num=1;}else{num2=save_result;second_num=1;}}}}break;case 16:write_Dat('1');num=1;break;case 17:write_Dat('2');num=2;break;case 18:write_Dat('3');num=3;break;case 19:if(last_key_num!=Key_num){write_Dat('*');flag=3;}break;case 21:write_Dat('0');num=0;break;case 22:if(last_key_num!=Key_num){if(flag==0){minus1++;if(minus1==1){write_Dat('-');}}else{minus2++;if(minus2==1){write_Dat('-');}}} break;case 23:if(last_key_num!=Key_num){if(flag==0){dot1++;if(dot1==1){write_Dat('.');}}else{dot2++;if(dot2==1){write_Dat('.');}}} break;case 24:if(last_key_num!=Key_num){write_Dat('/');flag=4;}break;case 25:if(last_key_num!=Key_num){write_Dat('=');equal_flag=1;}break;}if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=15&&Key_num!=22 &&Key_num!=23&&Key_num!=25) //第一个数{if(flag==0){num1=num1*10+num;num=0;if(dot1!=0){dot1_num++;}first_num=1;}if(flag!=0){num2=num2*10+num;num=0;if(dot2!=0){dot2_num++;}second_num=1;}}if(equal_flag==1&&first_num==1){if(dot1!=0){num1=num1/pow(10,dot1_num);dot1=0;}if(dot2!=0){num2=num2/pow(10,dot2_num);dot2=0;}if(minus1!=0){num1=num1*(-1);}if(minus2!=0){num2=num2*(-1);}if(second_num!=0){switch(flag){case 1:result=num1+num2;break;case 2:result=num1-num2;break;case 3:result=num1*num2;break;case 4:if(num2!=0){result=num1/num2;}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;} break;case 5: result=pow(num1,num2);break;case 6: result=pow(num1,1/num2);break;}}else if(second_num==0&&Sin==0&&Cos==0&&Tan==0&&ln==0) result=num1;else if(second_num==0&&(Sin==1||Cos==1||Tan==1||ln==1)) {if(Sin==1)result=sin(num1/180*PI)+0.005;if(Cos==1)result=cos(num1/180*PI)+0.005;if(Tan==1)result=tan(num1/180*PI)+0.005;if(ln==1){if(num1>0)result=log(num1)+0.005;else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;}}}if(error!=1)display(result);}if(Key_num==20) //清零{num1=num2=result=0;flag=equal_flag=0;error=0;first=0;dot1_num=dot2_num=0;minus1=0;minus2=0;first_num=0,second_num=0;Sin=Cos=Tan=ln=0;write_com(0x01);write_com(0x80+0x40+15);write_Dat('0');}last_key_num=Key_num;while(key_scan()!=0xff);}}void time0() interrupt 1{TH0=(65536-600)/256;TL0=(65536-600)%256;count++;speek=!speek;if(count>50){TR0=0;count=0;}}void delay(uint x){uchar y;while(x--)for(y=0;y<120;y++);}void write_com(unsigned char c){RS=0;RW=0;EN=1;delay(5);P0=c;EN=0;}void write_Dat(unsigned char c){RS=1;RW=0;EN=1;delay(5);P0=c;EN=0;}void InitLcd(){write_com(0x38); //display modewrite_com(0x06); //显示光标移动位置write_com(0x0c); //显示开及光标设置write_com(0x01); //显示清屏}uchar key_scan(){uchar key_num=0xff;uint temp;P3=0x03;P1=0xe0;temp=(P3<<8)|P1;if((temp&0x03e0)!=0x03e0){delay(10);if((temp&0x03e0)!=0x03e0){P3=0x03; //第一行P1=0xfe;temp=(P3<<8)|P1;switch(temp){case 0x03de:key_num=1; break;case 0x03be:key_num=2; break;case 0x037e:key_num=3; break;case 0x02fe:key_num=4; break;case 0x01fe:key_num=5; break;}P3=0x03; //第二行P1=0xfd;temp=(P3<<8)|P1;switch(temp){case 0x03dd:key_num=6; break;case 0x03bd:key_num=7; break;case 0x037d:key_num=8; break;case 0x02fd:key_num=9; break;case 0x01fd:key_num=10; break;}P3=0x03; //第三行P1=0xfb;temp=(P3<<8)|P1;switch(temp){case 0x03db:key_num=11; break;case 0x03bb:key_num=12; break;case 0x037b:key_num=13; break;case 0x02fb:key_num=14; break;case 0x01fb:key_num=15; break;}P3=0x03; //第四行P1=0xf7;temp=(P3<<8)|P1;switch(temp){case 0x03d7:key_num=16; break;case 0x03b7:key_num=17; break;case 0x0377:key_num=18; break;case 0x02f7:key_num=19; break;case 0x01f7:key_num=20; break;}P3=0x03; //第五行P1=0xef;temp=(P3<<8)|P1;switch(temp){case 0x03cf:key_num=21; break;case 0x03af:key_num=22; break;case 0x036f:key_num=23; break;case 0x02ef:key_num=24; break;case 0x01ef:key_num=25; break;}}}return key_num;}void display(double Data){uchar xs=0,fs=0,i;if(Data<0){fs=1;Data=Data*(-1);}if(Data>(long)Data){xs=1;}if(Data<10) //0~9{if(xs==1){Data=Data*100;write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+14);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data+'0');}}else if(Data<100) //10~99{if(xs==1){Data=Data*100;write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+13);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000) //100~999{if(xs==1){Data=Data*100;write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+12);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<10000) //1000~9999{if(xs==1){Data=Data*100;write_com(0x80+0x40+8);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<100000) //10000~99999{if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000000+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000000) //100000~999999{if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/+'0');write_Dat((long)Data/1000000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');}else if(xs==0){write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}}}。

STC51单片机开发板计算器LCD1602显示浮点计算设计报告

STC51单片机开发板计算器LCD1602显示浮点计算设计报告

嵌入式系统原理及应用课程设计报告姓名:学号:指导老师:目录引言 (3)第一章硬件介绍 (4)1.1单片机介绍 (4)1.2 设计所用开发板的介绍 (5)1.3 LCD1602的原理及其应用 (7)1.3.1开发板硬件连接关系 (7)1.3.2液晶屏LCD1602的功能及应用 (8)1.3.31602LCD的指令说明及时序 (9)1.3.4 1602LCD的RAM地址映射及标准字库表 (11)1.4开发板矩阵键盘原理及应用 (12)第二章设计思路、仿真及调试 (15)2.1 设计方法 (15)2.2 硬件简介 (15)2.3 软件设计 (15)2.3.1 矩阵键盘 (15)2.3.2 LCD1602 (22)第三章设计结果 (24)第四章设计总结 (27)附录 (28)引言目前单片机渗透到我们生活的各个领域.几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置.飞机上各种仪表的控制.计算机的网络通讯与数据传输.工业自动化过程的实时控制和数据处理.广泛使用的各种智能IC卡.民用豪华轿车的安全保障系统.录像机、摄像机、全自动洗衣机的控制.以及程控玩具、电子宠物等等.这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械了。

因此.单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域.大致可分如下几个范畴:(1)在智能仪器仪表上的应用(2)在工业控制中的应用(3)在家用电器中的应用(4)在计算机网络和通信领域中的应用(5)单片机在医用设备领域中的应用(6)在各种大型电器中的模块化应用(7)单片机在汽车设备领域中的应用此外.单片机在工商.金融.科研、教育.国防航空航天等领域都有着十分广泛的用途。

随着智能化的逐步提高.单片机在我们生活中得到了越来越广泛的应用.其是一种集成在电路芯片.是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

51单片机计算器1602显示程序

51单片机计算器1602显示程序
{
delay_jsq(5);
if(P2!=0xfb)
{
if(P2!=0xfb)
{
temp=P2&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
case 0x70:num=7;
break;
}
}
while(P2!=0xfd);
if(j!=0)
{
write_lcd1602(0x01,0);
delay(1);
j=0;
}
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(flag1==0)//没有按过符号键
break;
}
}
}
}
void main()
{
ini_lcd1602();
while(1)
{
keyscan_4_4();
}
}
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag1=0; //flag1表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号

基于单片机的lcd1602的多功能计算器

基于单片机的lcd1602的多功能计算器

单片机原理与应用技术课程设计基于51单片机的多功能计算器院系:机电工程学院专业(班级):电子信息工程1班姓名:学号: 20134081006指导教师:邵海龙职称:讲师完成日期:2015 年9月22日评定成绩:关键词:单片机;液晶显示;计算器;目录引言 (3)1 单片机及其应用……………………………………………………………………...3.1.1单片机介绍 (3)1.2单片机的应用 (4)1.3 STC89C52单片机 (4)2 液晶屏LCD1602原理及应用 (5)2.1液晶屏LCD1602介绍及工作原理 (5)2.2 液晶屏LCD1602的功能及应用 (5)3 设计思路、仿真及调试 (7)3.1设计方法 (7)3.2硬件设计............................................................................... . (7)3.2.1复位电路 (7)3.2.2 液晶屏LCD1602显示电路 (8)3.2.3 4*4键盘的设计 (9)3.2.5 多功能计算器的总电路 (10)3.3软件设计 (10)3.4软件仿真 (17)3.5硬件调试 (18)4 结束语.............................................................. .. (18)谢辞 (18)参考文献 (19)1 单片机及其应用1.1单片机介绍单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能1.2单片机的应用STC89C52 是STC公司推出的一款超强抗干扰,加密性强,在线可编程,高速,低功耗CMOS 8位单片机。

片内含 8k bytes 的可反复擦写Flash只读程序存储器和256 bytes 的随机数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash 存储单元,功能强大的STC89C52单片机适合于许多较为复杂控制应用场合。

51单片机双显示计算器

51单片机双显示计算器

自己制作的单片机程序,既可以用数码管显示,也可以用1602显示#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charuchar code tabledu[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };uchar code tablewe[4]={4,5,6,7};uchar table[]="0123456789";unsigned char dispbuf[4]={0,0,0,0};uchar aa,temp,key,keypos,flag,fuhao,a0,b0,c0,d0,e0;long num1,num2,num3;sbit RS=P2^5;sbit RW=P2^6;sbit E=P2^7;sbit key1=P3^4;void keyscan1();void ukeyscan1();void delay(uint z){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void change(uchar *p,uchar count){count=4-count;while(count<3){*(p+count)=*(p+count+1);count++;}}longjisuan(intx,chary,int z){long m;if(y==10)m=x+z;if(y==11)m=x-z;if(y==12)m=x*z;if(y==13)m=x/z;return m;}bit Busy(void){bitbusy_flag = 0;RS = 0;RW = 1;E = 1;delay(1);busy_flag = (bit)(P0 & 0x80);E = 0;returnbusy_flag;}voidwcmd(uchar del){while(Busy());RS=0;RW=0;E=0;P0=del;delay(1);E=1;delay(1);E=0;}voidwdata(uchar del){while(Busy());RS=1;RW=0;E=0;P0=del;delay(1);E=1;delay(1);E=0;}voidkeyscan(){P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){break;case 0xde:key=2;break;case 0xbe:key=3;break;case 0x7e:key=4;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if ((key>=0)&&(key<11)){keypos++;if(keypos<=4){change(dispbuf,keypos);dispbuf[3]=key;}}}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=5;break;case 0xdd:key=6;break;case 0xbd:key=7;break;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if ((key>=0)&&(key<11)){keypos++;if(keypos<=4){change(dispbuf,keypos);dispbuf[3]=key;}}}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=9;break;case 0xdb:key=0;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if ((key>=0)&&(key<10)){keypos++;if(keypos<=4){change(dispbuf,keypos);dispbuf[3]=key;}}if ((key>9)&&(key<14)){fuhao=key;num1=1000*dispbuf[0]+100*dispbuf[1]+10*dispbuf[2]+dispbuf[3];dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;keypos=0;while(1){keyscan1();if(key==15)break;}}if(key==15){dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(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;}if ((key>9)&&(key<14)){fuhao=key;num1=1000*dispbuf[0]+100*dispbuf[1]+10*dispbuf[2]+dispbuf[3];dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;keypos=0;while(1){keyscan1();if(key==15)break;}}if(key==15){dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;}}}if(keypos==4)keypos=0;}void keyscan1(){P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){switch(temp){case 0xee:key=1;break;case 0xde:key=2;break;case 0xbe:key=3;break;case 0x7e:key=4;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if ((key>=0)&&(key<11)){keypos++;if(keypos<=4){change(dispbuf,keypos);dispbuf[3]=key;}}}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=5;break;case 0xdd:key=6;case 0xbd:key=7;break;case 0x7d:key=8;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if ((key>=0)&&(key<11)){keypos++;if(keypos<=4){change(dispbuf,keypos);dispbuf[3]=key;}}}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=9;break;case 0xdb:key=0;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if ((key>=0)&&(key<10)){keypos++;if(keypos<=4){change(dispbuf,keypos);dispbuf[3]=key;}}if ((key>9)&&(key<14)){num1=num3;fuhao=key;dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;keypos=0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(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;}if ((key>9)&&(key<14)){num1=num3;fuhao=key;dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;keypos=0;}if (key==14){num2=1000*dispbuf[0]+100*dispbuf[1]+10*dispbuf[2]+dispbuf[3];num3=jisuan(num1,fuhao,num2);dispbuf[0]=num3/1000;dispbuf[1]=num3%1000/100;dispbuf[2]=num3%1000%100/10;dispbuf[3]=num3%1000%100%10;}}}if(keypos==4)keypos=0;}voidukeyscan(){P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xee:key=1;break;case 0xde:key=2;break;case 0xbe:key=3;break;case 0x7e:key=4;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}wdata(table[key]);num1=num1*10+key;}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=5;break;case 0xdd:key=6;break;case 0xbd:key=7;break;case 0x7d:key=8;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}wdata(table[key]);num1=num1*10+key;}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=9;break;case 0xdb:key=0;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if(key==0||key==9){wdata(table[key]);num1=num1*10+key;}if ((key>9)&&(key<14)){fuhao=key;if(key==10)key=0x2B;else if(key==11)key=0x2d;else if(key==12)key=0x2a;else if(key==13)key=0x2f;wdata(key);while(1){ukeyscan1();if(key==15)break;}}if(key==15){wcmd(0x01);wcmd(0x0e);num1=0;num2=0;num3=0;fuhao=0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(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;}if ((key>9)&&(key<14)){fuhao=key;if(key==10)key=0x2B;else if(key==11)key=0x2d;else if(key==12)key=0x2a;else if(key==13)key=0x2f;wdata(key);while(1){ukeyscan1();if(key==15)break;}}if(key==15){wcmd(0x01);wcmd(0x0e);num1=0;num2=0;num3=0;fuhao=0;}}}}void ukeyscan1(){P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xee:key=1;break;case 0xde:key=2;break;case 0xbe:key=3;break;case 0x7e:key=4;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}wdata(table[key]);num2=num2*10+key;}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=5;break;case 0xdd:key=6;break;case 0xbd:key=7;break;case 0x7d:key=8;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}wdata(table[key]);num2=num2*10+key;}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=9;break;case 0xdb:key=0;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}if(key==0||key==9){wdata(table[key]);num2=num2*10+key;}if ((key>9)&&(key<14)){wcmd(0x0e);wdata(0x01);num1=num3;fuhao=key;if(key==10)key=0x2B;else if(key==11)key=0x2d;else if(key==12)key=0x2a;else if(key==13)key=0x2f;if(a0!=0)wdata(table[a0]);if(b0!=0)wdata(table[b0]);else {if(a0!=0)wdata(table[b0]);}if(c0!=0)wdata(table[c0]);else {if((a0!=0)||(b0!=0))wdata(table[c0]);}if(d0!=0)wdata(table[d0]);else {if((a0!=0)||(b0!=0)||(c0!=0))wdata(table[d0]);}wdata(table[e0]);num2=0;wdata(key);}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(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;}if ((key>9)&&(key<14)){wcmd(0x01);wcmd(0x80);wcmd(0x0e);num1=num3;fuhao=key;if(key==10)key=0x2B;else if(key==11)key=0x2d;else if(key==12)key=0x2a;else if(key==13)key=0x2f;if(a0!=0)wdata(table[a0]);if(b0!=0)wdata(table[b0]);else {if(a0!=0)wdata(table[b0]);}if(c0!=0)wdata(table[c0]);else {if((a0!=0)||(b0!=0))wdata(table[c0]);}if(d0!=0)wdata(table[d0]);else {if((a0!=0)||(b0!=0)||(c0!=0))wdata(table[d0]);}wdata(table[e0]);num2=0;wdata(key);}if (key==14){wdata(0x3d);num3=jisuan(num1,fuhao,num2);wcmd(0x80+0x40);a0=num3/10000;b0=num3%10000/1000;c0=num3%10000%1000/100;d0=num3%10000%1000%100/10;e0=num3%10000%1000%100%10;if(a0!=0)wdata(table[a0]);if(b0!=0)wdata(table[b0]);else {if(a0!=0)wdata(table[b0]);}if(c0!=0)wdata(table[c0]);else {if((a0!=0)||(b0!=0))wdata(table[c0]);}if(d0!=0)wdata(table[d0]);else {if((a0!=0)||(b0!=0)||(c0!=0))wdata(table[d0]);}wdata(table[e0]);wcmd(0x80);wcmd(0x0c);}}}}voidinit(){TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;EA=1;ET0=1;TR0=1;wcmd(0x38);wcmd(0x0e);wcmd(0x06);wcmd(0x01);wcmd(0x80);}{init();while(1){if(key1==0){delay(5);if(key1==0){while(key1==0);flag=1-flag;num1=0;num2=0;fuhao=0;aa=0;a0=0;b0=0;c0=0;d0=0;e0=0;dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;keypos=0;wcmd(0x01);if(flag==1){TR0=0;wcmd(0x38);wcmd(0x0e);wcmd(0x06);wcmd(0x01);wcmd(0x80);}else TR0=1;}}if(flag==0){keyscan();}else{ukeyscan();}}}void timer() interrupt 1{TH0=(65536-2000)/256;TL0=(65536-2000)%256;P0=tabledu[dispbuf[aa]];P2=tablewe[aa];aa++;{aa=0;}}。

51单片机实现LCD1602显示定时计数器(自己整理的)

51单片机实现LCD1602显示定时计数器(自己整理的)

每隔一分钟,蜂鸣器响一次,按键按一下,计数器清0。

从新开始、#include<>#include<>#define uchar unsigned char#define uint unsigned intsbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};uchar code p[]="-";//code 可以不加,加了之后就是固定了这个数组不能对其进行操作、、这个一定要注意。

uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;void delay_ms(int x)//延时程序,延时1ms{uint i;while(x--)for(i=0;i<120;i++);}uchar busy()//对LCD1602进行判断是否为忙{uchar status;RS=0;RW=1;EN=1;delay_ms(1);status=P1;EN=0;return status;}void write_cmd(uchar cmd)//写命令程序,首先对其进行判忙{while((busy()&0x80)==0x80);//对返回进行判断,如果为忙就进行等待RS=0;RW=0;EN=0;P1=cmd;EN=1;delay_ms(1);EN=0;}void write_data(uchar dat){while((busy()&0x80)==0x80);RS=1;RW=0;EN=0;P1=dat;EN=1;delay_ms(1);EN=0;}void canshu(){write_cmd(0x38);delay_ms(1);write_cmd(0x01);delay_ms(1);write_cmd(0x06);delay_ms(1);write_cmd(0x0c);delay_ms(1);}/*void xianshi(uchar x,uchar y,uchar *str){uint i=0;if(y==0)write_cmd(0x80|x);if(y==1)write_cmd(0xc0|x);for(i=0;i<16;i++){write_data(str[i]);if(p=='\0')break;}} */void aaa() interrupt 1{TH0=(65535-50000)/256;TL0=(65535-50000)%256;if(++kk==18){miao++;if(miao==10){if(miao1++==5){if(fen++==10){if(fen1++==5){if(shi++==10){if(shi1++==1){shi1=0;shi=0;}shi=0;}fen1=0;}fen=0;}miao1=0;}miao=0;}kk=0;}}void main(){canshu();//xianshi(0,0,p);//xianshi(0,1,p+16);EA=1;ET0=1;TMOD=0x01;TH0=(65535-50000)/256;//如果不准可对其进行修改,比如4000可能更准确TL0=(65535-50000)%256;TR0=1;while(1){write_cmd(0x80|1);write_data(dis2[shi]);write_cmd(0x80|2);write_data(dis2[shi1]);write_cmd(0x80|3);write_data(p[0]);write_cmd(0x80|4);write_data(dis2[fen1]);write_cmd(0x80|5);write_data(dis2[fen]);write_cmd(0x80|6);write_data(p[0]);write_cmd(0x80|7);write_data(dis2[miao]);write_cmd(0x80|8);write_data(dis2[miao1]);}}。

51单片机控制lcd1602实现计算器

51单片机控制lcd1602实现计算器

//利用51单片机控制LCD1602,实现加减乘除运算#include<>#define uint unsigned int#define uchar unsigned char#define DATE_IO P0//P0口并行传输数据(LCD1602的数据端接P0口)sbit RS=P1^0;//LCD1602寄存器选择端sbit E=P1^2; //使能信号端sbit RW=P1^1;//读写控制端sbit deng=P1^3;//结果sbit shuzi11=P3^2;//前面的数字加1(因为我的按键是与P3口相连的)sbit shuzi22=P3^7; //后面的数字加1sbit jia=P3^3;//加号sbit jian=P3^4;//减号sbit cheng=P3^5;//乘号sbit chu=P3^6;//除号uint countqian=0,counthou=0;//数值uchar qian,bai,shi,ge,a=0;uchar code table1[]="09";uchar code table2[]="+-*/";//**********************延时函数***************************************** void delay_us(unsigned int n){if(n==0)return ;while(--n);}void delay_ms(uint i){unsigned char a,b;for (a=1;a<i;a++)for(b=1;b;b++);}void delay(uint z){uint x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}//***********************************************************************//*********************控制LCD1602的函数*******************************void write_command(uchar come)//写指令函数{RS=0;//选择指令寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=come;delay_us(5);E=0;RS=1;}void write_date(uchar date)//写数据函数{RS=1;//选择数据寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=date;delay_us(5);E=0;RS=0;}//***************************************************************************** ***//**************************液晶初始化函数(基本上就是这个模式)*******************void init()//液晶初始化函数{RW=0;//低电平时进行写操作(高电平时进行读操作)E=0;write_command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输 delay_ms(5);write_command(0x01);//清除屏幕显示delay_ms(5);write_command(0x06);//设定输入方式,增量不移位delay_ms(5);write_command(0x0c);//开整体显示,关光标,不闪烁delay_ms(5);}//***************************************************************************** *****void jiayiqian()//前边数字加1计数函数{if(shuzi11==0)//如果前面加1的按键按下 {delay(50);//消除抖动countqian=countqian+1;}if(countqian==999)//记到999归0countqian=0;}void jiayihou()//后边数字加1计数函数{if(shuzi22==0)//如果后面加1的按键按下 {delay(50);//消除抖动counthou=counthou+1;}if(counthou==999)//记到999归0counthou=0;}void fuhao()//+,-,*,/运算号{if(jia==0)//如果加号按下{while(!jia);//等待按键的释放write_date(table2[0]);//显示'+' a=1;//加号按下的标志}if(jian==0)//如果减号按下{while(!jian);//等待按键的释放write_date(table2[1]);//显示'-' a=2;//减号按下的标志}if(cheng==0)//如果乘号按下{while(!cheng);//等待按键的释放write_date(table2[2]);//显示'*'a=3; //乘号按下的标志}if(chu==0)////如果除号按下{while(!chu);//等待按键的释放write_date(table2[3]);//显示'/'a=4;//除号按下的标志}}void chaiqian()//将前边各位数字拆开函数{bai=countqian/100;//求百位数字shi=countqian%100/10;//求十位数字ge=countqian%10;//求各位数字}void chaihou()//将后边各位数字拆开函数{bai=counthou/100;//求百位数字shi=counthou%100/10;//求十位数字ge=counthou%10;//求各位数字}void chaijiejia()//将相加结果各位数字拆开函数{qian=(countqian+counthou)/1000;//求千位数字bai=(countqian+counthou)%1000/100;//求百位数字shi=(countqian+counthou)%100/10;//求十位数字ge=(countqian+counthou)%10;//求各位数字}void chaijiejian()//将相减结果各位数字拆开函数{qian=(countqian-counthou)/1000;//求千位数字bai=(countqian-counthou)%1000/100;//求百位数字shi=(countqian-counthou)%100/10;//求十位数字ge=(countqian-counthou)%10;//求各位数字}void chaijiecheng()//将相乘结果各位数字拆开函数{qian=(countqian*counthou)/1000;//求千位数字bai=(countqian*counthou)%1000/100;//求百位数字shi=(countqian*counthou)%100/10;//求十位数字ge=(countqian*counthou)%10;//求各位数字}void chaijiechu()//将相除结果各位数字拆开函数(只取了模值){qian=(countqian/counthou)/1000;//求千位数字bai=(countqian/counthou)%1000/100;//求百位数字shi=(countqian/counthou)%100/10;//求十位数字ge=(countqian/counthou)%10;//求各位数字}void xianshiqian()//显示前边数字{write_command(0x80);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]); //第二位显示十位write_date(table1[ge]); //第三位显示个位fuhao();//显示运算号delay(50);//改变数值可以修改数字滚动的速度}void xianshihou()//显示后边数字{write_command(0x80+4);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]); //第二位显示十位write_date(table1[ge]); //第三位显示个位//delay(50);//改变数值可以修改数字滚动的速度}void xianshijie()//显示结果{write_command(0xc0);//设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[qian]);//第一位显示千位write_date(table1[bai]);//第二位显示百位write_date(table1[shi]); //第三位显示十位write_date(table1[ge]); //第四位显示个位//delay(50);//改变数值可以修改数字滚动的速度}void main()//主函数{init();//调用液晶初始化函数while(1){jiayiqian();//调用前边数字加1计数函数chaiqian();//调用将前边数字各位数字拆开函数 xianshiqian();//显示前边数字jiayihou();//调用后边数字加1计数函数chaihou();//调用将后边数字各位数字拆开函数 xianshihou();//显示后边数字if(deng==0)//控制显示结果的按键按下{if(a==1)//计算的是加法{chaijiejia();//将结果的各位数字拆分开xianshijie(); //显示结果}if(a==2)//计算的是减法{chaijiejian(); //将结果的各位数字拆分开xianshijie();//显示结果}if(a==3)//计算的是乘法{chaijiecheng();//将结果的各位数字拆分开xianshijie(); //显示结果}if(a==4) //计算的是除法{chaijiechu();//将结果的各位数字拆分开xianshijie(); //显示结果}}}}。

新基于51单片机的简易计算器

新基于51单片机的简易计算器

新基于51单片机的简易计算器一、引言计算器是一种广泛应用的电子设备,用于进行常见的数值运算。

在现代社会,计算器是广大人们日常生活和学习中常用的工具之一、本文将介绍一种新基于51单片机的简易计算器的设计和实现,该计算器具有计算基本四则运算的功能,并且操作简便、界面友好。

二、设计实现1.系统硬件设计该计算器的硬件主要由51单片机、LCD显示屏、按键开关、电源等组成。

(1)51单片机:使用51系列单片机作为计算器的核心处理器,它具有处理能力强、易编程等特点,可以快速实现计算功能。

(2)LCD显示屏:采用16*2字符LCD显示屏,用于显示计算结果和用户输入的数字。

(3)按键开关:设置数字键盘开关、运算符键盘开关、等号键开关等,用户通过按下对应的按键输入数字和运算符。

(4)电源:使用直流电源供电,通过稳压电路和滤波电路提供稳定的电压和电流。

2.系统软件设计该计算器的软件主要由嵌入式C语言编写,实现了计算基本四则运算的功能。

(1)初始化:在系统启动时对各个设备进行初始化设置,包括LCD显示屏的初始化、按键开关的初始化等。

(2)用户输入:通过按键开关读取用户输入的数字和运算符,将其保存在缓冲区中。

(3)计算功能:根据用户输入的数字和运算符,通过判断运算符的类型进行相应的数值计算,并将结果保存在特定的寄存器中。

(4)结果显示:将计算结果从寄存器中读取并显示在LCD显示屏上,用户可以直观地看到计算结果。

三、系统特点1.硬件结构简单:该计算器的硬件结构简单,主要由几个常见元件组成,易于制作和调试。

2.操作简便:用户只需通过按键输入数字和运算符,即可完成计算操作,无需进行复杂的设置和调试。

3.界面友好:通过LCD显示屏直观地显示计算结果,用户可以清楚地了解计算过程和结果。

4.功能强大:该计算器可以进行基本的四则运算,满足大多数日常计算需求。

四、应用范围该简易计算器可以广泛应用于日常生活和学习中,包括商品购物计算、数学运算、财务统计等场景。

基于51单片机的lcd1602液晶显示的计算器

基于51单片机的lcd1602液晶显示的计算器

基于51单片机的lcd 1602液晶显示的计算器/**************************************************************** 阿斌独家制作:计算器,1602液晶显示可计算10以下数加减乘除可连续运算,最大显示结果数值65536*****************************************************************/ 键盘设置:液晶初始显示:运算显示:主程序:#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit lcden=P2^2;sbit lcdrw=P2^1;sbit lcdrs=P2^0;uchar num,temp,jia=0,jian=0,cheng=0,chu=0,qing=0;uint key,key1,shu;uchar fuhao,flag1,flag=0; uchar table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x0}; void delay(uint z) {uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }bit lcd_bz(){bit result;lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);lcden=0;return result; }void write_com(uchar com){while(lcd_bz());lcdrs=0;lcden=0;lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0; }void write_date(uchar date) {while(lcd_bz());lcdrs=1;lcden=0;lcdrw=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void lcd_init() {lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01); }void keyscan() {P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //加号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //减号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break; case 0x7b:num=3;break; //乘号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key=0;num=0;break; case 0xd7:num=6;break; //清除case 0xb7:num=5;break; //等于号case 0x77:num=4;break; //除号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}void display0(uint shu) { uint ge;ge=shu;write_date(0x30+ge); } void display1(uint shu) { uint shi,ge;shi=shu/10;ge=shu%10;write_date(0x30+shi); write_date(0x30+ge); } void display2(uint shu) { uint bai,shi,ge;bai=shu/100;shi=shu%100/10;ge=shu%10;write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); } void display3(uint shu) {uint qian,bai,shi,ge;qian=shu/1000;bai=shu%1000/100;shi=shu%100/10;ge=shu%10;write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge); }void display4(uint shu) {uint wan,qian,bai,shi,ge;wan=shu/10000;qian=shu%10000/1000;bai=shu%1000/100;shi=shu%100/10;ge=shu%10;write_date(0x30+wan);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge); }void display_key1(uint result) {if(flag1==1){write_com(0x01);flag1=0;}shu=result;write_com(0x80);if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000) display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result);}void dis_key(result){if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000)display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result);}void display_key(uint result) { if(shu<10){write_com(0x80+2);dis_key(result);}if(shu>=10&&shu<100){write_com(0x80+3);dis_key(result);}if(shu>=100&&shu<1000){write_com(0x80+4);dis_key(result);}if(shu>=1000&&shu<10000){write_com(0x80+5);dis_key(result);}if(shu>=10000){write_com(0x80+6);dis_key(result);}}void display_fuhao(){switch(fuhao){case 1: write_date(0x2b);break; case 2: write_date(0x2d);break; case 3: write_date(0x2a);break; case 4: write_date(0x2f);break; }fuhao=0;}void fuhao_pan(){if(flag1==1){flag1=0;write_com(0x01);write_com(0x80+1); display_fuhao();}if(shu<10)write_com(0x80+1);if(shu>=10&&shu<100) write_com(0x80+2);if(shu>=100&&shu<1000) write_com(0x80+3);if(shu>=1000&&shu<10000) write_com(0x80+4);if(shu>=10000)write_com(0x80+5); display_fuhao();flag=1;}void fuhao_deng(){write_com(0x80+0x40); write_date(0x3d);flag1=1;flag=0;}void display_result(uint result) {write_com(0x80+0x40+1);if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000) display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result); }void jia1(){jia=1;jian=cheng=chu=qing=0;key1=key;fuhao=1;fuhao_pan();}void jian1(){jian=1;jia=cheng=chu=qing=0; key1=key;fuhao=2;fuhao_pan(); }void cheng1() {cheng=1;jia=jian=chu=qing=0; key1=key;fuhao=3;fuhao_pan(); }void chu1() {chu=1;jia=jian=cheng=qing=0; key1=key;fuhao=4;fuhao_pan();}void qing1() {qing=1;jia=jian=cheng=chu=0; key1=key=0; }void deng1() {if(jia)key=key1+key;if(jian)key=key1-key;if(cheng)key=key1*key;if(chu)key=key1/key;fuhao_deng();display_result(key);jia=jian=cheng=chu=qing=0;}void deal(){switch(num){case 0:{switch(flag){case 0: display_key1(key);break; case 1: display_key(key);break; }} break;case 1: jia1();break;case 2: jian1();break; case 3: cheng1();break; case 4: chu1();break; case 5: deng1();break; case 6: qing1();break; }}void main(){lcd_init();while(1){keyscan();deal();}}。

基于51单片机1602显示的简单计算机

基于51单片机1602显示的简单计算机

图3-1所示为简易计算器的电路原理图。

P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。

/*注:4 X4 矩阵接P3口*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define CHECK_BUSYsbit RS = P3^5;sbit RW = P3^6;sbit EN = P3^4;void Delay(int z){int x,y;for (x=z;x>0;x--)for(y=110;y>0;y--);}/***********判忙函数***********/bit LCD_Check_Busy(){P0= 0xFF;RS=0;RW=1;EN=0;_nop_();EN=1;return (bit)(P0 & 0x80);#elsereturn 0;}/***********写入命令函数***********/ void write_com(uchar com){while(LCD_Check_Busy()); //忙则等待RS=0;RW=0;EN=1;P0= com;_nop_();EN=0;}/**********写入数据函数**********/ void write_dat(uchar dat){while(LCD_Check_Busy()); //忙则等待RS=1;RW=0;EN=1;P0= dat;_nop_();EN=0;}/*******写入字符函数***********/void LCD_Write_Char(uchar x,uchar y,uchar dat){if (y == 0){write_com(0x80 + x);}else{write_com(0xC0 + x);}write_dat( dat);}/******写入字符串函数***********/void Write_String(uchar x,uchar y,uchar *s){while (*s){LCD_Write_Char(x,y,*s);s++;x++;}}/*****初始化函数******/void LCD_Init(){write_com(0x38); /*显示模式设置*/Delay(5);write_com(0x06);/*显示光标移动设置*/Delay(5);write_com(0x0C); /*显示开及光标设置*/write_com(0x01); /*显示清屏*/}/*按键扫描函数,返回扫描键值*/uchar KeyScan() //键盘扫描函数,使用行列反转扫描法{unsigned char cord_h,cord_l;//行列值中间变量P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{Delay(10); //去抖if((P3&0x0f)!=0x0f){cord_h=P3&0x0f; //读入列线值P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值while((P3&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}unsigned char KeyPro(){switch(KeyScan()){case 0x7e:return '+';break;case 0x7d:return '-';break;case 0x7b:return 'x';break;case 0x77:return '/';break;case 0xbe:return '3';break;case 0xbd:return '6';break;case 0xbb:return '9';break;case 0xb7:return '=';break;case 0xde:return '2';break;case 0xdd:return '5';break;case 0xdb:return '8';break;case 0xd7:return '0';break;case 0xee:return '1';break;case 0xed:return '4';break;case 0xeb:return '7';break;case 0xe7:return '0';break;default:return 0xff;break;}}main(){unsigned char num,i,sign;unsigned char temp[16]; //最大输入16个bit firstflag;float a=0,b=0;unsigned char s;LCD_Init(); //初始化液晶屏Delay(10);//延时用于稳定,可以去掉write_com(0x01); //清屏while (1) //主循环{num=KeyPro(); //扫描键盘if(num!=0xff) //如果扫描是按键有效值则进行处理{if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看write_com(0x01);if(('+'==num)|| (i==16) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//输入数字最大值16,输入符号表示输入结束{i=0; //计数器复位if(firstflag==0) //如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b{sscanf(temp,"%f",&a);firstflag=1;}elsesscanf(temp,"%f",&b);for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;LCD_Write_Char(0,1,num);if(num!='=') //判断当前符号位并做相应处理sign=num; //如果不是等号记下标志位else{firstflag=0; //检测到输入=号,判断上次读入的符合switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case 'x':a=a*b;break;case '/':a=a/b;break;default:break;}sprintf(temp,"%g",a); //输出浮点型,无用的0不输出Write_String(1,1,temp);//显示到液晶屏sign=0;a=b=0; //用完后所有数据清零for(s=0;s<16;s++)temp[s]=0;}}else if(i<16){if((1==i)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符{if(num=='0') //如果是小数点则正常输入,光标位置加1{write_com(0x01);}else{temp[0]=num;i++; //如果是1-9数字,说明0没有用,则直接替换第一位0LCD_Write_Char(0,0,num);//输出数据}}else{temp[i]=num;LCD_Write_Char(i,0,num);//输出数据i++;}}}}}。

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计设计一个基于51单片机的简易计算器,主要功能包括加减乘除四则运算和百分数计算。

下面是设计的详细步骤:1.硬件设计:-使用51单片机作为主控芯片。

-连接16x2的LCD显示屏,用于显示输入和计算结果。

-连接16个按键开关,用于输入运算符和数字。

-连接4个LED灯,用于指示四则运算的选择。

2.软件设计:-初始化LCD显示屏,并显示欢迎信息。

-监听按键输入,在接收到输入后,根据输入的按键值判断操作类型。

-如果按键值对应数字键,保存输入的数字,并在LCD上显示当前输入的数字。

-如果按键值对应四则运算符(+、-、*、/),保存当前输入的数字,并保存运算符。

-如果按键值对应等号(=),根据保存的数字和运算符进行相应的运算,计算结果保存并显示在LCD上。

-如果按键值对应清零(C),将所有保存的数据清空,并显示初始状态。

-如果按键值对应百分号(%),将当前数字除以100并显示在LCD上。

3.主要函数说明:- void init_lcd(:初始化LCD显示屏。

- void display_lcd(char* str):将指定字符串显示在LCD上。

- void clear_lcd(:清空LCD显示屏。

- char get_key(:获取按键输入的值。

- void calculate(:根据保存的数字和运算符进行计算。

- void add_digit(char digit):将输入的数字添加到当前数字中。

- void set_operator(char op):保存运算符。

- void clear_data(:清空所有保存的数据。

4.主要流程:-初始化LCD显示屏并显示欢迎信息。

-在循环中监听按键输入,并根据输入的按键值进行相应的操作。

-根据不同的按键值,调用不同的函数进行处理。

-最后计算结果显示在LCD上。

以上是基于51单片机的简易计算器设计的详细步骤和主要函数说明。

你可以根据这个设计框架进行具体的代码实现。

Lcd1602简易计算器

Lcd1602简易计算器

Lcd1602显示实现千位数加减乘除用4*4矩阵按键输入0~9 +,-,*,/,=,和清除建#include<reg51.h>#define temp P3sbit RS=P0^0;sbit RW=P0^1;sbit E =P0^2;unsigned char key_num;unsigned char lcd_tab3[16]=" ";unsigned char code lcd_tab4[]="0123456789+-*/=";unsigned char lcd_tab5[16]=" ";unsigned char lcd_tab6[]=" ";unsigned char lcd_tab7[]=".";int a,b,c,d,m,i;void decide();long int key_cnt=0,key_number,key_number1;unsigned char flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;long int result, result1, result2, result3, result4,result5, result6, result7, result8;int decimal0,decimal1;delay_nms(unsigned int i){unsigned int j;for(;i!=0;i--){for(j=0;j<61;j++);}}key_scan(void){unsigned char a;temp=0xf0;if(temp!=0xf0){delay_nms(10);{if(temp!=0xf0)switch(temp){case 0xe0 :key_num= 0; break;case 0xd0 :key_num= 1; break;case 0xb0 :key_num= 2; break;case 0x70 :key_num= 3; break;}temp=0x0f;switch(temp){case 0x0e :key_num=key_num; break;case 0x0d :key_num= key_num+4; break;case 0x0b :key_num= key_num+8; break;case 0x07 : key_num=key_num+12; break;default :break;}while((a<50)&&( temp!=0x0f)){delay_nms(1);a++;}temp=0xf0;}}return (key_num);}void write_com(char cod){E=0;RS=0;RW=0;E=1;delay_nms(1);P2=cod;E=0;delay_nms(1);}void write_data(char pat){E=0;RS=1;RW=0;E=1;delay_nms(1);P2=pat;E=0;delay_nms(1);}void write_clean(){write_com(0x38);write_com(0x01);write_com(0x06);write_com(0x0c);}void input(){unsigned char i,x;write_com(0x80);for(i=0;i<16;i++){write_data(lcd_tab3[i]);delay_nms(1);}write_com(0xc0);{for(x=0;x<16;x++){write_data(lcd_tab5[x]);delay_nms(1);}}}void display(){if(flag5==0){lcd_tab5[0]=lcd_tab4[key_num];lcd_tab5[2]=lcd_tab4[result7];lcd_tab5[3]=lcd_tab4[result6];lcd_tab5[4]=lcd_tab4[result5];lcd_tab5[5]=lcd_tab4[result4];lcd_tab5[6]=lcd_tab4[result3];lcd_tab5[7]=lcd_tab4[result2];lcd_tab5[8]=lcd_tab4[result1];if((decimal0!=0)||(decimal1!=0)){lcd_tab5[9]=lcd_tab7[0];lcd_tab5[10]=lcd_tab4[decimal1];lcd_tab5[11]=lcd_tab4[decimal0];}i=0;decide();}else{lcd_tab5[0]=lcd_tab4[key_num];lcd_tab5[1]=lcd_tab4[11];lcd_tab5[2]=lcd_tab4[result8];lcd_tab5[3]=lcd_tab4[result7];lcd_tab5[4]=lcd_tab4[result6];lcd_tab5[5]=lcd_tab4[result5];lcd_tab5[6]=lcd_tab4[result4];lcd_tab5[7]=lcd_tab4[result3];lcd_tab5[8]=lcd_tab4[result2];lcd_tab5[9]=lcd_tab4[result1];i=1;decide();}}void decide(){if(lcd_tab5[1+i]==lcd_tab4[0]){lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab5[6+i];lcd_tab5[6+i]=lcd_tab5[7+i];lcd_tab5[8+i]=lcd_tab5[9];lcd_tab5[9]=lcd_tab5[10];lcd_tab5[10]=lcd_tab5[11];lcd_tab5[11]=lcd_tab6[0];if(lcd_tab5[1+i]==lcd_tab4[0]) {lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab5[6+i];lcd_tab5[6+i]=lcd_tab5[7+i];lcd_tab5[7+i]=lcd_tab5[8+i];lcd_tab5[8+i]=lcd_tab5[9];lcd_tab5[9]=lcd_tab5[10];lcd_tab5[10]=lcd_tab6[0];lcd_tab5[11]=lcd_tab6[0];if(lcd_tab5[1+i]==lcd_tab4[0]) {if(lcd_tab5[1+i]==lcd_tab4[0]) {lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab5[6+i];lcd_tab5[6+i]=lcd_tab5[7+i];lcd_tab5[7+i]=lcd_tab5[8+i];lcd_tab5[8+i]=lcd_tab5[9];lcd_tab5[9]=lcd_tab6[0];lcd_tab5[10]=lcd_tab6[0];lcd_tab5[11]=lcd_tab6[0];if(lcd_tab5[1+i]==lcd_tab4[0]) {lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab5[6+i];lcd_tab5[6+i]=lcd_tab5[7+i];lcd_tab5[7+i]=lcd_tab5[8+i];lcd_tab5[8+i]=lcd_tab6[0];lcd_tab5[9]=lcd_tab6[0];lcd_tab5[10]=lcd_tab6[0];lcd_tab5[11]=lcd_tab6[0];if(lcd_tab5[1+i]==lcd_tab4[0]){lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab5[6+i];lcd_tab5[6+i]=lcd_tab5[7+i];lcd_tab5[7+i]=lcd_tab6[0];lcd_tab5[8+i]=lcd_tab6[0];lcd_tab5[9]=lcd_tab6[0];lcd_tab5[10]=lcd_tab6[0];lcd_tab5[11]=lcd_tab6[0];if(lcd_tab5[1+i]==lcd_tab4[0]) {lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab5[6+i];lcd_tab5[6+i]=lcd_tab6[0];lcd_tab5[7+i]=lcd_tab6[0];lcd_tab5[8+i]=lcd_tab6[0];lcd_tab5[9]=lcd_tab6[0];lcd_tab5[10]=lcd_tab6[0];lcd_tab5[11]=lcd_tab6[0];if(lcd_tab5[1+i]==lcd_tab4[0]) {lcd_tab5[1+i]=lcd_tab5[2+i];lcd_tab5[2+i]=lcd_tab5[3+i];lcd_tab5[3+i]=lcd_tab5[4+i];lcd_tab5[4+i]=lcd_tab5[5+i];lcd_tab5[5+i]=lcd_tab6[0];lcd_tab5[6+i]=lcd_tab6[0];lcd_tab5[7+i]=lcd_tab6[0];lcd_tab5[8+i]=lcd_tab6[0];lcd_tab5[9]=lcd_tab6[0];lcd_tab5[10]=lcd_tab6[0];lcd_tab5[11]=lcd_tab6[0];}}}}}}}}}void lcd_shiftl(void){lcd_tab3[0]=lcd_tab3[1];lcd_tab3[1]=lcd_tab3[2];lcd_tab3[2]=lcd_tab3[3];lcd_tab3[3]=lcd_tab3[4];lcd_tab3[4]=lcd_tab3[5];lcd_tab3[5]=lcd_tab3[6];lcd_tab3[6]=lcd_tab3[7];lcd_tab3[7]=lcd_tab3[8];lcd_tab3[8]=lcd_tab3[9];lcd_tab3[9]=lcd_tab3[10];lcd_tab3[10]=lcd_tab3[11];lcd_tab3[11]=lcd_tab3[12];lcd_tab3[12]=lcd_tab3[13];lcd_tab3[13]=lcd_tab3[14];lcd_tab3[14]=lcd_tab3[15];lcd_tab3[15]=lcd_tab4[key_num];}void displasis(){int i;for(i=0;i<16;i++){lcd_tab3[i]=lcd_tab6[0];}for(i=0;i<16;i++){lcd_tab5[i]=lcd_tab6[0];}key_cnt=key_number=key_number1=0;a=b=c=d=0;result=result1=result2=result3=result4=result5=result6=result7=result8=0;flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;decimal0=0;decimal1=0;}void main(){while(1){write_clean();input();m=1;while(m){P3=0xf0;if(P3!=0xf0){m=0;}}P3=0xf0;if(P3!=0xf0){key_scan();if(key_num<=9){if(key_cnt<4){switch(key_cnt){case 0: a=key_num ; break;case 1: a=a*10 ;b=key_num; a=a+b; break;case 2: a=a*10 ;c=key_num; a=a+c; break;case 3: a=a*10 ;d=key_num; a=a+d; break;}lcd_shiftl();key_cnt++;}while(P3!=0xf0){;}}if(key_num==10)//加法{flag1=1;key_number=a;a=b=c=d=0;key_cnt=0;lcd_shiftl();while(P3!=0xf0){;}}if(key_num==11)//减法{flag2=1;key_number=a;a=b=c=d=0;key_cnt=0;lcd_shiftl();while(P3!=0xf0){;}}if(key_num==12)//乘法{flag3=1;key_number=a;a=b=c=d=0;key_cnt=0;lcd_shiftl();while(P3!=0xf0){;}}if(key_num==13)//除法{flag4=1;key_number=a;a=b=c=d=0;key_cnt=0;lcd_shiftl();while(P3!=0xf0){;}}if(key_num==14){while(P3!=0xf0){;}key_number1=a;a=b=c=d=0;key_cnt=0;if((flag1==1)&&(key_number1!=0)){result=key_number+key_number1;//加法运算result1= result%10;result2= result/10%10;result3= result/100%10;result4= result/1000%10;result5= result/10000%10;result6= result/100000%10;result7= result/1000000%10;result8= result/10000000;delay_nms(2);key_number1=0 ;key_number=result;display();}if((flag2==1)&&(key_number1!=0))//减法运算{result=key_number-key_number1;if(result<0){result=key_number1-key_number;flag5=1;}result1= result%10;result2= result/10%10;result3= result/100%10;result4= result/1000%10;result5= result/10000%10;result6= result/100000%10;result7= result/1000000%10;result8= result/10000000;delay_nms(2);key_number1=0 ;key_number=result;display();}if((flag3==1)&&(key_number1!=0)){result=key_number*key_number1;//乘法运算result1= result%10;result2= result/10%10;result3= result/100%10;result4= result/1000%10;result5= result/10000%10;result6= result/100000%10;result7= result/1000000%10;result8= result/10000000;delay_nms(2);key_number1=0 ;key_number=result;display();}if((flag4==1)&&(key_number1!=0))//除法运算{result=key_number/key_number1;decimal0=((key_number*100)/key_number1)%10;//小数各位decimal1=((key_number*100)/key_number1)/10%10;//小数十位result1= result%10;result2= result/10%10;result3= result/100%10;result4= result/1000%10;result5= result/10000%10;result6= result/100000%10;result7= result/1000000%10;result8= result/10000000;delay_nms(2);key_number1=0 ;key_number=result;display();}}if(key_num==15){while(P3!=0xf0){;}displasis();}}}}。

(最终)1602显示的计算器

(最终)1602显示的计算器

基于单片机的1602显示的简易计算器刘哲电子121 学号2012131017摘要:单片机是一个单芯片形式、面向控制对象的嵌入式应用计算机系统。

他的出现及发展是计算机技术从通用型数值计算领域进入到智能化的控制领域。

从此,计算机技术在两个重要领域——通用计算机领域和嵌入式计算机领域都得到了极其重要的发展,并正在深深地改变我们的社会。

本设计是基于51单片机来进行的数值计算器系统的设计,可以完成计算器的键盘输入,进行加减乘除八位数范围内的基本四则运算,并在LCD上显示出来。

涉及电路采用AT89C51单片机为主要控制电路,利用4*4矩阵键盘作为计算器的数字以及运算符的输入,显示采用字符LCD静态显示。

软件方面使用C语言编程,并用开发板制作和演示。

关键词:51单片机,矩阵键盘,LCD,运算器1 引言本次课程设计,我是基于单片机STC89C51的控制能力,使用包括单片机芯片,1602液晶显示屏,行列式键盘等来设计一个简单的计算器,本计算器因为按键的关系,仅实现了加减乘除四个基本计算法则的运算,初步实现了一个计算器所具有的基本功能。

2 总体架构2.1 设计预想本设计使用STC89C52单片机作为主控芯片,利用矩阵键盘输入0~9十个数值和加减乘除四个运算法则,通过芯片的运算,在LCD上显示过程和结果。

2.2 设计思路根据课程设计要求和设计指标,本系统采用STC89C52作为主控芯片,通过拓展必要的外部电路,实现对计算器的设计,具体设计思路如下:由于要显示的运算式和结果,为了达到良好的显示效果,本系统采用LCD1602液晶显示屛作为显示模块。

计算器一般包括数字键(0~9),符号键(+、—、*、/),清零按键,等号按键,故采用4*4矩阵键盘结合键盘扫描技术容易达到要求,并且电路和程序也比较简单。

鉴于本设计的计算器的难度和功能上的要求,在本设计中决定使用语言功能丰富,表达能力强,使用方便灵活,可移植性好的C语言编程,这样有利于减少工作量和代码量,提高设计效率。

基于C51单片机的智能计算器、矩阵键盘、lcd1602

基于C51单片机的智能计算器、矩阵键盘、lcd1602

基于C51单⽚机的智能计算器、矩阵键盘、lcd1602⽬录1绪论 (1)1.1选题背景 (1)1.2起源与发展 (1)1.3研究的⽬的和意义 (2)2项⽬总体设计框架 (2)2.1芯⽚STC89C52 (2)2.2采⽤矩阵式键盘作为输⼊模块 (2)2.3显⽰模块 (3)2.4硬件资源分配 (3)3计算器硬件设计 (4)3.1系统组成及硬件框图 (4)3.2元器件简介 (4)3.2.1 STC89C52的特点 (4)3.2.2 LCD1602 液晶显⽰屏 (5)4系统电路设计 (6)4.1键盘电路设计 (7)4.2显⽰电路设计 (8)4.3其他电路部分 (8)4.3.1 蜂鸣器模块 (8)4.3.2 电源模块 (9)4.3.3 单⽚机最⼩系统 (9)5计算器软件设计 (10)5.1整体设计结构 (10)5.2液晶屏读写函数 (10)5.2.1 初始化函数 (10)5.2.2 写命令函数 (11)5.2.3 写数据函数 (11)5.3接收矩阵键盘输⼊函数 (12)5.4调试和运⾏程序 (13)5.4.1 Proteus仿真运⾏程序 (13)5.4.2 在实验箱上运⾏程序 (13)6总结 (14)基于51单⽚机的简易计算器摘要:近⼏年单⽚机技术的发展很快,其中,电⼦产品的更新速度迅猛。

计算器是⽇常⽣活中⽐较常见的电⼦产品之⼀。

如何才能使计算器技术更加的成熟,充分利⽤已有的硬件和软件条件,设计出更出⾊的计算器。

本设计是以STC89C52单⽚机为核⼼的计算器模拟系统设计,输⼊采⽤4*4矩阵键盘,可以进⾏加、减、乘、除带符号数字运算(六位整数或两位⼩数点点),并在液晶显⽰屏LCD1602上静态显⽰操作过程及结果。

对字符液晶显⽰模块的⼯作原理,如初始化、清屏、显⽰、调⽤及外特性有较清楚的认识,并会使⽤LCD(液晶显⽰模块)实现计算结果的显⽰;掌握液晶显⽰模块的驱动和编程,设计LCD和单⽚机的接⼝电路,以及利⽤单⽚机对液晶显⽰模块的驱动和操作;在充分分析内部逻辑的概念,进⾏软件和调试,学会使⽤,并能够以其为平台设计出具有四则运算能⼒简易计算器的硬件电路和软件程序。

基于511602的可连续运算计算器

基于511602的可连续运算计算器

#include <reg51.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "LCD1602.h"#define uchar unsigned char uchar k=0,result1;void shortdelay(uchar i)//短延时{for(;i>0;i--);}//长延时void longdelay(uint i){uint j;for(;i>0;i--){for(j=100;j>0;j--);}}//延时程序void delay(int i){int j;for(;i>0;i--)for(j=0;j<100;j++);}//初试状态void io_init(){P1=0xff;}//?---------------------------键盘扫描部分-----------------------------//unsigned char key_scan(){ unsigned char key;unsigned char temp;uint flag;io_init();P1=0xf0;flag=0;loop: temp=P1^0xf0;while(temp){P1=0xfe;delay(1);if((P1&0xfe)!=0xfe)switch(P1){case 0xee: key=0x11;flag=1;break;//读7键和值case 0xde: key=0x12;flag=1;break;case 0xbe: key=0x13;flag=1;break;case 0x7e: key=0x14;flag=1;break;//读除键的值}if(flag)goto exit;elseP1=0xfd;delay(1);if((P1&0xfd)!=0xfd)switch(P1){case 0xed: key=0x21;flag=1;break;case 0xdd: key=0x22;flag=1;break;case 0xbd: key=0x23;flag=1;break;case 0x7d: key=0x24;flag=1;break; //读4到乘的键值}if(flag)goto exit;elseP1=0xfb;delay(1);if((P1&0xfb)!=0xfb)switch(P1){case 0xeb: key=0x31;flag=1;break;case 0xdb: key=0x32;flag=1;break;case 0xbb: key=0x33;flag=1;break;case 0x7b: key=0x34;flag=1;break;//读1到减的键值}if(flag)goto exit;elseP1=0xf7;delay(1);if((P1&0xf7)!=0xf7)switch(P1){case 0xe7: key=0x41;flag=1;break;//后退case 0xd7: key=0x42;flag=1;break;//0case 0xb7: key=0x43;flag=1;break;//等于case 0x77: key=0x44;flag=1;break;//加}exit: return key;}if(temp==0)goto loop;}//---------------------------------键盘扫描完--------------------------------------------// //---------------------------------显示初始化?----------------------------------------// //P0口初始化void initpindata(bit i){if(i==1) pindata=0xff;else pindata=0X00;}//寄存器选择信号void setRS(bit i){if(i==1) pinRS=1;else pinRS=0;}//读写操作控制void setRW(bit i){if(i==1) pinRW=1;else pinRW=0;}//使能信号void setE(bit i){if(i==1) pinE=1;else pinE=0;}//读BF以及AC的值uint read_BF_AC(){uint temp;initpindata(1);setRS(0);setRW(1);setE(1);shortdelay(1);temp=pindata;shortdelay(10);setE(0);return(temp);}//判忙bit statuscheck(){return((bit)(read_BF_AC()&0x80)); }//写指令函数void writeinstruc(uint instruc){while(statuscheck()); initpindata(0);setRS(0);setRW(0);setE(0);pindata=instruc;//short delay(1);setE(1);shortdelay(10);setE(0);}//写数据到RAMvoid writedata(uint data1){initpindata(0);setRS(1);setRW(0);setE(0);pindata=data1;setE(1);shortdelay(10);setE(0);}//从RAM中读数据函数uint readdata(void){uint temp;initpindata(1);setRS(1);setRW(1);setE(1);shortdelay(1);temp=pindata;shortdelay(10);setE(0);return(temp);}//显示程序X为行号,Y为列号,date为要显示的数据void dispcharacter(int x,uint y,uint data1){uint temp;while(statuscheck());temp=y&0x0f;x&=0x01;if(x) temp|=0x40;setDDRAM_Add(temp);writedata(data1);// writedata(data1);}//LCD复位函数void LCDreset(){clearscreen();cursorreturn();}//LCD初始化void initLCD(){LCDreset();inputmode(0x06);//增量方式,不移位dispcontrol(0x0c);//显示开,光标关,闪烁关functionset(0x38);//8位,2行,5*7}//-----------------------------------准备工作完成-----------------------------------// //-----------------------------------计算器-----------------------------------------//compute(char key1,i){signed char m,n,c,act;long int num1,num2,result;signed char str[4][4]={{'7','8','9','/'},{'4','5','6','*'},{'1','2','3','-'},{'c','0','=','+'}};signed char str1[11],string1[2];m=(key1&0xf0);m=m/16;m=m-1;n=key1&0x0f;n=n-1;c=str[m][n];sprintf(string1,"%c",c);strcat(str1,string1);if((c=='+')||(c=='-')||(c=='*')||(c=='/')){act=c;num1=atoi(str1);memset(str1,0,11);memset(string1,0,2);}if(c=='='){num2=atoi(str1);switch(act){case'+':{ if(k==0){result=num1+num2;k++;break;}else{result+=num2;k++;break;}}case'-':{if(k==0){result=num1-num2;k++;break;}else{result-=num2;k++;break;}}case'*':{if(k==0){result=num1*num2;k++;break;}else{result*=num2;k++;break;}}case'/':{if(k==0){result=num1/num2;k++;break;}else{ result/=num2;k++;break;}}}}if(c=='c'){act=0;num1=str1[0];num1=str1[8];memset(str1,0,11);memset(string1,0,2);num1=str1[0];num1=str1[8];k=0;}longdelay(350);switch(key1) //显示部分{case 0x11: dispcharacter(0,i,'7');i++;break; case 0x12: dispcharacter(0,i,'8');i++; break; case 0x13: dispcharacter(0,i,'9');i++; break;case 0x14: dispcharacter(0,i,'/');i++;break; case 0x21: dispcharacter(0,i,'4');i++;break; case 0x22: dispcharacter(0,i,'5');i++;break; case 0x23: dispcharacter(0,i,'6');i++;break; case 0x24: dispcharacter(0,i,'*');i++;break; case 0x31: dispcharacter(0,i,'1');i++;break; case 0x32: dispcharacter(0,i,'2');i++;break; case 0x33: dispcharacter(0,i,'3');i++;break; case 0x34: dispcharacter(0,i,'-');i++;break; case 0x41: clearscreen(); break; case 0x42: dispcharacter(0,i,'0');i++;break; case 0x43: dispcharacter(0,i,'=');i++;m=result/10000;result1=result%10000;if(m!=0||result==0){n=0;m=m+'0';dispcharacter(0,i,m);i++;}m=result1/1000;result1=result1%1000;if(m!=0||n==0){m=m+'0';n=0;dispcharacter(0,i,m);i++;}m=result1/100;result1=result1%100;if(m!=0||n==0){m=m+'0';n=0;dispcharacter(0,i,m);i++;}m=result1/10;result1=result1%10;if(m!=0||n==0){m=m+'0';n=0;dispcharacter(0,i,m);i++;}m=result1;if(m!=0||n==0)m=m+'0';dispcharacter(0,i,m);i++;break;case 0x44: dispcharacter(0,i,'+');i++;break;}return(i);}//---------------------------------------------------------------------------------////-------------------------------------主函数---------------------------------------// void main(){char key1,i;start:initpindata(0);P2=0X00;initLCD();i=0;scan:key1=key_scan();i=compute(key1,i);if(key1==0x41)goto start;elsegoto scan;}#define uint unsigned int#define uchar unsigned charsbit pinRS=P2^0;sbit pinRW=P2^1;sbit pinE=P2^2;#define pindata P0#define clearscreen() writeinstruc(0x01)#define cursorreturn() writeinstruc(0x02)#define inputmode(temp) writeinstruc(temp)//temp取值如下://0x04:减量方式,不移位//0x05:减量方式,移位//0x06:增量方式,不移位//0x07:增量方式,移位#define dispcontrol(temp) writeinstruc(temp)//temp取值如下://0x08:显示关,光标关,闪烁关//0x0c:显示关,光标关,闪烁关//0x0d:显示开,光标关,闪烁开//0x0e:显示开,光标开,闪烁关//0x0f:显示开,光标开,闪烁开#define dispshift(temp) writeinstruc(temp)//temp取值如下://0x10:光标左移//0x14:光标右移//0x18:显示整体左移//0x1c:显示整体右移#define functionset(temp) writeinstruc(temp)//temp取值如下://0x20:4位,1行,5*7//0x24:4位,1行,5*10//0x28:4位,2行,5*7//0x2c:4位,2行,5*10//0x30:8位,1行,5*7//0x34:8位,1行,5*10//0x38:8位,2行,5*7//0x3c:8位,2行,5*10#define setCGRAM_Add(address) writeinstruc(0x40|address)#define setDDRAM_Add(address) writeinstruc(0x80|address)//短延时//void shortdelay(uchar i);//长延时//void longdelay(uint i);//P2口初始化//void initP2(bit i);//寄存器选择信号//void setRS(bit i);//读写操作控制//void setRW(bit i);//使能信号//void setE(bit i);//读BF以及AC的值//uint read_BF_AC();//判忙//bit statuscheck();//写指令函数//void writeinstruc(uint instruc);//写数据到RAM//void writedata(uint data1);//从RAM中读数据函数//uint readdata(void);//显示程序X为行号,Y为列号,date为要显示的数据//void dispcharacter(int x,uint y,uint data1);//LCD复位函数//void LCDreset();。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//利用51单片机控制LCD1602,实现加减乘除运算#include<>#define uint unsigned int#define uchar unsigned char#define DATE_IO P0//P0口并行传输数据(LCD1602的数据端接P0口)sbit RS=P1^0;//LCD1602寄存器选择端sbit E=P1^2; //使能信号端sbit RW=P1^1;//读写控制端sbit deng=P1^3;//结果sbit shuzi11=P3^2;//前面的数字加1(因为我的按键是与P3口相连的)sbit shuzi22=P3^7; //后面的数字加1sbit jia=P3^3;//加号sbit jian=P3^4;//减号sbit cheng=P3^5;//乘号sbit chu=P3^6;//除号uint countqian=0,counthou=0;//数值uchar qian,bai,shi,ge,a=0;uchar code table1[]="09";uchar code table2[]="+-*/";//**********************延时函数***************************************** void delay_us(unsigned int n){if(n==0)return ;while(--n);}void delay_ms(uint i){unsigned char a,b;for (a=1;a<i;a++)for(b=1;b;b++);}void delay(uint z){uint x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}//***********************************************************************//*********************控制LCD1602的函数*******************************void write_command(uchar come)//写指令函数{RS=0;//选择指令寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=come;delay_us(5);E=0;RS=1;}void write_date(uchar date)//写数据函数{RS=1;//选择数据寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=date;delay_us(5);E=0;RS=0;}//***************************************************************************** ***//**************************液晶初始化函数(基本上就是这个模式)*******************void init()//液晶初始化函数{RW=0;//低电平时进行写操作(高电平时进行读操作)E=0;write_command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输 delay_ms(5);write_command(0x01);//清除屏幕显示delay_ms(5);write_command(0x06);//设定输入方式,增量不移位delay_ms(5);write_command(0x0c);//开整体显示,关光标,不闪烁delay_ms(5);}//***************************************************************************** *****void jiayiqian()//前边数字加1计数函数{if(shuzi11==0)//如果前面加1的按键按下 {delay(50);//消除抖动countqian=countqian+1;}if(countqian==999)//记到999归0countqian=0;}void jiayihou()//后边数字加1计数函数{if(shuzi22==0)//如果后面加1的按键按下 {delay(50);//消除抖动counthou=counthou+1;}if(counthou==999)//记到999归0counthou=0;}void fuhao()//+,-,*,/运算号{if(jia==0)//如果加号按下{while(!jia);//等待按键的释放write_date(table2[0]);//显示'+' a=1;//加号按下的标志}if(jian==0)//如果减号按下{while(!jian);//等待按键的释放write_date(table2[1]);//显示'-' a=2;//减号按下的标志}if(cheng==0)//如果乘号按下{while(!cheng);//等待按键的释放write_date(table2[2]);//显示'*'a=3; //乘号按下的标志}if(chu==0)////如果除号按下{while(!chu);//等待按键的释放write_date(table2[3]);//显示'/'a=4;//除号按下的标志}}void chaiqian()//将前边各位数字拆开函数{bai=countqian/100;//求百位数字shi=countqian%100/10;//求十位数字ge=countqian%10;//求各位数字}void chaihou()//将后边各位数字拆开函数{bai=counthou/100;//求百位数字shi=counthou%100/10;//求十位数字ge=counthou%10;//求各位数字}void chaijiejia()//将相加结果各位数字拆开函数{qian=(countqian+counthou)/1000;//求千位数字bai=(countqian+counthou)%1000/100;//求百位数字shi=(countqian+counthou)%100/10;//求十位数字ge=(countqian+counthou)%10;//求各位数字}void chaijiejian()//将相减结果各位数字拆开函数{qian=(countqian-counthou)/1000;//求千位数字bai=(countqian-counthou)%1000/100;//求百位数字shi=(countqian-counthou)%100/10;//求十位数字ge=(countqian-counthou)%10;//求各位数字}void chaijiecheng()//将相乘结果各位数字拆开函数{qian=(countqian*counthou)/1000;//求千位数字bai=(countqian*counthou)%1000/100;//求百位数字shi=(countqian*counthou)%100/10;//求十位数字ge=(countqian*counthou)%10;//求各位数字}void chaijiechu()//将相除结果各位数字拆开函数(只取了模值){qian=(countqian/counthou)/1000;//求千位数字bai=(countqian/counthou)%1000/100;//求百位数字shi=(countqian/counthou)%100/10;//求十位数字ge=(countqian/counthou)%10;//求各位数字}void xianshiqian()//显示前边数字{write_command(0x80);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]); //第二位显示十位write_date(table1[ge]); //第三位显示个位fuhao();//显示运算号delay(50);//改变数值可以修改数字滚动的速度}void xianshihou()//显示后边数字{write_command(0x80+4);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]); //第二位显示十位write_date(table1[ge]); //第三位显示个位//delay(50);//改变数值可以修改数字滚动的速度}void xianshijie()//显示结果{write_command(0xc0);//设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[qian]);//第一位显示千位write_date(table1[bai]);//第二位显示百位write_date(table1[shi]); //第三位显示十位write_date(table1[ge]); //第四位显示个位//delay(50);//改变数值可以修改数字滚动的速度}void main()//主函数{init();//调用液晶初始化函数while(1){jiayiqian();//调用前边数字加1计数函数chaiqian();//调用将前边数字各位数字拆开函数 xianshiqian();//显示前边数字jiayihou();//调用后边数字加1计数函数chaihou();//调用将后边数字各位数字拆开函数 xianshihou();//显示后边数字if(deng==0)//控制显示结果的按键按下{if(a==1)//计算的是加法{chaijiejia();//将结果的各位数字拆分开xianshijie(); //显示结果}if(a==2)//计算的是减法{chaijiejian(); //将结果的各位数字拆分开xianshijie();//显示结果}if(a==3)//计算的是乘法{chaijiecheng();//将结果的各位数字拆分开xianshijie(); //显示结果}if(a==4) //计算的是除法{chaijiechu();//将结果的各位数字拆分开xianshijie(); //显示结果}}}}。

相关文档
最新文档