LCD1602显示驱动-8080通讯(下)

写的不知道好不好,有什么不对的地方还请指出,谢了。

1、本节用到了上节8080通讯基本驱动。

2、驱动LCD1602,代码9个:初始化LCD1602、显示屏开或关和光标设置、LCD1602地址指针的设置、数据指针的位置设置、清屏操作、LCD显示写1个字节数据、LCD写入16个字节数据、LCD显示n字节数据、外加测试代码。

3、哪个复位LCD1602是看网上别人的代码,我看手册也没增清楚为何这样复位。

4、另外测试代码太过于简单,我以后在写代码的话,我要在代码后面添加测试代码(我觉的这样好)。

#ifndef __LCD1602_H__
#define __LCD1602_H__

//初始化LCD1602
void RES_LCD1602(void);//显示模式的设置

//显示屏开或关闭和光标设置
//mode=0000 1DCB		D=1开显示,D=0关显示
//						C=1显示光比,C=0不显示光标
//						B=1光标闪烁,B=0光标不闪烁
void display(unsigned char mode);

//LCD1602地址指针的设置
//pointer=0000 01NS		N=1当读或写一个字符后地址指针加1,且光标加1
//						N=0当读或写一个字符后地址指针减1,且光标减1
//						S=1当写一个字符后整屏显示左移(N=1时),可以达到光标不移动而屏幕移动的效果
//						S=1当写一个字符后整屏显示右移(N=0时),可以达到光标不移动而屏幕移动的效果
//						S=0当写一个字符后,整屏显示不移动
void p(unsigned char pointer);

//用户可以通过内部数据地址指针来访问(读或写)全部的80字节RAM
//指令码0x80+地址码(0x00-0x27,0x40-0x67)功能:设置数据地址指针
void write_dat_1_row(unsigned char x);
void write_dat_2_row(unsigned char x);

//清屏操作x=1 (0x01数据指针清零,所有显示清零)
//		x=2	(0x02数据指针清零,其它不动)
void Remove(unsigned char x);

//LCD1602显示函数1字节数据
void display_1byte_lcd1602(unsigned char dat);

//LCD1602显示函数16字节数据(使用时请用数组,只能是数字的数组)
void display_16_byte_lcd1602(unsigned char *n);
//LCD1602显示函数n字节数据(使用时请用字符串数组)
void display_n_byte_lcd1602_string(unsigned char *n);//最好16个字节为一行显示

//测试代码,会显示5
void test(void);

#endif // !__LCD1602_H__
#include "lcd8080.h"
#include "delay.h"

//初始化LCD1602
void RES_LCD1602(void)//显示模式的设置
{
	delay_ms(15);//延时15ms时间,手册上这么说的
	write_cmd_LCD1602(0x38);//16*2显示,5*7点阵,8位数据接口
	delay_ms(5);//延时15ms时间,手册上这么说的
	write_cmd_LCD1602(0x38);//16*2显示,5*7点阵,8位数据接口
	delay_ms(5);//延时15ms时间,手册上这么说的
	write_cmd_LCD1602(0x38);//16*2显示,5*7点阵,8位数据接口
}

//显示屏开或关闭和光标设置
//mode=0000 1DCB		D=1开显示,D=0关显示
//						C=1显示光比,C=0不显示光标
//						B=1光标闪烁,B=0光标不闪烁
void display(unsigned char mode)
{
	write_cmd_LCD1602(mode);
}

//LCD1602地址指针的设置
//pointer=0000 01NS		N=1当读或写一个字符后地址指针加1,且光标加1
//						N=0当读或写一个字符后地址指针减1,且光标减1
//						S=1当写一个字符后整屏显示左移(N=1时),可以达到光标不移动而屏幕移动的效果
//						S=1当写一个字符后整屏显示右移(N=0时),可以达到光标不移动而屏幕移动的效果
//						S=0当写一个字符后,整屏显示不移动
void p(unsigned char pointer)
{
	write_cmd_LCD1602(pointer);
}

//用户可以通过内部数据地址指针来访问(读或写)全部的80字节RAM
//指令码0x80+地址码(0x00-0x27,0x40-0x67)功能:设置数据地址指针
//unsigned char read_display(unsigned char x)
//{
//	x=read_DATA_LCD1602(0x80 | x);//读取地址指针所指向的数据
//	return x;
//}
void write_dat_1_row(unsigned char x)//第一行
{
	write_cmd_LCD1602(0x80 |0x00 | x);//设置从x处依次开始写入数据
}
void write_dat_2_row(unsigned char x)//第二行
{
	write_cmd_LCD1602(0x80 |0x40 | x);//设置从x处依次开始写入数据
}

//清屏操作x=1 (0x01数据指针清零,所有显示清零)
//		x=2	(0x02数据指针清零,其它不动)
void Remove(unsigned char x)
{
	switch (x)
	{
	case 1:write_cmd_LCD1602(0x01);break;//所有均清零
	case 2:write_cmd_LCD1602(0x02);break;//只清零数据指针
	default:
		break;
	}
}


//LCD1602显示函数1字节数据
void display_1byte_lcd1602(unsigned char dat)
{
	write_dat_LCD1602(dat+'0');
}

//LCD1602显示函数16字节数据(使用时请用只有数字的数组)
void display_16_byte_lcd1602(unsigned char *n)//需要16个字节为一行显示
{
	unsigned char i;
	for(i=0;i<16;i++)//后期把16更换为数组有多少个元素
	{
		write_dat_LCD1602(*n+'0');//*n表示值,n表示地址,,带*与不带*的指针区别
		n++;//地址+1
	}
}
//LCD1602显示函数n字节数据(使用时请用字符串数组)
void display_n_byte_lcd1602_string(unsigned char *n)//最好16个字节为一行显示
{
	unsigned char i=0;
	unsigned char x=0;
	while(*(n+x)!='\0')
	{
		x++;
	}
	for(i=0;i<x;i++)
	{
		write_dat_LCD1602(*n);//*n表示值,n表示地址,,带*与不带*的指针区别
		n++;//地址+1
	}
}
//测试代码会显示5
void test(void)
{
	write_dat_LCD1602(5+'0');//'0'存储的时候会存储0对应的ASCLL码,此操作会存储5的ASCLL码
}

猜你喜欢

转载自blog.csdn.net/qq_44829055/article/details/107440841