LCD12864无字库液晶屏幕的proteus仿真原理图:
单片机源程序预览:
- /***********************************************************************
-
- 内容:无字库12864测试程序(纵向取模。字节倒序)
- 作者:QQ:1181826414
- 交流:http://www.51hei.com/bbs/mcu-h24-1.html
- ***********************************************************************/
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define Disp_On 0x3f //显示命令
- #define Disp_Off 0x3e //关闭命令
- #define Col_Add 0x40 //起始列地址
- #define Page_Add 0xb8 //起始页地址
- #define Start_Line 0xc0 //起始行地址
- #define Lcd_Bus P0 //MCU P0<---> LCM
- sbit RS = P2^0; //RS=1时为数据操作,RS=0时为命令操作
- sbit RW = P2^1; //RW=1时为读选通,RW=0时为写选通
- sbit E = P2^2; //E下降沿时,数据写入驱动器,E为高电平时,数据被读出
- sbit Mcs = P2^3; //Master chip E,右半屏-CS2
- sbit Scs = P2^4; //Slave chip E,左半屏-CS1
- sbit RST = P2^5; //液晶模块复位控制管脚
- char code ce[] = {
- /*-- 文字: 测 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08, 0x31, 0x86, 0x60, 0x00, 0xFE, 0x02, 0xF2, 0x02, 0xFE, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00,
- 0x04, 0xFC, 0x03, 0x00, 0x80, 0x47, 0x30, 0x0F, 0x10, 0x67, 0x00, 0x07, 0x40, 0x80, 0x7F, 0x00
- };
- char code shi[] = {
- /*-- 文字: 试 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x40, 0x42, 0xDC, 0x08, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0x10, 0x12, 0x1C, 0x10, 0x00,
- 0x00, 0x00, 0x7F, 0x20, 0x10, 0x20, 0x20, 0x1F, 0x10, 0x10, 0x01, 0x06, 0x18, 0x20, 0x78, 0x00
- };
- char code kai[] = {
- /*-- 文字: 开 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x40, 0x42, 0x42, 0x42, 0x42, 0xFE, 0x42, 0x42, 0x42, 0x42, 0xFE, 0x42, 0x42, 0x42, 0x42, 0x00,
- 0x00, 0x40, 0x20, 0x10, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00
- };
- char code shi3[]= {
- /*-- 文字: 始 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10, 0x90, 0x70, 0x1F, 0x12, 0xF0, 0x00, 0x20, 0x70, 0x28, 0x27, 0x22, 0x28, 0x70, 0x20, 0x00,
- 0x40, 0x21, 0x12, 0x0C, 0x06, 0x09, 0x30, 0x00, 0x7F, 0x21, 0x21, 0x21, 0x21, 0x7F, 0x00, 0x00
- };
- char code wan[] = {
- /*-- 文字: 完 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00, 0x90, 0x8C, 0xA4, 0xA4, 0xA4, 0xA5, 0xA6, 0xA4, 0xA4, 0xA4, 0xA4, 0x94, 0x8C, 0x04, 0x00,
- 0x00, 0x80, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x70, 0x00, 0x00
- };
- char code bi[] = {
- /*-- 文字: 毕 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00, 0x00, 0xFF, 0x88, 0x48, 0x28, 0x08, 0x80, 0x7F, 0x88, 0x88, 0x88, 0x84, 0x84, 0xE0, 0x00,
- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xFF, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00
- };
- uchar code FirstPage[] =
- {
- /*-- 调入了一幅图像:C:\Users\Administrator\Desktop\无标题.bmp --*/
- /*-- 宽度x高度=128x64 --*/
- 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,
- 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFC,
- 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
- 0x3F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xF9,0xE0,0xFE,0xFC,0xFC,0xFC,0xE0,0xFC,
- 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,
- 0xC6,0x1F,0x1F,0x7D,0x7F,0x00,0x0F,0x0E,0x02,0xFD,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFD,0xE8,0xE0,0xE0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,
- 0xE0,0xC0,0xC0,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFB,0xFE,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xBF,0x3F,0xFF,0xFD,0xFD,0x8F,0x9D,0x3F,0x17,0xFF,0xFF,0xFF,
- 0xFD,0xF8,0xF0,0xC0,0x80,0x03,0x07,0x80,0xFA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0xFF,0xFF,0x0F,
- 0x1F,0x3F,0x3F,0x6F,0x3F,0x8D,0xFF,0xFF,0x2E,0x00,0x00,0x1F,0x3F,0x6F,0x6F,0x2F,
- 0x3D,0x1D,0x0B,0x08,0x01,0x0F,0xFF,0xFF,0xEF,0xFF,0xFC,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xDF,0xDF,0xC7,0xE0,0xFA,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xFC,0xF7,0x0F,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,
- 0xFC,0xB0,0xC0,0xC0,0xE6,0xFF,0xFF,0xFF,0xFC,0xFC,0xFC,0xDC,0xC0,0xC0,0x80,0x80,
- 0x00,0x00,0x00,0x00,0x00,0xE2,0xFF,0x3F,0x3F,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0xFF,0xFF,0x7F,0xFF,0xDF,0x9F,
- 0x3E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xF9,0xFC,0xFF,0xFF,0xFF,0xFE,0xF9,
- 0xFB,0x77,0xFF,0xFF,0xEF,0xEF,0xFF,0xDF,0x80,0xE0,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xCF,0xCF,0x83,0x83,0xC3,0xC7,0xE7,
- 0x60,0x60,0x30,0xD8,0x7E,0xE3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x07,0x02,0x02,0x01,
- 0x03,0x06,0x00,0x01,0x03,0x03,0x03,0x03,0x07,0x07,0x01,0x01,0x03,0x07,0x05,0x01,
- 0x06,0x06,0x01,0x07,0x07,0x07,0x03,0x06,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,
- 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3F,
- 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFB,0xFF,0xFF,0xF6,
- 0x7E,0x32,0x1B,0x1F,0x87,0xFF,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x01,0x03,0x07,0x0F,0x0F,0x0F,0x1B,0x1F,0x1F,0x1F,0x1F,0x3F,0x3F,0x1B,
- 0x0C,0x0C,0x06,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- /*---------------------延时子程序----------------------------*/
- void delay(unsigned int t)
- {
- unsigned int i, j;
- for (i = 0;i < t;i++)
- for (j = 0;j < 10;j++)
- {
- ;
- }
- }
- /*--------------------读忙碌子程序---------------------------*/
- void Read_busy()
- {
- P0 = 0x00;
- RS = 0;
- RW = 1;
- E = 1;
- while(P0&0x80);
- E = 0;
- }
- /*--------------------写命令到LCD----------------------------*/
- void write_com(unsigned char cmdcode)
- {
- Read_busy(); //每次读写都要判断是否忙碌
- RS = 0;
- RW = 0;
- Lcd_Bus = cmdcode;
- delay(0);
- E = 1;
- delay(0);
- E = 0;
- }
- /*-------------------写数据到LCD----------------------------*/
- void write_data(unsigned char Dispdata)
- {
- Read_busy(); //每次读写都要判断是否忙碌
- RS = 1;
- RW = 0;
- Lcd_Bus = Dispdata;
- delay(0);
- E = 1;
- delay(0);
- E = 0;
- }
- /*------------------显示边框-------------------------------*/
- void frame()
- {
- unsigned char i;
- Mcs = 0; //两个屏幕
- Scs = 0;
- /*********************************************************************/
- write_com(Page_Add + 0); //上面横线
- write_com(Col_Add + 0);
- for (i = 0;i < 64;i++) write_data(0x01);
- /*********************************************************************/
- write_com(Page_Add + 7); //下面横线
- write_com(Col_Add + 0);
- for (i = 0;i < 64;i++) write_data(0x80);
- /*********************************************************************/
- for (i = 0;i < 8;i++)
- {
- Mcs = 0; //右半屏
- Scs = 1;
- write_com(Page_Add + i); //共8页
- write_com(Col_Add + 63); //最后一列
- write_data(0xff); //ff表示每页的8行全亮
-
- Mcs = 1; //左半屏与右半屏类似
- Scs = 0;
- write_com(Page_Add + i);
- write_com(Col_Add + 0);
- write_data(0xff);
- }
- }
- /*---------------------------清除内存--------------------------------*/
- void Clr_Scr()
- {
- unsigned char j, k;
- for (k=0;k<8;k++)
- {
- Mcs = 1;Scs = 0;delay(10); //左半屏清屏
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 0;j < 64;j++) write_data(0x00);
- Mcs = 0;Scs = 1; delay(10); //右半屏清屏
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 64;j < 128;j++) write_data(0x00);
- }
- }
- /*------------------显示12864图片---------------------------*/
- void Disp_Img(unsigned char code *img)
- {
- unsigned char j, k;
- for (k = 0;k < 8;k++) //共8页
- {
- Mcs = 1;Scs = 0;delay(10); //左半屏数据
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 0;j < 64;j++) write_data(img[k*128 + j]); //每半块屏共64列
-
- Mcs = 0;Scs = 1; delay(10); //右半屏数据
- write_com(Page_Add + k);
- write_com(Col_Add + 0);
- for (j = 64;j < 128;j++) write_data(img[k*128 + j]);
- }
- }
- /*-------------------------显示横---------------------------*/
- void Disp_H_Line()
- {
- unsigned char i, j;
- Mcs = 0;
- Scs = 0;
- write_com(Disp_On); //显示开
- write_com(Page_Add); //页地址
- write_com(Start_Line); //开始行
- write_com(Col_Add); //列地址
- for (j = 0;j < 8;j++) //共8页,所以循环8次
- {
- write_com(Page_Add + j);
- write_com(Col_Add + 0); //第一列开始
- write_com(Start_Line+0); //第一行开始
- for (i = 0;i < 64;i++)write_data(0x55); //每半屏幕共64列
- }
- }
- /*------------------------显示列-----------------------------*/
- void Disp_V_Line()
- {
- unsigned char i, j;
- write_com(Disp_On); //显示开
- write_com(Page_Add); //页地址
- write_com(Start_Line); //列地址
- write_com(Col_Add);
- for (j = 0;j < 8;j++) //共8页
- {
- write_com(Page_Add + j);
- write_com(Col_Add + 0);
- write_com(Start_Line + 0);
- for (i = 0;i < 32;i++) //64列,写两次,一列空白,一列实线,所以循环32次
- {
- write_data(0x00); //一列空
- write_data(0xff); //一列实
- }
- }
- }
- /*---------------------指定位置显示汉字16*16-----------------------*/
- void hz_disp16(unsigned char pag, unsigned char col, unsigned char code *hzk)
- {
- unsigned char j = 0, i = 0;
- for (j = 0;j < 2;j++) //一个汉字需要占用2页,1页8行,共16行
- {
- write_com(Page_Add + pag + j);
- write_com(Col_Add + col);
- for (i = 0;i < 16;i++) //16列,所以会循环16次
- write_data(hzk[16*j + i]);
- }
- }
- /*--------------------------初始化LCD屏-----------------------------*/
- void init_lcd()
- {
- Read_busy(); //每次读写都要判断是否忙碌
- RST = 0;
- delay(100);
- RST = 1;
- delay(100);
- Mcs = 0;
- Scs = 0;
- delay(100);
- write_com(Disp_Off); //关显示
- write_com(Page_Add + 0);
- write_com(Start_Line + 0);
- write_com(Col_Add + 0);
- write_com(Disp_On); //开显示
- }
- /*------------------------------信息显示----------------------------*/
- void Msg(int flg)
- {
- Clr_Scr(); //清屏
- frame(); //显示边框
- if (flg == 0)
- { //显示“测试开始”
- Mcs = 1;Scs = 0;
- hz_disp16(3, 32, ce);
- delay(2000);
- hz_disp16(3, 48, shi);
- delay(2000);
- Mcs = 0;Scs = 1;
- hz_disp16(3, 0, kai);
- delay(2000);
- hz_disp16(3, 16, shi3);
- delay(2000);
- }
- else if (flg == 1)
- { //显示“测试完毕”
- Mcs = 1;Scs = 0;
- hz_disp16(3, 32, ce);
- hz_disp16(3, 48, shi);
- Mcs = 0;Scs = 1;
- hz_disp16(3, 0, wan);
- hz_disp16(3, 16, bi);
- }
- }
- /*-----------------------------主程序---------------------------------*/
- main()
- {
- while (1)
- {
- init_lcd();
- Disp_Img(FirstPage);
- delay(25000);
- Msg(0);
- delay(10000);
- Disp_H_Line();
- delay(10000);
- Disp_V_Line();
- delay(10000);
- Msg(1);
- delay(10000);
- }
- }
复制代码
LCD12864仿真工程文件等资料下载:
LCD12864测试程序.zip
(419.72 KB, 下载次数: 120)
|