标题:
单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM源程序
[打印本页]
作者:
51黑电子会员
时间:
2020-8-27 11:10
标题:
单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM源程序
本帖最后由 51黑电子会员 于 2020-8-27 13:28 编辑
#include"reg51.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 table1[]="您好啊!欢迎来到";
uchar code table2[]="电气项目的实验室";
uchar code table3[]="创新是我们的灵魂";
uchar code table4[]="坚持是我们的品格";
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。
}
uchar code table1[]="您好啊!欢迎来到";
uchar code table2[]="电气项目的实验室";
uchar code table3[]="创新是我们的灵魂";
uchar code table4[]="坚持是我们的品格";
void DDRAM()//写随机字符函数
{
uchar i;
LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。
LCD12864WriteCommand(0x80);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第1个内存地址
for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(table1[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(table1[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
LCD12864WriteCommand(0x90);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第2个内存地址
for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(table2[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(table2[i* 2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
LCD12864WriteCommand(0x88);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第3个内存地址
for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(table3[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(table3[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
LCD12864WriteCommand(0x98);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第4个内存地址
for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显器16(示行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。
{
LCD12864WriteData(table4[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。
LCD12864WriteData(table4[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。
}
}
void main()
{
LCD12864Init();//LCD12864点阵型液晶显示器初始化函数
DDRAM();//写随机字符函数
while(1);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1