51单片机控制lcd1602实现计算器
基于51单片机的简易计算器

基于51单片机的简易计算器51单片机是一种广泛应用于嵌入式系统中的常用微控制器。
我们可以利用51单片机的强大功能和丰富的外设资源,设计一个简易计算器。
这个计算器可以进行基本的加减乘除运算,并且具备显示结果的功能。
首先,我们需要准备一块51单片机开发板,一块1602液晶显示屏模块,以及一些按键开关和电阻。
我们可以将运算器主要分为以下几个模块:数码管显示模块、键盘输入模块、运算模块和存储模块。
数码管显示模块:我们使用1602液晶显示屏模块来显示计算器的结果。
我们可以通过51单片机的IO口,将计算结果发送给液晶显示屏模块,实现结果的显示。
键盘输入模块:我们可以使用几个按键开关来实现数字和运算符的输入。
通过对按键的检测,我们可以将用户输入的数字和运算符转化为字符形式,并保存到内存中。
运算模块:我们需要根据用户输入的数字和运算符,进行相应的运算。
我们可以使用栈来实现这个功能。
栈是一种常用的数据结构,具有"先进后出"的特点。
我们可以将用户输入的数字和运算符按照一定的规则入栈,然后按照相应的顺序进行出栈和运算。
最后将结果保存到内存中。
存储模块:我们可以使用内部RAM来保存运算结果。
51单片机的内部RAM具有一定的存储能力,可以满足我们的基本需求。
在编写程序时,我们可以使用汇编语言或者C语言。
通过合理的编程,我们可以实现计算器的各项功能。
总结一下,基于51单片机的简易计算器主要包括数码管显示模块、键盘输入模块、运算模块和存储模块。
我们可以通过合理的编程,将这些模块相互配合,实现一个功能完善的计算器。
这个计算器不仅可以进行基本的加减乘除运算,还可以显示结果,方便用户进行计算。
怎样用51单片机做计算器啊?

