1、在1602液晶屏上显示自定义字符
2、在1602液晶屏上显示自定义字符--程序编写
3、在1602液晶屏上显示自定义字符--电路仿真
参考程序:
LCD1602.H
/********************************************
**程序名:LCD1602.H
**编写时间:2020.5.3
**硬件环境:stc89c52rc
12MHZ
**接口:RS RW E D0 ~~~D7
**修改日志:无
**说明:在qc1602液晶上测试成功,没有使用到全局变量
**Right version of all
********************************************/
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATA P0 //定义LCD1602的数据口为P0口
sbit RS_1602=P2^7;
sbit RW_1602=P2^6;
sbit E_1602=P2^5;
extern void LCD1602_delay();
extern void LCD1602_check_busy();
extern void LCD1602_write_com( uchar );
extern void LCD1602_write_data(uchar);
extern void LCD1602_write_char(uchar x,uchar y,uchar dat);
//extern void LCD1602_write_string(uchar ,uchar,uchar *, uchar );
extern void LCD1602_write_CGRAM(uchar *);
extern void LCD1602_init( void );
#endif
LCD1602.C
/********************************************
**程序名:LCD1602.C
**编写时间:2020.5.3
**硬件环境:stc89c52rc
12MHZ
**接口:RS RW E D0 ~~~D7
**修改日志:无
**说明:在qc1602液晶上测试成功,没有使用到全局变量
**Right version of all
********************************************/
#include<AT89X52.h>
#include"LCD1602.h"
/********************************************
**函数名称:LCD1602_delay
**函数功能:用于LCD1602的延时
**入口参数:无
**输出参数:无
**备注:
********************************************/
void LCD1602_delay() //延时程序
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<20;j++);
}
/********************************************
**函数名称:LCD1602_check_busy
**函数功能:用于LCD1602的查忙
**入口参数:无
**输出参数:无
**备注:
********************************************/
void LCD1602_check_busy( ) //查询忙碌标志信号程序
{
uchar busy;
do
{
E_1602=0;
RW_1602=1;
RS_1602=0;
E_1602=1;
busy=LCD1602_DATA;
E_1602=0;
LCD1602_delay();
} while(busy&&0x10==1);
}
/********************************************
**函数名称:LCD1602_write_com
**函数功能:向LCD1602写入指令
**入口参数:com
**输出参数:无
**备注:
********************************************/
void LCD1602_write_com( uchar com ) //写指令
{
LCD1602_check_busy();
E_1602=0;
RW_1602=0;
RS_1602=0;
E_1602=1;
LCD1602_DATA=com;
E_1602=0;
}
/********************************************
**函数名称:LCD1602_write_data
**函数功能:向LCD1602写入指令
**入口参数:com
**输出参数:无
**备注:
********************************************/
void LCD1602_write_data(uchar a ) //写数据到LCM程序
{
LCD1602_check_busy();
E_1602=0;
RW_1602=0;
RS_1602=1;
E_1602=1;
LCD1602_DATA=a;
E_1602=0;
}
/********************************************
**函数名称:LCD1602_write_char
**函数功能:向LCD1602指定位置写入一个字节
**入口参数:com
**输出参数:无
**备注:x:第几行 y,第几列 dat:数据
********************************************/
void LCD1602_write_char(uchar x,uchar y,uchar dat)
{
if(x==0)
{
LCD1602_write_com(0x80+y);
}
else if(x==1)
{
LCD1602_write_com(0xc0+y);
}
LCD1602_write_data(dat);
}
/********************************************
**函数名称:LCD1602_write_CGRAM
**函数功能:向LCD1602写入自定字符
**入口参数:无
**输出参数:无
**备注:
*******************************************/
void LCD1602_write_CGRAM(uchar *p)
{
uchar i,j,kk;
uchar tmp=0x40; //操作CGRAM的命令码
kk=0;
for(j=0;j<3;j++) //64字节存储空间,可以生成 8 个自定义字符点阵 64X8
{
for(i=0;i<8;i++) // 8 个字节生成 1 个字符点阵
{
LCD1602_write_com(tmp+i); //操作CGRAM的命令码+写入CGRAM地址.
LCD1602_write_data(p[kk]); //写入数据
kk++;
}
tmp+=8;
}
}
/********************************************
**函数名称:LCD1602_init
**函数功能:LCD1602初始化程序
**入口参数:无
**输出参数:无
**备注:
********************************************/
void LCD1602_init( ) //启动LCM程序(初始化程序)
{
/*这里要多次激活液晶*/
LCD1602_write_com(0x38);//设置显示模式
_nop_();_nop_();
LCD1602_write_com(0x38);//设置显示模式
_nop_();_nop_();
LCD1602_write_com(0x38);//设置显示模式
_nop_();_nop_();
LCD1602_write_com(0x0c);//开显示,不显示光标,不闪烁,00001100
LCD1602_write_com(0x01);//显示清屏
LCD1602_write_com(0x06);//当读取或者写一个字符后地址指针加一
LCD1602_write_com(0x0c);//开显示,不显示光标,不闪烁,00001100
}
main.C
#include <reg51.h>
#include <lcd1602.h>
#define uchar unsigned char
#define uint unsigned int
void main()
{
uchar code table3[]={0x08,0x1F,0x12,0x0F,0x0A,0x1F,0x02,0x00};//字符年
LCD1602_init();
while(1)
{
LCD1602_write_CGRAM(table3);
LCD1602_write_char(1,3,0);
}
}

