STC8H8K64U——LCD1602

LCD的读写操作

RSR/WED0~D7
读状态011输出状态字
写命令00正脉冲输出无
读数据111输出数据
写数据10正脉冲输出无

LCD1602的控制命令表

指令码描述
01H清屏,向DDRAM写入空格码,光标返回显示屏左上角
02H光标归位,光标返回显示屏左上角
06H读或写一个字符后,光标右移,屏幕不动
04H读或写一个字符后,光标左移,屏幕不动
07H读或写一个字符后,光标和屏幕向右移动一个字符
05H读或写一个字符后,光标和屏幕向左移动一个字符
08H关显示,关光标,关闪烁
0EH开显示,开光标,关闪烁
0DH开显示,关光标,开闪烁
0CH开显示,关光标,关闪烁
0FH开显示,开光标,开闪烁
10H每输入该指令,光标左移一个字符
14H每输入该指令,光标右移一个字符
18H每输入该指令,画面左移一个字符
1CH每输入该指令,画面右移一个字符
30H单行显示,5X8点阵,8位总线
34H单行显示,5X11点阵,8位总线
38H两行显示,5X8点阵,8位总线
3CH两行显示,5X11点阵,8位总线

命令 7:CGRAM地址设置
命令格式:04H+地址码,该命令决定自定义字符的存储地址。
命令 8:DDRAM地址设置
命令格式:08H+地址码,该命令决定字符在LCD上的显示位置。
命令 9:读“忙”或状态字
BF = 1:LCD忙,不能接收命令或数据
BF = 0:LCD不忙,可以接收命令或数据

main.c

#include "lcd1602.h"

unsigned char code temp1[] = {
	0x01,0x1F,0x11,0x1F,0x11,0x1F,0x01,0x01,
	0x00,0x1C,0x04,0x1C,0x04,0x1D,0x01,0x1E,    //电(占两个字符)
	0x07,0x04,0x04,0x04,0x05,0x04,0x08,0x13,
	0x1e,0x00,0x10,0x10,0x1C,0x10,0x14,0x1F};   //压(占两个字符)

unsigned char Thousand;
unsigned char Hundred;
unsigned char Ten;
unsigned char One;	
unsigned int temp = 8421;
												
void main(void)
{
	Thousand = temp/1000;   /*千位*/
	Hundred = temp/100%10;  /*百位*/	
	Ten = temp/10%10;       /*十位*/	
	One = temp%10;          /*个位*/
/*定时器T0延时,中断允许*/
	EA = 1;
	ET0 = 1;
	
	LCD1602_Init();
	LCD1602_WriteChar(1,0x00,'A'); 
	LCD1602_WriteChar(1,0x01,0x30|Thousand); 
	LCD1602_WriteChar(1,0x02,0x30|Hundred); 
	LCD1602_WriteChar(1,0x03,0x30|Ten); 
	LCD1602_WriteChar(1,0x04,0x30|One); 	
    LCD1602_WriteString(1,0x05,"Hello Word");
/*存储自定义字符*/	
	LCD1602_W(0x00,4,temp1);  
/*显示自定义字符*/	
	LCD1602_WriteChar(2,0x00,0x00); 
	LCD1602_WriteChar(2,0x01,0x01); 
	LCD1602_WriteChar(2,0x02,0x02); 
	LCD1602_WriteChar(2,0x03,0x03); 		
	while(1);
}

lcd1602.h

#ifndef LCD1602_H
#define LCD1602_H

#include <STC8H.H>
#include "delay.h"

#define unchar unsigned char
#define unint unsigned int
	
#define BF  0x80  //BF == 1为“忙”

#define OUT P0    //数据线

sbit RS = P2^6;   //寄存器选择;RS = 1 数据寄存器,RS = 0 命令、状态寄存器 
sbit R_W = P2^5;  //读、写操作选择;R_W = 1 读,R_W = 0 写 
sbit E = P2^7;    //使能信号

void GPIO_Init(void);
void LCD1602_Init(void);                				//LCD1602 初始化

void LCD1602_WriteCommand(unchar command); 				//写命令	
void LCD1602_WriteData(unchar Data);       			    //写数据	

