基于51单片机的液晶显示屏LCD1602简单计算器程序

发布者:幸福的老农最新更新时间:2018-06-25 来源: eefocus关键字:51单片机  液晶显示屏  LCD1602 手机看文章 扫描二维码
随时随地手机看文章

/*     S16 S12 S8 S4分别是123+
S15 S11 S7 S3分别是456-
S14 S10 S6 S2分别是789*
S13 S9 S5 S1分别是0 CE =/
*/


/* 实现两个数的运算,每个数的位数至少可以八位 (在液晶显示屏LCD1602上显示) */
#include

typedef unsigned char uint8;
typedef unsigned int uint16;


sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;


uint8 key=0,num=0;
uint8 fuhao=0;          //定义具体的那个符号,是加减还是乘除。
uint8 flag=0;         //定义有没有按下符号键,这个是统称
long a=0,b=0,c=0,d=0; //定义运算数据的第一个和第二个及等于的数变量
uint8 k;                //定义小数点后面显示的位数
uint8 biao=0;


uint8 dat1[]={ 1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据


void delay(uint16 i)
{
while(i--);
}


void lcdwrc(uint8 c)
{
e=0;
rs=0;
rw=0;

P0=c;
delay(1000);


e=1;
delay(500);
e=0;
}


void lcdwrd(uint8 dat)
{
e=0;
rs=1;
rw=0;

P0=dat;
delay(1000);


e=1;
delay(1000);
e=0;
}


void lcdinit()
{
lcdwrc(0x38);
lcdwrc(0x0c);
lcdwrc(0x06);
lcdwrc(0x01);
lcdwrc(0x80);
}


void keyscan()
{
P1=0xfe;   //令第一行为0,然后判断是哪一列按下
if(P1!=0xfe)
{
delay(1000);
if(P1!=0xfe)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=0;break;   //1
case 0xd0: num=1;break;   //2
case 0xb0: num=2;break;   //3
case 0x70: num=3;break;   //加
}
}
while(P1!=0xfe);
if(num==0||num==1||num==2)  //确认第一行的数1,2,3
{
if(flag==0)  //没有按下符号键
{
a=a*10+dat1[num];
}
else
{
b=b*10+dat1[num];
}

}
else
{
flag=1;
fuhao=1;//加号+
}
lcdwrd(0x30+dat1[num]);
}




P1=0xfd; //令第二行为0,判断是哪一列按下
if(P1!=0xfd)
{
delay(1000);
if(P1!=0xfd)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=4;break;   //4
case 0xd0: num=5;break;   //5
case 0xb0: num=6;break;   //6
case 0x70: num=7;break;   //减—
}
}
while(P1!=0xfd);
if(num==4||num==5||num==6)
{
if(flag==0)  //没有按下符号键
{
a=a*10+dat1[num];
}
else
{
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=2;//带表减号
}
lcdwrd(0x30+dat1[num]);
}




P1=0xfb;  //令第三行为0,判断哪一列按下
if(P1!=0xfb)
{
delay(1000);
if(P1!=0xfb)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=8;break;   //7
case 0xd0: num=9;break;   //8
case 0xb0: num=10;break;  //9
case 0x70: num=11;break;  //乘*
}
}
while(P1!=0xfb);
if(num==8||num==9||num==10)
{
if(flag==0)  //没有按下符号键
{
a=a*10+dat1[num];
}
else
{
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=3;//带表乘号*
}
lcdwrd(0x30+dat1[num]);
}




P1=0xf7;  //令第四行为0,判断哪一列按下
if(P1!=0xf7)
{
delay(1000);
if(P1!=0xf7)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=12;break;  //0
case 0xd0: num=13;break;  //清除rst
case 0xb0: num=14;break;  //等号=
case 0x70: num=15;break;  //除/
}
}
while(P1!=0xf7);
switch(num)
{
case 12: 
if(flag==0)  //没有按下符号键
{
a=a*10+dat1[num];
lcdwrd(0x30);
}
else
{
b=b*10+dat1[num];
lcdwrd(0x30);
}
break;

case 13: 
lcdwrc(0x01); //清屏指令
a=0;
b=0;
flag=0;
fuhao=0;
break;


case 15:

flag=1;
fuhao=4;
lcdwrd(0x2f);//除号/
break;

case 14: 
if(fuhao==1)//加
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a+b;
while(c!=0)  //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==2)   //减
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
if(a>b)
c=a-b;
else
c=b-a;

while(c!=0)  //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
if(a lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==3)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a*b;
while(c!=0)  //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==3)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a*b;
while(c!=0)  //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==4)
{
k=0;
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=(long)(((float)a/b)*1000);//强制转换为long。
while(c!=0)  //一位一位显示
{
k++;
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
if(k==3)
{
lcdwrd(0x2e);
k=0;
}
}
if(a {
lcdwrd(0x30);
}
lcdwrd(0x3d); //显示等号
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
break;
}
}
}


void main()
{
lcdinit();
while(1)
{
keyscan();
}
}

