1602液晶显示计算器00文档格式.docx

上传人:b****2 文档编号:15372138 上传时间:2022-10-29 格式:DOCX 页数:28 大小:193.05KB
下载 相关 举报
1602液晶显示计算器00文档格式.docx_第1页
第1页 / 共28页
1602液晶显示计算器00文档格式.docx_第2页
第2页 / 共28页
1602液晶显示计算器00文档格式.docx_第3页
第3页 / 共28页
1602液晶显示计算器00文档格式.docx_第4页
第4页 / 共28页
1602液晶显示计算器00文档格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

1602液晶显示计算器00文档格式.docx

《1602液晶显示计算器00文档格式.docx》由会员分享,可在线阅读,更多相关《1602液晶显示计算器00文档格式.docx(28页珍藏版)》请在冰豆网上搜索。

1602液晶显示计算器00文档格式.docx

采用LCD1602A来显示,要求能显示两行。

它的—引脚分别接到单片机的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>

#defineuintunsignedint

#defineucharunsignedchar

sbitlcden=P2^3;

sbitrs=P2^4;

sbitrw=P2^0;

sbitbusy=P0^7;

chari,j,temp,num,num_1;

longa,b,c;

floata_c,b_c;

ucharflag,fuhao;

ucharcodetable[]={

7,8,9,0,

4,5,6,0,

1,2,3,0,

0,0,0,0};

ucharcodetable1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

voiddelay(ucharz)

{

uchary;

for(z;

z>

0;

z--)

for(y=0;

y<

110;

y++);

}

voidcheck()

do{

P0=0xFF;

rs=0;

rw=1;

lcden=0;

delay

(1);

lcden=1;

}while(busy==1);

voidwrite_com(ucharcom)

P0=com;

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

voidwrite_date(uchardate)

P0=date;

rs=1;

voidinit()

num=-1;

write_com(0x01);

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

num_1=0;

i=0;

j=0;

a=0;

b=0;

c=0;

flag=0;

fuhao=0;

voidkeyscan()

P3=0xfe;

if(P3!

=0xfe)

delay(20);

if(P3!

{

temp=P3&

0xf0;

switch(temp)

case0xe0:

num=0;

break;

case0xd0:

num=1;

case0xb0:

num=2;

case0x70:

num=3;

}

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;

=0xfd)

delay(5);

num=4;

num=5;

num=6;

num=7;

=0xfd);

if(num==4||num==5||num==6&

&

num!

=7)

if(flag==0)

else

fuhao=3;

P3=0xfb;

=0xfb)

num=8;

num=9;

num=10;

num=11;

=0xfb);

if(num==8||num==9||num==10)

elseif(num==11)

fuhao=2;

P3=0xf7;

=0xf7)

num=12;

num=13;

num=14;

num=15;

=0xf7);

switch(num)

case12:

{write_com(0x01);

}

case13:

{

a=a*10;

write_date(0x30);

P1=0;

elseif(flag==1)

b=b*10;

case14:

{j=1;

if(fuhao==1){write_com(0x80+0x4f);

write_com(0x04);

c=a+b;

while(c!

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);

a=0;

elseif(fuhao==2){write_com(0x80+0x4f);

if(a-b>

0)

c=a-b;

c=b-a;

if(a-b<

write_date(0x2d);

elseif(fuhao==3){write_com(0x80+0x4f);

c=a*b;

elseif(fuhao==4){write_com(0x80+0x4f);

i=0;

c=(long)(((float)a/b)*1000);

i++;

if(i==3)

write_date(0x2e);

if(a/b<

case15:

{write_date(0x30+table1[num]);

flag=1;

fuhao=1;

main()

init();

while

(1)

keyscan();

以下程序才对

reg52.h>

//头文件

#defineuintunsignedint//

sbitlcden=P2^5;

//定义引脚

sbitrw=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1