×
单片机 > 单片机程序设计 > 详情

单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片

发布时间:2021-06-15 发布时间:
|

#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);//固定循环

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容