关键字:51单片机  液晶显示屏  LCD1602 引用地址:基于51单片机的液晶显示屏LCD1602简单计算器程序

上一篇:如何编写51单片机超声波测距SR04_lcd1602显示程序
下一篇:51单片机控制LCD1602模块

推荐阅读最新更新时间:2024-03-16 16:06

[51单片机学习笔记FIVE]----独立按键
一、8个按键控制8个LED灯 1 /******************************************************************************* 2 实验名称: 8个独立按键控制8盏LED灯(按下哪个键,那个键对应的LED亮) 3 实验时间: 2015/1/20 4 *******************************************************************************/ 5 #include reg51.h 6 7 #define LED_KEY P0 //LED灯用P0口 8 #define
[单片机]
[<font color='red'>51单片机</font>学习笔记FIVE]----独立按键
8051单片机有哪些复位方法
问题:8051单片机复位后,各寄存器的初始状态如何?复位方法有几种? 解答:8051单片机复位后机器的初始状态,即各寄存器的状态:PC之外,复位操作还对其它一些特殊功能寄存器有影响,它们的复位状态如下: 寄存器 复位时内容 寄存器 复位时内容 PC 0000H TCON 0×000000B ACC 00H TL0 00H B 00H TH0 00H PSW 00H TH1 00H SP 07H TH1 00H DPTR 0000H SCON 00H P0—P3 FFH SBUF 不确定 TMOD ××000000B PCON 0×××0000B 单片机复位方法有:上电自动复位,按键电平复位和外部脉冲三种方式。
[单片机]
AT89S51单片机原理与应用
一、AT89S51与AT89C51的区别 这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年推出的产品,典型产品有8031(内部没有程序存储器,实际使用方面已经被市场淘汰)、8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在,MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51、已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。 有些文献甚至也将8051泛指MCS-51系列单片机,8051是早期的最典型的代表作,由于MCS-51单
[单片机]
51单片机定时器模式1使用
特殊功能寄存器如下 使用TCON和TMOD TF:溢出标志 为1时表示溢出 需要手工置0 TR:开始计时 为1开始 为0停止 M1,M0 :工作模式 01为模式1 //16位 65536 GATE门暂不使用 置0 C/T:定时/计数 TH0,TL0:定时器0初始值 方法: 1、设定TMOD 2、设定初始值TH TL 3、设定TCON 开始计时 实例:共阳七段数码管0-F循环显示延时1s 七段共阳数码管真值表 const uint8 ledcode ={ 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x
[单片机]
<font color='red'>51单片机</font>定时器模式1使用
以AT89C51单片机为控制核心的低成本高精度倒计时系统设计
1 引 言 倒计时系统的任务, 就是对某一设定日期进行倒数, 并在显示屏显示当前至设定日期的时间, 以增强人们的关注度和紧迫感。开发实践表明: 以时钟芯片DS12C887为时钟模块、单片机AT89C51为控制模块的高精度倒计时系统具有精度高、能够长时间连续稳定地工作、使用方便的特点, 可较好满足实际需要。系统的硬件设计和软件设计如下。 2 系统的硬件设计 系统的控制模块由AT89C51单片机构成, 用于完成对串行口控制器的初始化和数据读写, 并对接收的各种数据进行识别、转储及显示。时钟芯片DS12C887提供高精度的年、月、日、时、分、秒时间,校准后直接与单片机相连。倒计时显示模块由LED数码管, 74HC595芯片和74L
[单片机]
以AT89C<font color='red'>51单片机</font>为控制核心的低成本高精度倒计时系统设计
基于单片机的流水灯介绍_51单片机流水灯的五种实现方法
本文为大家带来五种51单片机流水灯的实现方法。 51单片机流水灯原理 为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。 实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P
[嵌入式]
51单片机——存储器
1.存储器概述 存储器是许多存储单元的集合,存储器单元实际上是时序逻辑电路(锁存器)的一种,按单元号顺序排列。每个单元由若干二进制位构成,以表示存储单元中存放的数值,这种结构和数组的结构非常相似。按存储器的使用类型可分为只读存储器(ROM)和随机存取存储器(RAM)。 1.1 存储单位 位(bit):它是计算机中最小的数据单位。由于计算机采用二进制数,所以1位二进制数称作1bit,例如101011为6bit。 字节(Byte,单位简写为B):8位二进制数称为一个字节,1B=8bit。 字(Word):两个字节构成一个字,即2Byte=1Word。 在单片机中还有一个常用术语:字长。所谓字长是指单片机一次能处理的二进制数
[单片机]
<font color='red'>51单片机</font>——存储器
C51单片机 的定时器学习笔记
/*-------------------------------------------------------*/ /* -------------author: robinson_911 -------------------------*/ /* -------------date:2014年2月 -------------------------*/ /* -------------content:关于串口 定时器程序 -----------*/ // 在22.1184MHZ下,通过定时器0,每1s通过串口发送数据 /*---------------------------------------------------
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved