LCD:1602和12864

发布时间 2023-11-20 22:20:20作者: 小小卷心菜

LCD1602
重要函数:
1、写指令函数:void LCD_write_command(uchar dat) *注:dat=DB码,即指令代码
RS=RE=0, E:从1到0(需要时延函数),下降沿(使其执行指令,E为0时,读取信息)
2、写数据函数:void LCD_write_data(uchar dat) *注:dat=DB码,即字符码
RS=1 RW=0 E:从1到0(需要时延函数),下降沿(使其执行指令,将字符码写入DDRAM,E为0时,读取信息)
先判忙,写数据函数写入字符码
3、字符输出函数:void String(uchar sta_add,uchar *s)
sta_add:该字符串的写入起始位置—— 第一行:sta_add=0X80+(该字符在该行的第几个) 第二行:sta_add=0XC0+(该字符在该行的第几个)
用写指令函数将开始输入的位置(即sta_add)写入,再循环送入*s:
while(*s>0)
{
write_data(*s++);
delay(100);
}
4、检查忙函数:void LCD_check_busy()
{
uchar busy;
P0 = 0XFF;
RS = 0;
RW = 1;
do
{
E = 1;
busy = P0;
E = 0;
}while(busy&0X80);
}

流程:
1、初始化:设置格式(功能设定指令)
整体显示(显示开关控制指令)
输入方式(进入模式设置指令)
清屏(清屏指令:0X01)
2、字符输出函数输入内容即可。


ST7920(128*64)

工作流程:再进行初始化之后,先向IR(即指令寄存器)写入目标显示字符的位置,再向DR(即显示寄存器)送入字符数据,即可呈现目标效果。

使用指令时,应先设定时基本指令集还是扩展指令集:(001(DL)X(RE)XX。(DL)为DB4位:DL=1,8位输入;DL=0,4位输入。(RE)为DB2位。X=0,1)
RE=0,该指令为基本指令集动作;RE=1,该指令为扩展指令集动作。

有并口传输和串口传输两种模式:PSB=1,为并口;PSB=0,为串口。
为并口时,DB0~DB3接数据总线低四位;为串口时,DB0~DB3空接。
为并口时,DB4~DB7接数据总线低四位;为串口时,DB0~DB3空接。

并行数据模式时:
1、初始化:当执行设定地址指令后,若要读取数据时,需要DUMMY READ一次,(即假读,提高读取的正确性)相关操作为:将P0~P3都赋值0XFF。
设定时基本指令集还是扩展指令集
整体显示设置(整体显示开关与否、游标显示开关)
清屏(清屏指令:0X01)

 


2、字符输出函数输入内容即可。

重要函数:
1、写指令函数

 


2、写数据函数

 


3、显示函数:(LCD_write_com():写指令函数,设置该行输入的起始位置)
void Lcd_WriteStr( unsigned char x, unsigned char y, unsigned char *Str )
{
if ( (y > 3) || (x > 7) )
return; /* 超出范围直接不写 */
if ( y == 0 )
{
LCD_write_com( 0x80 + x ); /* 第一行显示 */
}
if ( y == 1 )
{
LCD_write_com( 0x90 + x ); /* 第二行显示 */
}
if ( y == 2 )
{
LCD_write_com( 0x88 + x ); /* 第三行显示 */
}
if ( y == 3 )
{
LCD_write_com( 0x98 + x ); /* 第四行显示 */
}
delay_us( 1 );
while ( *Str > 0 )
{
LCD_write_data( *Str );
Str++;
delay_us( 1 );
}
}

(写入位置函数)

 

4、判忙函数:(同1602)   若不使用判忙函数则可以在每一条指令写入后使用一个时延函数,进行微秒级时延即可。

void LCD_check_busy()
{
uchar busy;
P0 = 0XFF;
RS = 0;
RW = 1;
do
{
E = 1;
busy = P0;
E = 0;
}while(busy&0X80);
}