51单片机编写lcd1602显示程序,第一行显示自己的姓名,第二行显示学号

51单片机编写lcd1602显示程序,第一行显示自己的姓名,第二行显示学号,第1张

1、首先我们打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并启动器添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。

2、导入51单片机的头文件以及LCD1602的头文件。

3、创建一个延时函数,可以传入想要具体延时的时长,其内部实现是由一个二重循环,两个循环的次数相乘积。

4、然后创建写命令的函数,指定RS和E同时为0时,才可以写入命令,设定完成后,将com写入输出端口,规定写命令时,E为正脉冲,然后空 *** 作一个机器周期等待机器反应。

5、然后创建写数据的函数,规定写数据时,E为正脉冲,规定当RS=1和RW=0时才可以写入数据,然后将数据从输出端口输出,最后让E产生正跳变。

6、然后创建初始化LCD1602的函数,指定显示模式位两行显示,5*7,8位数据、整体显示,无光标,无闪烁、写入一个字符后地址指针加1,最后进行清屏 *** 作。

7、最后在主函数中首先执行LCD1602的初始化函数,首先创建一个无限循环,然后添加两个字符串,这里以两行显示百度经验的网址为例,再进行延时以及使用清屏函数进行刷新。

这是一个在某行某列显示字符串的程序,LCD1602只能显2行,每行16个字符,因此line<1时是第一行,否则为第二行。第二行的地址比第二行多出0X40。由于显示位置到行尾可显示16-X个字符,因此程序中要判断i<16-X。P是个指针,指向要显示的字符。

#define LCD1602_FLAG

#define LCD1602_PORT P0

#include<reg51.h>

#include<stddef.h>

#define uchar unsigned char

sbit lcd1602_rs=P2^0

sbit lcd1602_e=P2^2

sbit lcd1602_rw=P2^1

sbit lcd1602_busy=P0^7

uchar str[]="StopWatch"

uchar time,disdat[4]

uchar dat,sec,key

void delay(uchar a)

{

uchar i

while(a--)for(i=0i<120i++)

}

/*

************************************

* 函数名称:lcd1602_CheckBusy()

* 函数功能:状态查询

************************************

*/

void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1

lcd1602_rs=0

lcd1602_rw=1

lcd1602_e=0

lcd1602_e=1

}

while(lcd1602_busy)

}

/*

***************************************

* 函数名称: lcd1602_WriteCmd()

* 函数功能:写命令

* 入口参数:命令字

* 出口参数:无

***************************************

*/

void lcd1602_WriteCmd(const uchar cmd)

{

lcd1602_CheckBusy()

lcd1602_rs=0

lcd1602_rw=0

lcd1602_e=1

LCD1602_PORT=cmd

lcd1602_e=0

}

/*

*******************************************

* 函数名称:lcd1602_WriteData()

* 函数功能:写数据

* 入口参数:c--待写数据

* 出口参数:无

*********************************************

*/

void lcd1602_WriteData(const uchar c)

{

lcd1602_CheckBusy()

lcd1602_rs=1

lcd1602_rw=0

lcd1602_e=1

LCD1602_PORT=c

lcd1602_e=0

}

/*

***********************************************

* 函数名称:lcd1602_Init()

* 函数功能:初始化LCD

* 入口参数:无

* 出口参数:无

***********************************************

*/

void lcd1602_Init()

{

lcd1602_WriteCmd(0x38) //显示模式为8位2行5*7点阵

lcd1602_WriteCmd(0x0c)//display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06)//flag move to right,screen don't move

lcd1602_WriteCmd(0x01)//clear screen

}

/*

************************************************

* 函数名称:lcd1602_Display()

* 函数功能: 字符显示

* 入口参数:ptr--字符或字符串指针

* 出口参数:无

* 说    明:用户可通过以下方式来调用:

*           1)lcd1602_Display("Hello,world!")

*           2) INT8U 存储类型 txt[]="要显示的字符串"

*              或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'}

*              INT8U *ptr

*              ptr=&txt

*              lcd1602_Display(ptr)

*              或 lcd1602_Display(txt)

*              或 lcd1602_Display(&txt)

************************************************

*/

void lcd1602_Display(const uchar *ptr,uchar line)

{

uchar data i=0

uchar *data q

q=ptr

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80)

while(q!=NULL &&(*q!='\0') &&i<16)

{

lcd1602_WriteData(*q)

q++

i++

}

break

case 1:

lcd1602_WriteCmd(0xc0)

while(q!=NULL &&(*q!='\0') &&i<16)

{

lcd1602_WriteData(*q)

q++

i++

}

break

}

}

void dischg()

{

disdat[3]=dat+0x30

disdat[2]='.'

disdat[1]=sec%10+0x30

disdat[0]=sec/10+0x30

lcd1602_Display(disdat,1)

}

void ext0() interrupt 0

{

key++

key%=3

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c

TL0=0xb0

time++

if(time==2)

{

time=0

dat++

if(dat>=10)

{

dat=0

sec++

if(sec>59)sec=0

}

dischg()

}

}

main()

{

TMOD=0x01

TH0=0x3c

TL0=0xb0

TR0=0

ET0=1

EX0=1

IT0=1

EA=1

time=0

dischg()

lcd1602_Init()

lcd1602_Display(str,0)

lcd1602_Display(disdat,1)

while(1)

{

switch(key)

{

case 0:TR0=0break

case 1:TR0=1break

case 2:sec=0dat=0dischg()break

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11088861.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存