void LCD1602_WriteAddr(unchar x,unchar y); 		        //指定位置,第一行:00H到27H,第二行:40H到67H
void LCD1602_WriteString(unchar x,unchar y,unchar *s);  //指定位置,写入字符串
void LCD1602_WriteChar(unchar x,unchar y,unchar c);     //指定位置,写入字符

void LCD1602_CheckBusy(void);              				//检查“忙”
void LCD1602_Write_0x38(void);                          //写命令 0x38

/*
	向CGRAM写入自定义字符(5*8点阵),最多8个字符。
	先写起始地址:0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38
	再写数据表,至少8个数据
	参数:
	addr:起始地址
	n:写多少个字符
	*s:存储数据的数组 
	要显示自定义的字符,需访问CGROM,地址0x00~0x07
*/
void LCD1602_W(unchar addr,unchar n,unchar *s);

#endif

lcd1602.c

#include "lcd1602.h"

void GPIO_Init(void)
{
/*准双向口模式*/	
	P0M0 = 0x00;
	P0M1 = 0x00;
		
	P2M0 = 0x00;
	P2M1 = 0x00;	
}

void LCD1602_Init(void)     //LCD1602 初始化
{
	GPIO_Init();
  LCD1602_Write_0x38();	
	delay_ms(5);	
  LCD1602_Write_0x38();	
	delay_ms(5);	
  LCD1602_Write_0x38();	
	delay_ms(5);		
	LCD1602_WriteCommand(0x38);  //8位数据线,两行显示,5*7点阵
	LCD1602_WriteCommand(0x01);  //清屏	
	delay_ms(5);
	LCD1602_WriteCommand(0x06);  //光标向右移动,AC自动加一
	LCD1602_WriteCommand(0x0c);  //显示开,光标关,闪烁关  
}

void LCD1602_WriteCommand(unchar command) //写命令
{
	LCD1602_CheckBusy();
	
	RS = 0;   //选择命令寄存器
	R_W = 0;  //写 
	OUT = command;
	E = 1;
	delay_us(1);
	E = 0;
//	delay_us(50);	
}

void LCD1602_WriteData(unchar Data) //写数据
{
	LCD1602_CheckBusy();
	
	RS = 1;  //选择数据寄存器  
	R_W = 0; //写
	OUT = Data;	
	E = 1;
	delay_us(1);
	E = 0;
//	delay_us(50);	
}

void LCD1602_WriteAddr(unchar x,unchar y)   //指定位置,第一行:00H到27H,第二行:40H到67H
{
	if(x==1)
	{
		LCD1602_WriteCommand(y|0x80);
	}
	else if(x==2)
	{
		LCD1602_WriteCommand(y|0x80|0x40);
	}	
}

void LCD1602_WriteChar(unchar x,unchar y,unchar c)     //指定位置,写入字符
{
	LCD1602_WriteAddr(x, y);
	LCD1602_WriteData(c); 
}

void LCD1602_WriteString(unchar x,unchar y,unchar *s)  //指定位置,写入字符串
{
	LCD1602_WriteAddr(x, y);
	while(*s != '\0')
	{
		LCD1602_WriteData(*s);
		s++;
	}
}

void LCD1602_CheckBusy(void) //检查“忙”
{
	unchar temp;
	OUT = 0xff;
	RS = 0;      //选择状态寄存器
	R_W = 1;     //读
	do
	{	
		E = 1;       
		temp = OUT; //读取IO口数据
		
	}while(temp&BF); //BF == 1为“忙”
	E = 0;    
}
void LCD1602_Write_0x38(void) 
{	
	E = 0;
	
	RS = 0;   //选择命令寄存器
	R_W = 0;  //写 
	OUT = 0x38;
	E = 1;
	delay_us(1);
	E = 0;
}

void LCD1602_W(unchar addr,unchar n,unchar *s)
{
	unsigned char	i;	
  LCD1602_WriteCommand(0x40|addr);
	for(i=0;i<(8*n);i++)
	{
		LCD1602_WriteData(*s);
		s++;		
	}	
}

结果显示

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往昔的恒纳兰那

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值