求助51单片机 显示器1602的输出代码

求助51单片机 显示器1602的输出代码,第1张

#include <string.h>

sbit RS=P1^0

sbit RW=P1^1

sbit EN=P1^2

sbit DATA=P2  //定义LCD1602管脚

void lcd1602_display_str(unsigned char x,bit y,unsigned char dat[]) //x:列 0-15 y:行 0-1 dat写入的东西

void lcd1602_display_byte(unsigned char x,bit y,unsigned char ascll)

void lcd1602_init()

void lcd1602_write(bit sign, unsigned char dat)    //sign=0 :写入命令   sign=1:写入数据

{

 delay_1ms(1)

 RS=sign

 RW=0

 EN=0

 DATA=dat

 EN=1

 delay_1ms(1)

 EN=1

 RS=0

}

void lcd1602_init()

{

delay_1ms(10)

lcd1602_write(0,0x38)

lcd1602_write(0,0x38)

lcd1602_write(0,0x38)

lcd1602_write(0,0x0c)

lcd1602_write(0,0x01)

}

void lcd1602_display_str(unsigned char x,bit y,unsigned char dat[])

{

 unsigned char point=0x80+x

 unsigned char len=16

 unsigned char j=0

 if(y)

 {point+=0x40}

 lcd1602_write(0,point)

 len=strlen(dat)

 for(j=0j<lenj++)

 {

  lcd1602_write(1,dat[j])

 }

}

void lcd1602_display_byte(unsigned char x,bit y,unsigned char ascll)

{

 unsigned char point=0x80+x

 if(y)

 {point+=0x40}

 lcd1602_write(0,point)

 lcd1602_write(1,ascll)

}

以上是基础程序,也就是LCD1602的工作程序(注意我的延时函数未写出,请根据实际芯片的速度写延时函数)

unsigned char  table[]="  Hello,World   " 

 lcd1602_init() 

lcd1602_display_str(0,1,table)

以上是工作程序(显示字符串),注意的是LCD一行最多16个字符,而且不支持中文,这是在第一列第二行输出的Hello,World,包括空格,一共16个字符。

如果是STC89C52的话,可以使用以下的延时函数

void delay_1ms(unsigned int n)

{

unsigned int i=0,j=0

 for(i=0i<ni++)

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

}

* 1、LCD第一行显示: www.saxmcu.com

* LCD第二行显示: SP-28A--DIY

* 2、先将两行字符写入DDRAM中,然后从右至左逐字移出显示。

* 3、在指定位置停留1.6秒后,闪烁2次,清屏。

* 4、反复循环上述显示方式。

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

LCD_RS EQU P2.0

LCD_RW EQU P2.1

LCD_EN EQU P2.2

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

ORG 0000H

AJMP MAIN

ORG 0030H

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

MAIN:

MOV SP,#60H

ACALL LCD_INIT LCD初始化

MAIN1:

ACALL CLR_LCD 清LCD

MOV A,#90H在第一行第17列的位置

ACALL LCD_CMD

MOV DPTR,#LINE1 第一行字符串的起始地址送入DPTR。

ACALL WRITE

MOV A,#0D0H 在第二行第17列的位置

ACALL LCD_CMD

MOV DPTR,#LINE2 第二行字符串的起始地址送入DPTR。

ACALL WRITE

MOV R3,#10H 向左移动16格

LOOPA:

MOV A,#18H 字符同时左移一格

ACALL LCD_CMD

MOV R5,#03H 延时375MS

ACALL DELAY125MS

DJNZ R3,LOOPA

ACALL DELAY4延时1.6s

ACALL DELAY4

MOV R4,#02H设置闪烁次数

ACALL FLASH 开始闪烁

AJMP MAIN1

LINE1:

DB "www.saxmcu.com",00H

LINE2:

DB "SP-28A--DIY",00H

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

LCD初始化设定子程序

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

LCD_INIT:

ACALL DELAY5MS延时15MS

ACALL DELAY5MS等待LCD电源稳定

ACALL DELAY5MS

MOV A,#38H 16*2显示,5*7点阵,8位数据

ACALL LCD_CMD_NC 不进行LCD忙检测

ACALL DELAY5MS

MOV A,#38H 16*2显示,5*7点阵,8位数据

ACALL LCD_CMD_NC 不进行LCD忙检测

ACALL DELAY5MS

MOV A,#38H 16*2显示,5*7点阵,8位数据

ACALL LCD_CMD_NC 不进行LCD忙检测

ACALL DELAY5MS

MOV A,#08H 显示关

ACALL LCD_CMD进行LCD忙检测

MOV A,#01H 清除屏幕

ACALL LCD_CMD进行LCD忙检测

MOV A,#0CH显示开,关光标

ACALL LCD_CMD 进行LCD忙检测

RET

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

清LCD子程序

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

CLR_LCD:

MOV A,#01H清除屏幕

ACALL LCD_CMD 进行LCD忙检测

RET

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

写指令数据到LCD

RS=L,RW=L,D0-D7=指令码,E=高脉冲

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

LCD_CMD:

CALL CHECKBUSY

LCD_CMD_NC:

CLR LCD_RS

CLR LCD_RW

MOV P0,A

SETB LCD_EN

NOP

NOP

NOP

NOP

CLR LCD_EN

RET

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

写显示数据到LCD

RS=H,RW=L,D0-D7=数据,E=高脉冲

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

LCD_WDATA:

ACALL CHECKBUSY

SETB LCD_RS

CLR LCD_RW

MOV P0,A

SETB LCD_EN

NOP

NOP

NOP

NOP

CLR LCD_EN

RET

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

检测LCD控制器忙状态

读数据

RS=L,RW=H,E=H,输出:D0-D7=数据

P0.7=1,LCD忙,等待。P0.7=0,LCD闲,可以进行读写 *** 作。

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

CHECKBUSY:

PUSH ACC

MOV P0,#0FFH

CLR LCD_RS

SETB LCD_RW

SETB LCD_EN

BUSYLOOP:

NOP

JB P0.7,BUSYLOOP

CLR LCD_EN

POP ACC

RET

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

发送字符串子程序

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

WRITE:

PUSH ACC

WRITE1:

CLR A

MOVC A,@A+DPTR

JZ WRITE2

INC DPTR

ACALL LCD_WDATA

JMP WRITE1

WRITE2:

POP ACC

RET

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

闪烁子程序

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

FLASH:

MOV A,#08H关闭显示

ACALL LCD_CMD

ACALL DELAY4

MOV A,#0CH开显示,关闭光标

ACALL LCD_CMD

ACALL DELAY4

DJNZ R4,FLASH

RET

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

延时5MS子程序

LCD初始化使用

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

DELAY5MS:

MOV R6,#10

DL1:

MOV R7,#249

DL2:

DJNZ R7,DL2

DJNZ R6,DL1

RET

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

延时125MS子程序

字符串移动时使用

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

DELAY125MS:

DL3:

MOV R6,#250

DL4:

MOV R7,#249

DL5:

DJNZ R7,DL5

DJNZ R6,DL4

DJNZ R5,DL3

RET

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

延时800MS子程序

闪烁时使用

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

DELAY4:

MOV R5,#40

DL6:

MOV R6,#100

DL7:

MOV R7,#100

DL8:

DJNZ R7,DL8

DJNZ R6,DL7

DJNZ R5,DL6

RET

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

END

可以吧?


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存