#include
#define uchar unsigned char
#define uint unsigned int
#define LCD12864Data P2//LCD12864点阵型液晶显示器输入输出数据/命令端口
sbit LCD12864_RS=P0^7;//LCD12864点阵型液晶显示器数据/命令选择端
sbit LCD12864_RW=P0^6;//LCD12864点阵型液晶显示器读/写端
sbit LCD12864_EN=P0^5;//LCD12864点阵型液晶显示器使能端
//太阳
uchar code sun[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x10,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00};
//月亮
uchar code moon[]={0x00,0x00,0x00,0x00,0x03,0x80,0x02,0x40,0x02,0x20,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x20,0x02,0x40,0x03,0x80,0x00,0x00,0x00,0x00};
//星星
uchar code star[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x54,0x54,0x20,0x08,0x08,0x20,0x02,0x80,0x12,0x90,0x08,0x20,0x20,0x08,0x00,0x00,0x00,0x00};
//人
uchar code robot[]={0x07,0xE0,0x08,0x10,0x12,0x48,0x10,0x08,0x1F,0xF8,0x10,0x08,0x30,0x0C,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x5F,0xFA,0x04,0x20,0x04,0x20,0x04,0x20,0x0E,0x70};
void Delay(uint i)
{
while(--i);
}
void ReadBuzy()//读忙函数
{
P2=0x00;
LCD12864_RS=0;
LCD12864_RW=1;
LCD12864_EN=1;
while(P2 & 0x80);
LCD12864_EN=0;
}
void LCD12864WriteCommand(uchar command)//写指令函数
{
ReadBuzy();//读忙
LCD12864_RS=0;
LCD12864_RW=0;
LCD12864_EN=1;
LCD12864Data=command;
Delay(100);
LCD12864_EN=0;
}
void LCD12864WriteData(uchar value)//写数据函数
{
ReadBuzy();//读忙
LCD12864_RS=1;
LCD12864_RW=0;
LCD12864_EN=1;
LCD12864Data=value;
Delay(100);
LCD12864_EN=0;
}
void LCD12864Init()//LCD12864点阵型液晶显示器初始化函数
{
ReadBuzy();//读忙
Delay(4000);
LCD12864WriteCommand(0x30);//8位数据端口传输,且设置为基本指令集动作。
Delay(100);
LCD12864WriteCommand(0x30);//8位数据端口传输,且设置为基本指令集动作。
Delay(37);
LCD12864WriteCommand(0x0c);//设置整体显示,光标、闪烁全关,不反白。
Delay(100);
LCD12864WriteCommand(0x01);//清屏,并且DDRAM数据指针清零。
Delay(10000);
LCD12864WriteCommand(0x06);//进入点设定模式,设置地址指针自动加1。
}
void CGRAM()//写自定义字符函数
{
uchar i;
LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。
LCD12864WriteCommand(0x40);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第1个内存地址
for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(sun[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(sun[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
LCD12864WriteCommand(0x50);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第2个内存地址
for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(moon[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(moon[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
LCD12864WriteCommand(0x60);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第3个内存地址
for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(star[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(star[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
LCD12864WriteCommand(0x70);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第4个内存地址
for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显器16(示行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(robot[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(robot[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
}
void main()//主函数
{
LCD12864Init();//LCD12864点阵型液晶显示器初始化函数
CGRAM();//写自定义字符函数
LCD12864WriteCommand(0x98);//LCD12864点阵型液晶显示器下半屏第二行第1个显示位置
LCD12864WriteData(0x00);//清空DRAM内存地址上的内容
LCD12864WriteData(0x00);//把自定义字符写进DDRAM内存地址0x00,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteCommand(0x99);//LCD12864点阵型液晶显示器下半屏第二行第2个显示位置
LCD12864WriteData(0x00);//清空DRAM内存地址上的内容
LCD12864WriteData(0x02);//把自定义字符写进DDRAM内存地址0x02,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteCommand(0x9A);//LCD12864点阵型液晶显示器下半屏第二行第3个显示位置
LCD12864WriteData(0x00);//清空DRAM内存地址上的内容
LCD12864WriteData(0x04);//把自定义字符写进DDRAM内存地址0x04,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteCommand(0x9B);//LCD12864点阵型液晶显示器下半屏第二行第4个显示位置
LCD12864WriteData(0x00);//清空DRAM内存地址上的内容
LCD12864WriteData(0x06);//把自定义字符写进DDRAM内存地址0x06,供LCD12864点阵型液晶显示器读取显示。
while(1);//固定循环
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』