写的不知道好不好,有什么不对的地方还请指出,谢了。
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码
}