c语言编一段小程序,在液晶屏上实现显示"ABCD1234".用单片机AT 89c51

c语言编一段小程序,在液晶屏上实现显示"ABCD1234".用单片机AT 89c51,第1张

#include<reg51.h> //包含单片机寄存器的头文件

#include<intrins.h> //包含_nop_()函数定义的头文件

sbit RS=P2^5 //寄颤核段存器选择位,将RS位定义为P2.5引脚

sbit RW=P2^6 //读写选择位,将RW位定义为P2.6引脚

sbit EN=P2^7 //使能信号位,将氏滑EN位定义为P2.7引脚

sbit BF=P0^7 //忙碌标志位,,将BF位定义为P0.7引脚

unsigned char code string[ ]={"ABCD1234"} //字符串数组,存储待显示的字符串

/*****************************************************

函数功能:延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/

void delay1ms()

{

unsigned char i,j

for(i=0i<10i++)

for(j=0j<33j++)

}

/*****************************************************

函数功能:延时若干毫秒

入口参数:n

***************************************************/

void delay(unsigned char n)

{

unsigned char i

for(i=0i<ni++)

delay1ms()

}

/*****************************************************

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌result=0,不忙

***************************************************/

unsigned char BusyTest(void)

{

bit result

RS=0 //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1

EN=1 //EN=1,才允许读写

_nop_() //空 *** 作

_nop_()

_nop_()

_nop_() //空 *** 作四个机器周期,给硬件反应时间

result=BF //将忙碌标志电平赋给result

EN=0

return result

}

/*****************************************************

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

***************************************************/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1) //如果忙就等待

RS=0 //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0

EN=0 //EN置低电平(根据表8-6,写指令时,EN为高脉冲,

//就是让EN从0到1发生正跳变,所以应先置"0"

_nop_()

_nop_() //空 *** 作两个机器周期,给硬件反应时间

P0=dictate //将数据送入P0口,即写入指令或地址

_nop_()

_nop_()

_nop_()

_nop_() //空 *** 作四个机器周期,给硬件反应时间

EN=1 //EN置高电平

_nop_()

_nop_()

_nop_()

_nop_() //空 *** 作四个机器周期,给茄誉硬件反应时间

EN=0 //当EN由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:指定字符显示的实际地址

入口参数:x

***************************************************/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80)//显示位置的确定方法规定为"80H+地址码x"

}

/*****************************************************

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

***************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1)

RS=1 //RS为高电平,RW为低电平时,可以写入数据

RW=0

EN=0 //EN置低电平(根据表8-6,写指令时,EN为高脉冲,

//就是让EN从0到1发生正跳变,所以应先置"0"

P0=y //将数据送入P0口,即将数据写入液晶模块

_nop_()

_nop_()

_nop_()

_nop_() //空 *** 作四个机器周期,给硬件反应时间

EN=1 //EN置高电平

_nop_()

_nop_()

_nop_()

_nop_() //空 *** 作四个机器周期,给硬件反应时间

EN=0 //当EN由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:对LCD的显示模式进行初始化设置

***************************************************/

void LcdInitiate(void)

{

delay(15) //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38) //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5) //延时5ms 

WriteInstruction(0x38)

delay(5)

WriteInstruction(0x38)

delay(5)

WriteInstruction(0x0f) //显示模式设置:显示开,有光标,光标闪烁

delay(5)

WriteInstruction(0x06) //显示模式设置:光标右移,字符不移

delay(5)

WriteInstruction(0x01) //清屏幕指令,将以前的显示内容清除

delay(5)

}

void main(void) //主函数

{

unsigned char i

LcdInitiate() //调用LCD初始化函数

delay(10)

while(1)

{

WriteInstruction(0x01) //清显示:清屏幕指令

WriteAddress(0x00) //设置显示位置为第1行的第1个字。1602型LCD字符显示器在第1个地址显示完毕后,能自动指向下一地址,

//因此只要制定字符串的第1个字符的显示地址即可。

i = 0

while(string[i] != '\0')

{ //显示字符

WriteData(string[i])

i++

delay(150)

}

for(i=0i<4i++)

delay(250)

}

}

LCD有哪些寄存器?各核答表示什么含义,控制什么功能?

写出来的程序又如何验证是否正确?

其实,你只需要对LCD的打开、关闭,以及能把一个数据块显示在LCD上就改雹慧行了

“常见字母、数字、符号、中文、自定义字符、图形,以及文字和图形混和显示;光标显示/隐藏(Cursor

on/off)、显示字肆尺符闪烁(Display

character

blink);画面清除(Display

clear)、光标归位(Return

home)”

这些功能,只需要在这个数据块上进行 *** 作,然后再送到LCD显示。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存