本帖最后由 51黑电子会员 于 2020-8-27 13:27 编辑
- #include <reg52.h>
- #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);//固定循环
- }
复制代码
|