51单片机C语言1602液晶显示程序解析

51单片机C语言1602液晶显示程序解析,第1张

这个是1602内部结构决定的,你只需要在初始化的时候先设置三次显示,然后再设置你的其他要求。

芯片厂家推荐的用法:

INT:

MOV

A,#30H

MOV

DATR,#CW_ADD

MOV

R2,#03H

INT1:

MOVX

@DPTR,A

CALL

DELAY

DJNZ

R2,INT1

这上面就是1602对于51单片机推荐的初始化之前加的三次模式设置

先定义一下LCD的使能端口一些设置

例如:

sbit LCD_RS = P2^6 //复位端

sbit LCD_RW = P2^5 //写数据

sbit LCD_EP = P2^7 //使能端

添加读写以及初始化LCD的代码

/****************侧忙函数************************/

BOOL lcd_bz()

{

BOOL result

LCD_RS = 0

LCD_RW = 1

LCD_EP = 1

_nop_()

_nop_()

_nop_()

_nop_()

result = (BOOL)(P0 &0x80) //检测P0最高位是否为1

LCD_EP = 0

return result//返回侧忙结果

}

/****************写命令函数************************/

lcd_wcmd(BYTE cmd)

{ // 写入指令数据到LCD

while(lcd_bz())

LCD_RS = 0

LCD_RW = 0

LCD_EP = 0

_nop_()

_nop_()

P0 = cmd//将8位指令通过P0口传给1602

_nop_()

_nop_()//用于产生一个脉冲宽度

_nop_()

_nop_()

LCD_EP = 1

_nop_()

_nop_()

_nop_()

_nop_()

LCD_EP = 0

}

lcd_pos(BYTE pos)

{ //设定显示位置

lcd_wcmd(pos | 0x80)

}

/****************写数据函数************************/

lcd_wdat(BYTE dat)

{ //写入字符显示数据到LCD

while(lcd_bz())

LCD_RS = 1

LCD_RW = 0

LCD_EP = 0

P0 = dat //将8位数据通过P0口传给1602

_nop_()

_nop_() //用于产生一个脉冲宽度

_nop_()

_nop_()

LCD_EP = 1

_nop_()

_nop_()

_nop_()

_nop_()

LCD_EP = 0

}

lcd_init()

{ //LCD初始化设定

lcd_wcmd(0x38)//16*2显示,5*7点阵,8位数据

delay(1)

lcd_wcmd(0x0c)//显示开,关光标

delay(1)

lcd_wcmd(0x06)//移动光标

delay(1)

lcd_wcmd(0x01)//清除LCD的显示内容

delay(1)

}

添加完之后在main函数中添加初始化LCD的函数

例如

void main(void)

{

BYTE i

lcd_init()// 初始化LCD

delay(10)

while(1)

{

lcd_wcmd(0x06)//向右移动光标

lcd_pos(0)//设置显示位置为第一行的第1个字符

i = 0

tt.XX.number = ?? //这边问好表示你需要显示的数据,这样你应该明白怎么做了

//将你的数据赋值给number即可,然后让他显示dis的数据

while(tt.dis1[ i ] != '\0')

{

lcd_wdat(dis1[ i ])

i++

delay(30)//控制两字之间显示速度

}

delay(500)//控制两字之间显示速度

lcd_wcmd(0x01)//清除LCD的显示内容

}

}

//程序的定义头文件下写这个,主要是省去数据转换这一环节,让自己代码更加快速转换

typedef union

{

unsigned char dis1[4]

struct

{

int number

}XX

}TT

idata TT tt

#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++)

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存