怎样用51单片机做计算器啊?原理图51单片机简易计算器程序:#include <reg51.h>#include <math.h>#define uchar() unsigned char()#define uint unsigned int//---------定义引脚--------------------bit clr=0;bit ok=0;bit xiaoshu=0;bit jiego=0;bit first_1=1;bit first_2=1;sbit dout = P3^2;sbit load = P2^0;sbit din = P2^1;sbit dclk = P2^2;sbit beer=P0^1;sbit LCD1602_RS=P2^3;sbit LCD1602_RW=P2^4;sbit LCD1602_E=P2^5;//---------定义变量-------------------- uchar() ch451_key=0xff;uchar yun_sign;uchar xiabiao=0;uchar tab[32];uchar tab1[]={"welcome to use!"};uchar tab2[]={" make by JunRu!"};uchar tab3[]={"ERR0R"};float opr_1=0,opr_temp=0,end=0,a;//---------声明函数--------------------void ch451_init(void); //CH451初始化void ch451_write(uint command);//写命令或数据到ch451uchar ch451_read()(void); //读按键值uchar get_char(void);void LCD_init(void);//初始化;void delay(unsigned int k);//延时程序void LCD_inter_command(unsigned char command);//写入控制字void LCD_inter_dat(unsigned char dat);//写入要显示的数据void set_xy(unsigned char x,unsigned char y);//找地址void write(unsigned char date);//写入字符void lcdbusy();//查忙时void display()(void);void spec(void);void get_end(void);void hun_he(uchar n);//-------- 主函数----------------------void main(){uchar i;LCD_init();//LCD初始化;ch451_init();//CH451初始化EA = 1;//打开中断LCD_inter_command(0x01);//清屏for(i=0;i<=14;i++){LCD_inter_dat(tab1[i]);beer=0;delay(4000);//延时beer=1;}LCD_inter_command(0xc0);//从第二行开始显示for(i=0;i<=14;i++){LCD_inter_dat(tab2[i]);beer=0;delay(4000);//延时beer=1;}delay(0xffff);delay(0xffff);LCD_inter_command(0x01);while(1){if(ok){display()();ok=0;clr=1;}}}//----------子函数--------------------void hun_he(uchar n){int j;switch(n){case '+':opr_temp=opr_temp+opr_1;break;case '-':opr_temp=opr_temp-opr_1;break;case '*':opr_temp=opr_temp*opr_1;break;case '/':{if(a==0)//减数为零显错{ LCD_inter_command(0xc0);for(j=0;j<=4;j++){LCD_inter_dat(tab3[j]);beer=0;delay(4000);//延时beer=1;}}else{opr_temp=opr_temp/opr_1;}break;}default:break;}}void ch451_init(void)//CH451初始化{EX0 = 1;din = 0;din = 1;ch451_write(0x403); //开显示ch451_write(0x580); //BCD译码方式}void ch451_write(uint command)//写命令或数据到ch451 { uchar i;load = 0;for(i=0;i<12;i++){din = command&1;dclk = 0;command>>=1;dclk = 1;}load = 1;EX0 = 1;}uchar ch451_read()(void)//读按键值{ uchar key=0x07;uchar i;EX0=0;load = 0;for(i=0;i<4;i++) //将0111读入{din = key &1;dclk = 0;key>>=1;dclk =1;}load = 1;key = 0;for(i=0;i<7;i++) //从CH451读出按键值{key<<=1;key|= dout;dclk =1;}EX0 =1;return key;}void EX0_ISR(void)interrupt 0 //中断程序{uchar temp;ch451_key=ch451_read()(); //将读出的按键值赋给变量spec();if(clr) {LCD_inter_command(0x01);clr=0;}temp=get_char();if(temp){tab[xiabiao++]=temp; LCD_inter_dat(temp);}if(xiabiao>=16)LCD_inter_command(0xc0);//若大于16,则从第2行开始显示if(ok) get_end();beer=0;delay(3000);beer=1;}uchar get_char(void){uchar dis=0;uint temp=0,temp1=0;switch(ch451_key){case 0x40:dis='1';break;case 0x41:dis='2';break;case 0x42:dis='3';break;case 0x48:dis='4';break;case 0x49:dis='5';break;case 0x4A:dis='6';break;case 0x50:dis='7';break;case 0x51:dis='8';break;case 0x52:dis='9';break;case 0x58:dis='0';break;case 0x43:dis='+';break;case 0x4B:dis='-';break;case 0x53:dis='x';break;case 0x5B:dis='/';break;case 0x44:dis='!';break;case 0x5A:dis='=';ok=1; //遇到“=”,开始运算break;case 0x59:dis='.';break; //小数点case 0x5C: //删除键LCD_inter_command(0x01);xiabiao=0;break;default: break;}return dis;}void spec(void) //特殊功能键{switch(ch451_key){case 0x4C:LCD_inter_command(0x10);{if(xiabiao>0)xiabiao-=1;}break; //左移case 0x54:LCD_inter_command(0x14);{xiabiao+=1;}break; //右移default:break;}}void delay(unsigned int k)//延时程序{while (k--);}void LCD_inter_command(unsigned char command)//写入控制字{delay(5000);LCD1602_RS=0;LCD1602_RW=0;LCD1602_E=1;P1=command;LCD1602_E=0;lcdbusy();}void LCD_init(void)//初始化;{delay(5000);LCD_inter_command(0x01);//清屏delay(5000);LCD_inter_command(0x38);//设置为8位的数据接口,两行显示,5、7点字符delay(5000);LCD_inter_command(0x0E);//显示打开,光标开并闪烁delay(5000);}void LCD_inter_dat(unsigned char dat)//写入要显示的数据{delay(5000);LCD1602_RS=1;LCD1602_RW=0;LCD1602_E=1;P1=dat;LCD1602_E=0;lcdbusy();}void lcdbusy()//查忙{P1=0xFF;LCD1602_RS=0;LCD1602_RW=1;LCD1602_E=1;while((P1&0x80)==1);}void display()(void) //转化在LCD上显示计算结果{int temp=end; //浮点数int i;uint xiao_temp;uint xx; //浮点数的整数部分if (end>-32769&&end<32768){xx=fabs(end);xiao_temp=(fabs(end)-xx)*1000;//取出浮点数的小数部分LCD_inter_command(0xc0);if(end<0) LCD_inter_dat('-');beer=0;delay(4000); beer=1;//判断是否为负数,若是则显示负号if(xx>9999) LCD_inter_dat((xx/10000)%10+'0'); beer=0;delay (4000);beer=1;if(xx>999) LCD_inter_dat((xx/1000)%10+'0');beer=0;delay(40 00);beer=1; //在LCD上显示千位的数if(xx>99)LCD_inter_dat((xx/100)%10+'0'); beer=0;delay(400 0);beer=1;//百位if(xx>9)LCD_inter_dat((xx/10)%10+'0');beer=0;delay(4000); b eer=1;//十位LCD_inter_dat(xx%10+'0');beer=0;delay(4000); beer=1;//个位if(xiao_temp!=0) //显示小数部分{LCD_inter_dat('.');beer=0;delay(4000);beer=1;LCD_inter_dat((xiao_temp/100)%10+'0');beer=0;delay(4000); beer=1;LCD_inter_dat((xiao_temp/10)%10+'0');beer=0;delay(4000);b eer=1;LCD_inter_dat(xiao_temp%10+'0');beer=0;delay(4000);beer= 1;}}else {LCD_inter_command(0xc0);//从第二行开始显示for(i=0;i<=4;i++){ LCD_inter_dat(tab3[i]);beer=0;delay(4000);//延时beer=1;}}}void get_end(void)//计算子程序{ float xiaoshu=1;uchar fu_flag=0;uchar xiao_flag=0;uchar lianji_sign;uchar i=0;uchar j;uchar n;//正负标记符while(i<=xiabiao){while(tab[i]<=0x39&&tab[i]>=0x30){n=0;opr_1*=10;opr_1+=tab[i++]-0x30;n='+';}switch(tab[i]){case '.': xiao_flag=1;break;//遇到小数点跳到“if(xiao_flag)”里case '!': fu_flag=1;break;case '+': xiaoshu=1;yun_sign='+';if(opr_temp==0){end=opr _temp=opr_1;}else hun_he(lianji_sign);opr_1=0;lianji_sign='+'; br eak;case '-': xiaoshu=1;yun_sign='-';if(opr_temp==0){end=opr_temp=opr_1;}else hun_he(lianji_sign );opr_1=0;lianji_sign='-'; break;case 'x': xiaoshu=1;yun_sign='x';if(opr_temp==0){end=opr_temp=opr_1;}else hun_he(lianji_sign);opr_1=0;lianji_sign='*';brea k;case '/': xiaoshu=1;yun_sign='/';if(opr_temp==0){end=opr_ temp=opr_1;}else hun_he(lianji_sign);a=opr_1;opr_1=0;lianji_sig n='/';break;case '=':switch(yun_sign)//进行运算{case '+':end=opr_temp+opr_1;break;case '-':end=opr_temp-opr_1;break;case 'x':end=opr_temp*opr_1;break;case '/':{if(a==0)//减数为零显错{ LCD_inter_command(0xc0);for(j=0;j<=4;j++){LCD_inter_dat(tab3[j]);beer=0;delay(4000);//延时beer=1;}}else{end=opr_temp/opr_1;}break;}default:break;}ok=1;//开始进行显示,标志位置1xiabiao=0;//小数的标志位清零break;default:break;}i++;if(xiao_flag)//表示小数{while(tab[i]<=0x39&&tab[i]>=0x30){xiaoshu*=0.1;switch(n){case '+': opr_1=opr_1+(tab[i++]-0x30)*xiaoshu;break; case '-': opr_1=opr_1-(tab[i++]-0x30)*xiaoshu; break ; default:break; }xiao_flag=0;}}if(fu_flag){while(tab[i]<=0x39&&tab[i]>=0x30){n=0;opr_1=-opr_1*10;opr_1=-(opr_1+(tab[i++]-0x30));n='-';fu_flag=0;}}}opr_1=0;opr_temp=0; xiabiao=0; xiaoshu=1;下方为原理图:。
基于51单片机的简易计算器设计

