打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LCD1602驱动显示实验STM32
声明:本文是在网友追梦的程序基本上修改而来。程序移植性强,可读性强,特此感谢追梦同学。
/**************************************************************************
**文件名称:LCD1602.h  for  STM32
**************************************************************************/
#ifndef  LCD1602_STM32_H
#define  LCD1602_STM32_H
#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS
#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0
#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW
#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1
#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E
#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2
#define DATAOUT  GPIOD->ODR             //PD[0..7]--(LCD)D0~D7
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
extern void delay_nms(unsigned long n);
extern void delay_nus(unsigned long n);
uint8_t LCD_busy(void); //读LCD忙碌状态,直到LCD1602不忙为止
void Wait_Leisure(void);//一直等待到LCD1602空闲
void LCD_WriteInitcmd(uchar cmd);//写入LCD初始化时的命令,不可以检测忙状态
void LCD_Writecmd(uchar cmd);//写指令到LCD1602,指令数据占一个字节
void LCD_Writedata(uchar dat);//写一字节数据到LCD1602
void LCD_pos(uchar pos);//设定显示位置 00h~27h,40h~47h
void LCD_Setpos(uchar row,uchar col);//根据习惯设定显示位置
void LCD_DispChar(char ch);//显示一个字符
void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置显示一个字符
void LCD_DispString(char str[]);//使LCD1602显示一个字符串,显示位置需提前设定
void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602从指定位置开始显示一个字符串
void LCD_Dispnum(uint32_t num);//显示一个不超过8位的整数,显示位置需提前设置
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定位置显示一个不超过8位的整数
void LCD_DispDecimal(uint32_t num,uchar dot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定
//在指定位置显示一个有效位不超过8位的浮点数
void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);
//显示日历,显示日期与时间
void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);
//显示秒表,显示时,分,秒,10毫秒,精确到10ms
void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);
//显示频率计,动态自动调整频率显示
void LCD_DispFreq(uint32_t freq);
void LCD_ShiftLeft(void);//屏幕整体左移一格,用于滚动显示
void LCD_ShiftRight(void);//屏幕整体右移一格,用于滚动显示
void LCD_Clear(void);//清屏,清除显示
void LCD_Return(void);//使光标还回原点位置
void LCD_Close(void);//关显示
void LCD_Open(void);//开显示
void LCD_FlickerChar(uchar row,uchar col);//使指定位置字符闪烁,不显示光标
void LCD_CloseFlicker(void);//关闭字符闪烁
void LCD_FlickerScreen(void);//屏幕秒闪烁一次
/*********************************************************************
*名    称:LCD_Init()
*功    能:初始化LCD1602
*入口参数:无
*出口参数:无
*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us
*          0x0C:开显示,关光标   40us
*          0x08:关显示,关光标   40us
*          0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右
*          0x0F:字符闪烁,开光标
*          0x06:写完数据自动右移光标,普通情形,从左向右显示  40us
*          0x04:写完数据自动左移光标,可以从右向左显示  40us
*          0x01:清除显示内容,即清屏  1.64ms
*          0x02:使光标还回起始位置   1.64ms
*          0x18:屏幕上所有字符同时左移一格,适合滚动显示 40us
*          0x1C:屏幕上所有字符同时右移一格,适合滚动显示 40us
*********************************************************************/
void LCD_Init(void);
#endif
/*********************************************************************
* 文件名称:LCD1602.C
* 功能:为51单片机提供LCD1602驱动程序,解决LCD1602与上层软件的隔离问题
*********************************************************************/
#include "stm32f10x.h"
#include "LCD1602.h"
#ifndef  LCD1602_STM32_C
#define  LCD1602_STM32_C
/*********************************************************************
*名    称:LCD_busy()
*功    能:读LCD忙碌状态,直到LCD1602不忙为止
*入口参数:无
*出口参数:无符号字节类型,返回0表示LCD已经操作完毕,空闲。
*说    明:一般在写入新命令或数据之前用while(LCD_busy())语句等待LCD就绪
*********************************************************************/
uint8_t LCD_busy(void)
{
LCD_RS_0;
delay_nus(1);
LCD_RW_1;
delay_nus(1);
do
{
LCD_EN_0;
delay_nus(200);
LCD_EN_1;
delay_nus(200);
}
while(GPIOD->IDR & 0x80);
LCD_EN_0;
return (uint8_t)0;
}
/*********************************************************************
*功    能:一直等待到LCD1602空闲
*********************************************************************/
void Wait_Leisure(void)
{
LCD_busy();
}
/*********************************************************************
*功    能:写入LCD初始化时的命令,不可以检测忙状态
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{
LCD_RS_0;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
DATAOUT = cmd;
LCD_EN_0;
delay_nus(300);
LCD_EN_1;
delay_nus(300);
LCD_EN_0;
delay_nms(2);
}
/*********************************************************************
*名    称:LCD_Writecmd()
*功    能:写指令到LCD1602,指令数据占一个字节
*入口参数:cmd:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{
while(LCD_busy());
LCD_RS_0;    //对同一个寄存器的两次写入,中间延时一会
delay_nus(1);
LCD_RW_0;
delay_nus(1);
LCD_EN_0;
delay_nus(300);//产生脉冲
DATAOUT = cmd;
LCD_EN_1;
delay_nus(300);//必要的延时
LCD_EN_0;    //下降沿,LCD1602开始工作
}
/*********************************************************************
*名    称:LCD_Writedata()
*功    能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255  包括各个ASCII码字符
*出口参数:无
*********************************************************************/
void LCD_Writedata(uchar dat)
{
while(LCD_busy());//等待LCD1602空闲
LCD_RS_1;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
DATAOUT = dat;
LCD_EN_1;  //先拉高
delay_nus(300); //很重要的延时,经调试,延时300us以上才可以
LCD_EN_0;       //下降沿,开始写入有效数据
}
/*********************************************************************
*名    称:LCD_pos()
*功    能:设定显示位置
*入口参数:pos:显示位置,值的范围如下:
*    0x00----------------0x0f 0x10-------0x27 第一行(一次显示16个字符)
*    0x40----------------0x4f 0x50-------0x67 第二行
*出口参数:无
*********************************************************************/
void LCD_pos(uchar pos)
{
LCD_Writecmd(pos | 0x80);
}
/*********************************************************************
*名    称:LCD_Setpos()
*功    能:根据习惯设定显示位置
*入口参数:row:行,row=1表示第一行,row=2表示第二行
*          col:列,0~15,用于指定显示的列,范围可以是0~40
*出口参数:无
*********************************************************************/
void LCD_Setpos(uchar row,uchar col)
{
if(row==1) LCD_Writecmd(col | 0x80);
else LCD_Writecmd(col | 0xC0);
}
/*********************************************************************
*功  能:显示一个字符
*入  口:ch:待显示的字符
*********************************************************************/
void LCD_DispChar(char ch)
{
LCD_Writedata(ch);
}
/*********************************************************************
*功  能:在指定位置显示一个字符
*入  口:row:行 1或2        col:列,0~15
*        ch:待显示的字符
*********************************************************************/
void LCD_Setpos_DispChar(uchar row,uchar col,char ch)
{
LCD_Setpos(row,col);
LCD_Writedata(ch);
}
/*********************************************************************
*名    称:LCD_DispString()
*功    能:使LCD1602显示一个字符串,显示位置需提前设定
*入口参数:str[]:待显示的字符串
*出口参数:无
*********************************************************************/
void LCD_DispString(char str[])
{
uchar i=0;
while(str[i] != '\0')
{
LCD_Writedata(str[i]);
++i;
}
}
/*********************************************************************
*名    称:LCD_Setpos_DispString()
*功    能:使LCD1602从指定位置开始显示一个字符串
*入口参数:row:显示行,1或2
*          col:显示列,0~15 (0~40)
*          str[]:待显示的字符串
*出口参数:无
*说    明:指定位置是显示的初始位置,第一个字符显示的位置
*********************************************************************/
void LCD_Setpos_DispString(uchar row,uchar col,char str[])
{
LCD_Setpos(row,col);
LCD_DispString(str);
}
/*********************************************************************
*名    称:LCD_Dispnum()
*功    能:显示一个不超过8位的整数,显示位置需提前设置
*入口参数:num:待显示的整数,不超过8位
*出口参数:无
*********************************************************************/
void LCD_Dispnum(uint32_t num)
{
uint i=0,j,k=0,wei,q;
char str[9];
if(num>=10000000)wei=8;
else if(num>=1000000)wei=7;
else if(num>=100000)wei=6;
else if(num>=10000)wei=5;
else if(num>=1000) wei=4;
else if(num>=100)wei=3;
else if(num>=10) wei=2;
else wei=1;
for(i=wei;i>0;i--)
{   q=1;
j=1; //i=1时,q=1,得到个位
for(;j    str[k++]=num/q +'0';
num %= q;
}
str[k] = '\0'; //添加字符串结束标志
LCD_DispString(str);//显示字符串
}
/*********************************************************************
*名    称:LCD_Setpos_Dispnum()
*功    能:在指定位置显示一个不超过8位的整数
*入口参数:num:待显示的整数,不超过8位
*出口参数:无
*********************************************************************/
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num)
{
LCD_Setpos(row,col);
LCD_Dispnum(num);
}
/*********************************************************************
*名    称:LCD_DispDecimal()
*功    能:显示一个有效位不超过8位的浮点数,显示位置需要提前设定
*入口参数:num:待显示的浮点数放大后得到的整数,不超过8位
*          dot:小数点的位数
*出口参数:无
*********************************************************************/
void LCD_DispDecimal(uint32_t num,uchar dot)
{
uint i=0,j,k=0,wei,q;
char str[10];
if(num>=10000000)wei=8;
else if(num>=1000000)wei=7;
else if(num>=100000)wei=6;
else if(num>=10000)wei=5;
else if(num>=1000) wei=4;
else if(num>=100)wei=3;
else if(num>=10) wei=2;
else wei=1;
for(i=wei;i>0;i--)
{   q=1;
j=1; //i=1时,q=1,得到个位
for(;j    str[k++]=num/q +'0';
num %= q;
}
str[k] = '\0'; //添加字符串结束标志
for(i=8;i>0;i--)
{   if((str[i]>='0')&&(str[i]<='9')) break;
}
str[i+2]='\0';   //添加字符串结束符
for(j=0;j   {
str[i+1]=str[i];
}
str[i+1]='.';       //插入小数点
LCD_DispString(str);//显示浮点小数
}
/*********************************************************************
*名    称:LCD_Setpos_DispDecimal()
*功    能:在指定位置显示一个有效位不超过8位的浮点数
*入口参数:row:待显示的行 1,2
*          col:待显示的列 0~15
*          num:待显示的浮点数放大10的整数倍后得到的整数,不超过8位
*          dot:小数点的位数
*出口参数:无
*********************************************************************/
void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot)
{
LCD_Setpos(row,col);
LCD_DispDecimal(num,dot);
}
/*********************************************************************
*名    称:LCD_DispDateTime()
*功    能:显示日历,显示日期与时间
*入口参数:year:年,可以是任意值
*          month:月,1~12
*          day:日,1~31
*          hour:时,1~24 或  1~12
*          min:分,0~59
*          sec:秒,0~59
*出口参数:无
*说    明:使用前必须先宏定义USE_LCD_DISP_DATE,在包含文件之前定义有效
*显示格式:Date:yyyy-mm-dd  *
*          Time:hh:mm:ss    *
*********************************************************************/
void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec)
{
LCD_Setpos(1,0);
LCD_DispString("Date:");
LCD_Dispnum((uint32_t)year);
LCD_DispChar('-');
LCD_Dispnum((uint32_t)month);
LCD_DispChar('-');
LCD_Dispnum((uint32_t)day);
LCD_Setpos(1,15);
LCD_DispChar('*'); //第一行结束符显示
LCD_Setpos(2,0);
LCD_DispString("Time:");
LCD_Dispnum((uint32_t)hour);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)min);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)sec);
LCD_Setpos(2,15);
LCD_DispChar('*'); //第二行结束符显示
}
/*********************************************************************
*名    称:LCD_DispStopWatch()
*功    能:显示秒表,显示时,分,秒,10毫秒,精确到10ms
*入口参数:hour:时,1~24 或  1~12
*          min:分,0~59
*          sec:秒,0~59
*          tenms:10ms计数值,如3表示30ms
*出口参数:无
*显示格式:Current Time:   *
*            hh:mm:ss:tt   *
*********************************************************************/
void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms)
{
LCD_Setpos(1,0);
LCD_DispString("Current Time:");
LCD_Setpos(1,15);
LCD_DispChar('*'); //第一行结束符显示
LCD_Setpos(2,2);
LCD_Dispnum((uint32_t)hour);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)min);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)sec);
LCD_DispChar(':');
LCD_Dispnum((uint32_t)tenms);
LCD_Setpos(2,15);
LCD_DispChar('*'); //第二行结束符显示
}
/*********************************************************************
*名    称:LCD_DispFreq()
*功    能:显示频率计,动态自动调整频率显示
*入口参数:freq:可以显示8位整数表示的频率值,频率范围1Hz~99MHz
*出口参数:无
*说    明:入口的频率值单位是Hz,显示函数自动选择合适的显示方式
*          freq>=1000000显示成6位小数的MHz
*    else  freq>=1000   显示成3位小数的KHz
*    else  freq>=0      默认显示单位是Hz  (三个区间互斥)
*********************************************************************/
void LCD_DispFreq(uint32_t freq)
{
LCD_Setpos(1,0);
LCD_DispString("Current Freq:");
LCD_Setpos(2,1); //显示位置
if(freq>=1000000)
{
LCD_DispDecimal(freq,6);
LCD_DispString("MHz");
}
else if(freq>=1000)
{
LCD_DispDecimal(freq,3);
LCD_DispString("KHz");
}
else { LCD_Dispnum(freq);
LCD_DispString("Hz");
}
LCD_Setpos(2,14);
LCD_DispString("OK");
}
//屏幕整体左移一格,用于滚动显示
void LCD_ShiftLeft()
{
LCD_Writecmd(0x18);
}
//屏幕整体右移一格,用于滚动显示
void LCD_ShiftRight(void)
{
LCD_Writecmd(0x1C);
}
//清屏,清除显示
void LCD_Clear(void)
{
LCD_Writecmd(0x01);
}
//使光标还回原点位置
void LCD_Return(void)
{
LCD_Writecmd(0x02);
}
//关显示
void LCD_Close(void)
{
LCD_Writecmd(0x08);
}
//开显示
void LCD_Open(void)
{
LCD_Writecmd(0x0C);
}
/*********************************************************************
*名    称:LCD_FlickerChar()
*功    能:使指定位置字符闪烁,不显示光标
*入口参数:row:行 1,2
*          col:列 0~15
*出口参数:无
*说    明:写命令0x0D不显示光标的闪烁,写命令0x0F是显示光标的闪烁
*          一旦设定闪烁后,会根据位置变化闪烁,关闪烁写命令0x0C
*********************************************************************/
void LCD_FlickerChar(uchar row,uchar col)
{
LCD_Writecmd(0x0D);
LCD_Setpos(row,col);
}
//关闭字符闪烁
void LCD_CloseFlicker(void)
{
LCD_Writecmd(0x0C);
}
//屏幕秒闪烁一次
void LCD_FlickerScreen(void)
{
LCD_Writecmd(0x08);//关显示
delay_nms(500);
LCD_Writecmd(0x0C);//开显示
delay_nms(500);
}
/*********************************************************************
*名    称:LCD_Init()
*功    能:初始化LCD1602
*入口参数:无
*出口参数:无
*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us
*          0x0C:开显示,关光标   40us
*          0x08:关显示,关光标   40us
*          0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右
*          0x0F:字符闪烁,开光标
*          0x06:写完数据自动右移光标,普通情形,从左向右显示  40us
*          0x04:写完数据自动左移光标,可以从右向左显示  40us
*          0x01:清除显示内容,即清屏  1.64ms
*          0x02:使光标还回起始位置   1.64ms
*          0x18:屏幕上所有字符同时左移一格,适合滚动显示 40us
*          0x1C:屏幕上所有字符同时右移一格,适合滚动显示 40us
*********************************************************************/
void LCD_Init(void)
{
delay_nms(200);           //延时20ms
LCD_WriteInitcmd(0x38);  //16*2显示,5*7点阵,8位数据
delay_nms(10);
LCD_WriteInitcmd(0x38);  //16*2显示,5*7点阵,8位数据
delay_nms(5);
LCD_WriteInitcmd(0x38);  //16*2显示,5*7点阵,8位数据
delay_nms(5);
LCD_WriteInitcmd(0x08);  //先关显示,后开显示
delay_nms(5);
LCD_WriteInitcmd(0x06);  //自动右移光标,0x04为左移光标
delay_nms(5);
LCD_WriteInitcmd(0x01);  //清除LCD的显示内容
delay_nms(6);
LCD_WriteInitcmd(0x0c);  //显示开,关光标;0x08为关显示
delay_nms(5);
}
#endif  //防止多次编译
/*************************************************************
*                      LCD1602驱动显示实验
*************************************************************/
#include "stm32f10x.h"
#include "LCD1602.h"
#define PE00 (uint32_t *)0x40230180
//时钟配置函数 8MHz*9=72MHz
void RCC_Configuration()
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);//使能HSE
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}
//延时n us
void delay_nus(unsigned long n)
{
unsigned long j;
while(n--)
{ j=8;
while(j--);
}
}
//延时n ms
void delay_nms(unsigned long n)
{
while(n--)
delay_nus(1100);
}
//GPIO配置函数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOD, &GPIO_InitStructure);     //PD口OD输出
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //PE.0~2 OD输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
///////////////////////////////////////////
int main()
{
//uint32_t i=0;
char str[]={"happy!"};
RCC_Configuration();
GPIO_Configuration();
LCD_Init();
LCD_Setpos_DispString(1,3,str);
LCD_DispFreq(123456);
LCD_FlickerChar(2,3);
LCD_FlickerScreen();
LCD_FlickerScreen();
LCD_FlickerScreen();
delay_nms(2000);
LCD_CloseFlicker();
while(1)
{
};
}
LCD1602学习体会
液晶显示屏中,1602型算是比较简单的一种,据说和12864还是全兼容的。这两天学习的结果如下。
一、1602里的存储器有三种:CGROM、CGRAM、DDRAM。CGROM保存了厂家生产时固化在LCM中的点阵型显示数据,CGRAM是留给用户自己定义点阵型显示数据的,DDRAM则是和显示屏的内容对应的。1602内部的DDRAM有80字节,而显示屏上只有2行×16列,共32个字符,所以两者不完全一一对应。默认情况下,显示屏上第一行的内容对应DDRAM中80H到8FH的内容,第二行的内容对应DDRAM中CH到CFH的内容。DDRAM中90H到A7H、D0H到E7H的内容是不显示在显示屏上的,但是在滚动屏幕的情况下,这些内容就可能被滚动显示出来了。注:这里列举的DDRAM的地址准确来说应该是DDRAM地址+80H之后的值,因为在向数据总线写数据的时候,命令字的最高位总是为1。
二、1602使用三条控制线:EN、RW、RS。其中EN起到类似片选和时钟线的作用,RW和RS指示了读、写的方向和内容。在读数据(或者Busy标志)期间,EN线必须保持高电平;而在写指令(或者数据)过程中,EN线上必须送出一个正脉冲。RW、RS的组合一共有四种情况,分别对应四种操作:
RS=0、RW=0——表示向LCM写入指令
RS=0、RW=1——表示读取Busy标志
RS=1、RW=0——表示向LCM写入数据
RS=1、RW=1——表示从LCM读取数据
三、LCD在使用的过程中,可以在RS=0、RW=0的情况下,向LCM写入一个字节的控制指令。使用的控制指令一共八个类别。有的类别又有几条不同的指令。具体的情况罗列在下:
①01H:清除DDRAM的所有单元,光标被移动到屏幕左上角。
②02H:DDRAM所有单元的内容不变,光标移至左上角。
③输入方式设置(EnterModeSet),这些指令规定了两个方面:一是写入一个DDRAM单元后,地址指针如何改变(加一还是减一);二是屏幕上的内容是否滚动。
04H:写入DDRAM后,地址指针减一,比如第一个字符写入8FH,则下一个字符会写入8EH;屏幕上的内容不滚动。
05H:写入DDRAM后,地址指针减一,同上一种情况;每一个字符写入以后,屏幕上的内容向右滚动一个字符位。
06H:写入DDRAM后,地址指针加一,比如第一个字符写入80H,则下一个字符会写入81H;屏幕上的内容也是不滚动。这应该是最常用的一种显示方式。
07H:写入DDRAM后,地址指针加一,同上一种情况;每一个字符写入以后,屏幕上的内容向左滚动一个字符位。
④屏幕开关、光标开关、闪烁开关。
08H、09H、0AH、0BH:关闭显示屏,实质上是不把DDRAM中的内容对应显示在屏幕上,对DDRAM的操作还是在进行的,执行这条指令,接着对DDRAM进行写入,屏幕上没有任何内容,但是接着执行下面的某条指令,就能看到刚才屏幕关闭期间,对DDRAM操作的效果了。
0cH:打开显示屏,不显示光标,光标所在位置的字符不闪烁。
0dH:打开显示屏,不显示光标,光标所在位置的字符闪烁。
0eH:打开显示屏,显示光标,光标所在位置的字符不闪烁。
0fH:打开显示屏,显示光标,光标所在位置的字符闪烁。
关于光标的位置:光标所在的位置指示了下一个被写入的字符所处的位置,加入在写入下一个字符前没有通过指令设置DDRAM的地址,那么这个字符就应该显示在光标指定的地方。
⑤设置光标移动(本质就是AC的增加还是减少)、整体画面是否滚动。
10H:每输入一次该指令,AC就减一,对应了光标向左移动一格。整体的画面不滚动。
14H:每输入一次该指令,AC就加一,对应了光标向右移动一格。整体的画面不滚动。
18H:每输入一次该指令,整体的画面就向左滚动一个字符位。
1CH:每输入一次该指令,整体的画面就向右滚动一个字符位。画面在滚动的时候,每行的首尾是连在一起的,也就是每行的第一个字符,若左移25次,就会显示在该行的最后一格。在画面滚动的过程中,AC的值也是变化的。 ⑥显示模式设定指令,设定了显示几行,显示什么样的点阵字符,数据总线占用几位。
20H:4位总线,单行显示,显示5×7的点阵字符。
24H:4位总线,单行显示,显示5×10的点阵字符。
28H:4位总线,双行显示,显示5×7的点阵字符。
2CH:4位总线,双行显示,显示5×10的点阵字符。
30H:8位总线,单行显示,显示5×7的点阵字符。
34H:8位总线,单行显示,显示5×10的点阵字符。
38H:8位总线,双行显示,显示5×7的点阵字符。这是最常用的一种模式。3CH:8位总线,双行显示,显示5×10的点阵字符。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LCD1602液晶显示汉字-Changing's Blog
求指导 51单片机控制 57步进电机|我爱单片机
晨辉教你轻松学51--------液晶篇(1602)
1602精简的四线控制方法,值得一看
lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图
用STC89C52连接Phyphox(Phyphox)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服