1602的资料,关于自定义字符的。试图写了一下,也修改了几次,成功了,下面来详细的再分析一下。
RS BIT P2.7(RS数据命令选择端,高电平为数据,低电平为命令)
RW BIT P2.6(RW读写选择端,高电平为读,低电平为写)
E BIT P2.5(使能端)
ORG 0000H(程序起始地址)
MAIN:
MOV R0,#8(R0中存入将要写如多少个数据,我们要写入8个数据所以R0中是8)
MOV 30H,#00 (30H清零,在下面的程序中作为数据指针使用)
MOV P3,#01H(01H-清屏显示指令)
ACALL ENABLE(调用命令写入子程序)
MOV P3,#38H(38H-设置1602显示模式)
ACALL ENABLE(调用命令写入子程序)
MOV P3,#0CH(0CH-开显示,不显示光标,不闪烁)
ACALL ENABLE(调用命令写入子程序)
MOV P3,#06H(06H-地址指针加一命令)
ACALL ENABLE(调用命令写入子程序)
MOV P3,#40H(40H-自定义第一个字符显示命令,CGRAM的地址是40H-07H)
ACALL ENABLE(调用命令写入子程序)
LOOP: MOV DPTR,#TAB (将表格中的数据送到DPTR中)
MOV A,30H(将30H中的数送到累加器A中)
MOVC A,@A+DPTR(查表)
MOV P3,A(将A中的数据送到P3口做输出)
ACALL WRITE(调用数据写入子程序)
INC 30H (30H中的数据加一)
DJNZ R0,LOOP(R0中送入的是8,减8次不为零跳转到LOOP处执行程序,是则往下继续执行)
MOV P3,#80H(规定显示的位置)
ACALL ENABLE(调用命令写入子程序)
MOV P3,#00H(定义显示第一个自定义的字符,一共可以显示8个,为00H-07H)
ACALL WRITE(调用数据写入子程序)
JMP $
ENABLE:{命令写入子程序}
CLR RS(RS数据命令选择端,低电平为命令)
CLR RW(RW读写选择端,地点平为写)
CLR E(E为使能端,使能端电平跳变,开始写命令)
ACALL DELAY1(延时,去忙)
SETB E(使能端电平变化,完成命令的写入)
RET(程序返回)
WRITE: {数据写入子程序}
SETB RS(RS数据命令选择端,高电平为数据)
CLR RW(RW读写选择端,低电平为写)
CLR E(E为使能端,使能端电平跳变,开始写命令)
LCALL DELAY1(延时,去忙)
SETB E(使能端电平变化,完成命令的写入)
RET(程序返回)
DELAY1: MOV R7,#255{延时程序}
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ R7,D1
RET
TAB: DB 0FH,09H,0FH,09H,0FH,09H,11H,00H
END
运行效果图:
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的初始化函数,首先创建一个无限循环,然后添加两个字符串,这里以两行显示百度经验的网址为例,再进行延时以及使用清屏函数进行刷新。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)