基于单片机的简易计算器设计摘要2关键字:80C51 LCD1602 4*4矩阵键盘计算器2第一章绪论21。
1系统开发背景21。
2系统开发意义21.3设计目的21。
4设计任务2第二章单片机发展现状22.1目前单片机的发展状况22。
1。
1单片机的应用场合32.2计算器系统现状42.3简易计算器系统介绍4第三章系统硬件设计及说明43。
1系统组成及总体框图53.2AT89S52单片机介绍63。
3其它器件介绍及说明83.3.1 LCD1602液晶显示83。
3.2 4*4矩阵扫描按键9第四章 PROTEUS模拟仿真11第五章系统硬件设计及说明11第六章软件设计116.1汇编语言和C语言的特点及选择116.2源程序代码12摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算机在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计主要以80C51单片机为控制芯片,用C语言进行编程实现,通过4*4矩阵键盘控制,输出用液晶屏LCD1602显示,该计算器可以实现一般的加减乘除四则混合运算。
关键字:80C51 LCD1602 4*4矩阵键盘计算器第一章绪论1.1 系统开发背景随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较的常见的电子产品之一。
如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好的为各个行业服务,成了如今电子领域重要的研究课题.1.2 系统开发意义今天,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店,办公室,学校……。
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 单片机是指英特尔公司生产的 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液晶显示简易计算器设计..

