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

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; //后面的数字加1

sbit 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

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归0

countqian=0;

}

void jiayihou()//后边数字加1计数函数

{

if(shuzi22==0)//如果后面加1的按键按下

{

delay(50);//消除抖动

counthou=counthou+1;

}

if(counthou==999)//记到999归0

counthou=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(); //显示结果

}

}

}

}

相关主题
相关文档
最新文档