STC8H8K64U——LCD1602

LCD的读写操作

RS R/W E D0~D7
读状态 0 1 1 输出状态字
写命令 0 0 正脉冲 输出无
读数据 1 1 1 输出数据
写数据 1 0 正脉冲 输出无

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 
#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++;		
	}	
}

STC8H8K64U——LCD1602_第1张图片

你可能感兴趣的:(STC8H8K64U——打狗棍,51单片机,c语言,单片机,嵌入式硬件)