#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]);}}}。
基于单片机的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单片机适合于许多较为复杂控制应用场合。
1602液晶显示计算器00.

1602液晶显示计算器院系:机械工程学院班级:测控1003姓名:金飞完成时间:2012年11月18日摘要本设计由51单片机作为核心,4*4矩阵键盘作为输入,将数据输入到单片机内部处理,并通过1602液晶显示出来运算及其结果。
本设计具有成本低廉,操作简单。
可作为日常简单计算使用。
关键词:51单片机、矩阵键盘、1602液晶。
一、外观介绍:二、电路仿真:P0.0~P0.7引脚接lcd的D0-D7,P3口接矩阵键盘。
单片机的P2.4、P2.0、P2.3脚分别接到LCD的RS、R/W、E管。
三、显示电路,LCD1602A的引脚详细介绍:采用LCD1602A来显示,要求能显示两行。
它的D—7D引脚分别接到单片机的P0.0~P0.7引脚;RS、R/W、E管脚分别接到单片机的P2.4、P2.0、P2.3 。
具体连接见后面的电路图。
以下是1602的16进制ASCII码表三、矩阵键盘扫描电路P3口的P3.0,P3.1,P3.2和P3.3四根线作为按键的行输出线,用P3.4,P3.5,P3.6和P3.7作为按键的列输入线。
依次给某一行低电平,再判断哪一列是低电平。
于是就判断出哪行和哪列导通。
对于不同的组合可以确定所有按键位置,将位置赋值到一个变量中,以供使用。
具体来说:假如按下的是数字5键(编号6——位于第二行第二列),首先置第一行为低电平其他7位为高电平P0=0xfe,再检测高四位的电平(P0=P&0xf0 ),因为列没有一条与第一行相导通,所以P0的高位还是高电平的。
然后再换第二行P0=0xfd,同理检测高四位(P0=P&0xf0 )得出P0=0xd0,则5键所在位置为第二行第二列,然后num赋值为6。
四、程序分析可知共分为七个模块:键盘扫描部分,定义各个位置上的键值部分,延迟部分,存贮部分,液晶显示部分,运算部分,动态显示部分。
主程序流程图如下:否判断是否有键按下五、程序#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit lcden=P2^3;sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,temp,num,num_1;long a,b,c;float a_c,b_c;uchar flag,fuhao;uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30}; void delay(uchar z){uchar y;for(z;z>0;z--)for(y=0;y<110;y++);}void check(){do{P0=0xFF;rs=0;rw=1;lcden=0;delay(1);lcden=1;}while(busy==1);}void write_com(uchar com){P0=com;rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(uchar date) {P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init(){num=-1;lcden=1;write_com(0x01);write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x80);write_com(0x01);num_1=0;i=0;j=0;a=0;b=0;c=0;flag=0;fuhao=0;}void keyscan(){P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){temp=P3&0xf0;{case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2){if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}Else{b=b*10+table[num];}}else{flag=1;fuhao=4;}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;{case 0xe0:num=4;break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6&&num!=7) {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}Else{flag=1;fuhao=3;}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;{case 0xe0:num=8;break;case 0xd0:num=9;break;case 0xb0:num=10;break;case 0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10) {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}Else{b=b*10+table[num];}}else if(num==11){flag=1;fuhao=2;}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){switch(temp){case 0xe0:num=12;break;case 0xd0:num=13;break;case 0xb0:num=14;break;case 0x70:num=15;break;}}while(P3!=0xf7);switch(num){case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;} break;case 13:{if(flag==0){a=a*10;write_date(0x30);P1=0;}else if(flag==1){b=b*10;write_date(0x30);}}break;case 14:{j=1;if(fuhao==1){write_com(0x80+0x4f);write_com(0x04);c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_com(0x80+0x4f);write_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;i++;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}break;}}}main(){init();while(1){keyscan();}}以下程序才对#include<reg52.h> //头文件#define uint unsigned int //#define uchar unsigned charsbit lcden=P2^5; //定义引脚sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char chufa=0;char chenfa=0;char jiafa=0;char jianfa=0;/***sbit dula=P2^6;sbit wela=P2^7;***/uchar code table2[]="overflow";char i,j,temp,num,num_1;long a,b,c; //a,第一个数b,第二个数c,得数long a_c,b_c; //floatuchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};void delay(uchar z) // 延迟函数{uchar y;for(z;z>0;z--)for(y=0;y<110;y++);}void check() // 判断忙或空闲{do{P0=0xFF;rs=0; //指令rw=1; //读lcden=0; //禁止读写delay(1); //等待,液晶显示器处理数据lcden=1; //允许读写}while(busy==1); //判断是否为空闲,1为忙,0为空闲}void write_com(uchar com) // 写指令函数{P0=com; //com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(uchar date) // 写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init() //初始化{num=-1;/***dula=0;wela=0;***/lcden=1; //使能信号为高电平write_com(0x38); //8位,2行write_com(0x0c); //显示开,光标关,不闪烁*/write_com(0x06); //增量方式不移位write_com(0x80); //检测忙信号write_com(0x01); //显示开,光标关,不闪烁num_1=0;i=0;j=0;a=0; //第一个参与运算的数b=0; //第二个参与运算的数c=0;flag=0; //flag表示是否有符号键按下,fuhao=0; // fuhao表征按下的是哪个符号}void keyscan() // 键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20); //延迟20msif(P3!=0xfe){temp=P3&0xf0;switch(temp){case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2)//如果按下的是'7','8'或'9if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else//如果按下的是'/'{flag=1;fuhao=4;//4表示除号已按chufa++;if (chufa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);chufa = 0;}/*** chenfa++;if(chenfa==1){write_date(0x21);chenfa=0;}***/}i=table1[num];write_date(0x30+i);}if(P3!=0xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;switch(temp){case 0xe0:num=4;break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6)//如果按下的是'4','5'或'6' {if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else//如果按下的是'/'{flag=1;fuhao=3;//3表示乘号已按chenfa++;if (chenfa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);chenfa = 0;}}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;switch(temp){case 0xe0:num=8;break;case 0xd0:num=9;break;case 0xb0:num=10;break;case 0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10)//如果按下的是'1','2'或'3' {if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else if(num==11)//如果按下的是'-' {flag=1;fuhao=2;//2表示减号已按jianfa++;if (jianfa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);jianfa = 0;}}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){temp=P3&0xf0;switch(temp){case 0xe0:num=12;break;case 0xd0:num=13;case 0xb0:num=14;break;case 0x70:num=15;break;}}while(P3!=0xf7);switch(num){case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"break;case 13:{ //按下的是"0"if(flag==0)//没有按过符号键{a=a*10;write_date(0x30);P1=0;}else if(flag==1)//如果按过符号键{b=b*10;write_date(0x30);}}break;case 14:{j=1;rw=0;rs=0;if(fuhao==1){write_com(0x0f);//按下等于键,光标前进至第二行最后一个显示处0x80+0x4fwrite_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;delay(10);while(c!=0){write_date(0x30+c%10);//c=c/10;write_date(0x3d); //再写"="a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_com(0x0f);//光标前进至第二行最后一个显示处0x80+0x4fwrite_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d); //再写"="a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_com(0x0f); //0x80+0x4fwrite_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);//write_date(0x30);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_com(0x40+0x4f); //0x80+0x4fwrite_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;jiafa++;if (jiafa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);jiafa = 0;}}break;}}}/*void key(){P3=0xfe;if(P3!=0xfe){delay(5);if(P3!=oxfe){temp=P3&0xf0;}}}*/main(){init();while(1) {keyscan(); }}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(); //显示结果}}}}。