LCD12864液晶显示以51单片机为核心设计一个LCD12864液晶显示器。具有简单的文字和图案花样显示功能。
系统主要由51单片机进行控制各个电路的配合,从而完成简单的花样显示文字和图案的功能。
电路主要包括:
单片机最小系统电路,ST7920控制电路,LCD12864液晶显示等电路。
点阵图形液晶
字库:带中文字库、不带中文字库
数据接口:串口、并口
LCD12864:指128列,64行点阵的液晶屏,可以显示32个汉字(16*16的点阵),4行,每行8个汉字)
PPT课件内容预览:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
数字0亮 ,数字1灭
cs1 打开显示
RW:读/写
RS数据/指令
E:使能,下降沿数据写入控制器内寄存器
cs1=0.,左半屏;cs2=0,右半屏
e(sclk时钟引脚);RS(cs,打开显示);rw(sid数据引脚),括号中为串行含义
单片机源程序如下:
- /*
- 液晶12864字符显示,DDRAM编码书写,
- 就是先写页地址,页地址共8页,例如第2页
- write_comm(0xba); //,页地址格式1011 1???
- 然后列地址,列地址共64列,例如第5页
- write_comm(0x40); //DDRAM的列地址01??????
- */
- #include "reg51.h"
- sbit cs1_zuo=P3^3;
- sbit cs2_you=P3^4;
- sbit enable_12864=P3^5; //允许
- sbit read_write=P3^6; //数据引脚
- sbit command_date=P3^7;//
- void delayms(int t)
- {int i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
-
- }
- void chech_busy()
- { //unsigned char timeout=200;
- unsigned char busy;
- enable_12864=0;
- read_write=1; // 读写引脚 1/0
- command_date=0; //命令/数据引脚 1/0
- P2=0xff;//读入前先置1
- enable_12864=1;
- while(0x80&busy); //最高位为1就忙,不能接收,等待
- enable_12864=0;
- }
-
- unsigned char read_date()//实际读状态寄存器
- {unsigned char dat;
- chech_busy();//每次读写之前进行忙检测
- enable_12864=0;
- command_date=1;
- read_write=1;
- P2=0xff;//准备读入
- enable_12864=1; //enable_12864的高电平读数据
- dat=P2;
- delayms(2);//延时
- enable_12864=0;
- return dat;
- }
- void write_date(unsigned char dat)
- { chech_busy();//每次读写之前进行忙检测
- command_date=1; //写数据RS引脚高电平
- read_write=0;
- P2=dat;
- delayms(2); //延时50us
- enable_12864=1; //e的下降沿写入
- delayms(2); //延时50us
- enable_12864=0;
-
- }
- //
- void write_comm(unsigned char comm)
- { chech_busy();//每次读写之前进行忙检测
- command_date=0; //写命令RS引脚低电平
- read_write=0;
- P2=comm;
- delayms(2);
- enable_12864=1; //e的下降沿写入
- delayms(2);
- enable_12864=0;
- }
- /*******初始化**************/
- void init_lcd()
- { delayms(100);
- write_comm(0x30);//8位数据,基本指令集
- write_comm(0x0c);//显示打开,光标关、反白关
- write_comm(0x01);//清屏,DDRAM填满0x20,且地址计数器清0
-
- delayms(100);
- }
-
- void main()
-
- {unsigned char code tuan[]=
- //阳码(0点亮)逐列,逆向
- {
- // 0xFF,0xF7,0xFD,0xF7,0xFD,0xF7,0x0D,0xF7, //马
- // 0x7D,0xF7,0x7D,0xF7,0x7D,0xF7,0x7D,0xF7,
- // 0x7D,0xF7,0x7D,0xF7,0x01,0xB7,0x7F,0x7F,
- // 0x7F,0xBF,0x7F,0xC0,0xFF,0xFF,0xFF,0xFF
- 0xDF,0xDD,0xCF,0x98,0x53,0xDD,0x9C,0xED,0xDF,0xED,0xE7,0x6D,0xF7,0xBF,0xF7,0xCF,
- 0x07,0xF0,0x76,0xFF,0x71,0xBF,0x77,0x7F,0x77,0xBF,0x77,0xC0,0xF7,0xFF,0xFF,0xFF,/*"纺",0*/
- 0xDF,0xDD,0xCF,0x98,0x53,0xDD,0x9C,0xED,0xDF,0xED,0xE7,0x6D,0xFF,0xBF,0x03,0xDC,
- 0xFB,0xE6,0xFB,0xFE,0xFB,0xFE,0xFB,0xF6,0xFB,0xEE,0x03,0xDC,0xFF,0x3F,0xFF,0xFF,/*"织",1*/
- 0xFD,0xF7,0xFD,0xE7,0x01,0xF0,0x6D,0xF7,0x6D,0xFB,0x01,0x00,0xFD,0xFB,0xFD,0x7F,
- 0x03,0x9C,0xFB,0xE6,0xFB,0xFE,0xFB,0xFE,0xFB,0xF6,0x03,0xCC,0xFF,0x3F,0xFF,0xFF,/*"职",2*/
- 0xFF,0xBF,0xEF,0xBF,0x9F,0xBF,0x7F,0xBC,0xFF,0xBF,0x00,0x80,0xFF,0xBF,0xFF,0xBF,
- 0xFF,0xBF,0x00,0x80,0xFF,0xBD,0xFF,0xBE,0x3F,0xBF,0xCF,0xBF,0xFF,0xBF,0xFF,0xFF,
- 0xFF,0xFF,0x8F,0xCF,0xF7,0xD7,0xF7,0xDB,0xF7,0xDD,0x77,0xDE,0x8F,0xCF,0xFF,0xFF,/*"2",0*/
- 0xFF,0xFF,0x1F,0xF0,0xEF,0xEF,0xF7,0xDF,0xF7,0xDF,0xEF,0xEF,0x1F,0xF0,0xFF,0xFF,/*"0",1*/
- 0xFF,0xFF,0xEF,0xDF,0xEF,0xDF,0x07,0xC0,0xFF,0xDF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,/*"1",2*/
- 0xFF,0xFF,0x8F,0xE3,0x77,0xDD,0xF7,0xDE,0xF7,0xDE,0x77,0xDD,0x8F,0xE3,0xFF,0xFF/*"8",3*/
- };
- int i,j,t,x=0x80,y=0x80; //x,y为点阵的坐标0x80
- delayms(20);
- init_lcd();
- //硬件上左屏开了显示了
- write_comm(0x01);//清屏
- delayms(40);
- cs1_zuo=0; //写左屏
- cs2_you=1;
- write_comm(0xb8+0); //页地址0页1011 1???
- write_comm(0x40); //DDRAM的列地址40~7f,64列
-
- for(i=0;i<64;i++)
- write_date(tuan[2*i]);
-
- write_comm(0xb8+1);//页地址1页1011 1???
- write_comm(0x40);//DDRAM的列地址40~7f,64列
- //列地址设定后,列地址自动加1
- //页地址重设起作用,设定后保持
- for(i=0;i<64;i++)
- write_date(tuan[2*i+1]);
- cs1_zuo=1; //写右屏
- cs2_you=0;
- write_comm(0xb8+2); //页地址3页1011 1???
- write_comm(0x40+32); //DDRAM的列地址40~7f,64列
-
- for(i=64;i<96;i++)
- write_date(tuan[2*i]);
- write_comm(0xb8+3); //页地址4页1011 1???
- write_comm(0x40+32); //DDRAM的列地址40~7f,64列
-
- for(i=64;i<96;i++)
- write_date(tuan[2*i+1]);
- while(1);
- }
复制代码
所有资料51hei提供下载:
参考资料.zip
(8.98 MB, 下载次数: 42)
|