为了尽快掌握QC12864B的使用方法,这里采用先在51单片机上实现QC12864B的显示功能以验证程序的可靠性,然后再将其移植到YL-KL26Z 开发板上看能否实现显示功能。 51单片机(5V)的并行模式 从并行模式的信号时序可知,在接好QC12864B的工作电源外,还要连接的引脚有RS、R/W、E及DB0~DB7。 在单片机最小系统的基础上,可按如下原理图来构建。其中RS与P1.0连接,R/W与P1.1连接,E与P1.2连接,DB0~DB7与P0.0~P0.7向连。调节RW1可改变QC12864B的显示亮度。
在LCD12864上以并行模式显示字符、汉字、图形的代码如下: - /***********************************************
- 标题: LCD12864程序
- 效果: 基于51单片机STC89C52的LCD12864液晶屏
- 并行模式显示程序,显示内容为字符、汉字及图形
- ************************************************/
- #include "reg51.h"
- /********IO引脚定义********/
- sbit LCD_RS=P1^0;
- sbit LCD_RW=P1^1;
- sbit LCD_E=P1^2;
- sbit PSB =P1^6; // PSB=1,使用8位并行模式
- /********宏定义********/
- #define LCD_Data P0
- #define Busy 0x80 // 用于检测LCD状态字中的Busy标识
- /********函数声明********/
- void WriteDataLCD(unsigned char WDLCD);
- void WriteCommandLCD(unsigned char WCLCD,BuysC);
- unsigned char ReadDataLCD(void);
- unsigned char ReadStatusLCD(void);
- void LCDInit(void);
- void LCDClear(void);
- void LCDFlash(void);
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
- void DisplayImage (unsigned char code *DData);
- void Delay5Ms(void);
- void Delay400Ms(void);
- /********数据定义********/
- code unsigned char u1[] = {"5 1 单片机实验板"};
- code unsigned char u2[] = {" www.5i51.com "};
- code unsigned char u3[] = {"自学单片机的首选"};
- code unsigned char u4[] = {" QQ: 12345678 "};
- code unsigned char tmp[]={//128*64点阵图形海豚戏水数据
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x7F,0x00,0x00,0x00,0x03,0xFE,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,
- 0x00,0xC3,0xFF,0x00,0x00,0x3F,0xE7,0xE0,0x00,0x00,0x00,0x03,0x00,0xFF,0x80,0x00,
- 0x00,0x81,0xFF,0xFE,0x00,0x7C,0x03,0xF0,0x00,0x00,0x00,0x01,0xF7,0xCB,0xF8,0x00,
- 0x01,0x83,0xF8,0x7B,0x00,0x40,0x00,0x30,0x00,0x00,0x00,0x00,0x3F,0xC0,0xF8,0x00,
- 0x03,0x1E,0x3C,0x01,0x80,0x60,0x00,0x30,0x00,0x00,0x00,0x00,0x01,0x40,0x18,0x00,
- 0x03,0x30,0x0C,0x01,0xE0,0x6C,0x00,0x70,0x00,0x00,0x00,0x00,0x01,0x7C,0xCC,0x00,
- 0x03,0x24,0x6F,0x31,0x20,0x7C,0x40,0x60,0x00,0x00,0x00,0x00,0x01,0x97,0xFC,0x00,
- 0x01,0xBF,0xFB,0xF3,0xE0,0x3F,0xE7,0xC0,0x00,0x00,0x00,0x00,0x01,0xFB,0x1C,0x00,
- 0x00,0x9B,0xC2,0x1F,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x0C,0xFE,0x00,
- 0x00,0xCC,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xB8,0x00,
- 0x00,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xE0,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1F,0x00,0x00,0x78,0x01,0xC0,0x00,0x00,0x70,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x20,0x80,0x00,0xF8,0x01,0x80,0x00,0x00,0x30,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x2E,0x80,0x00,0xD8,0x03,0x60,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x2A,0x80,0x00,0x98,0x02,0x60,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x2E,0x80,0x01,0x98,0x03,0xE0,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x20,0x83,0xFF,0x8C,0x07,0xE1,0xC8,0x00,0x30,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1F,0x7F,0x07,0x8C,0x0F,0xFF,0x8C,0x00,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xB8,0x0F,0xCC,0x1F,0x83,0x8F,0x00,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x39,0xC0,0x38,0xFE,0x1E,0x00,0x8F,0xC0,0x0C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3B,0x80,0x70,0x1E,0x00,0x00,0xCC,0xF0,0x0C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x76,0x00,0xC0,0x00,0x00,0x00,0x6E,0x3C,0x06,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x01,0x80,0x00,0x00,0x00,0x3F,0x0E,0x06,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xDC,0x03,0x00,0x00,0x00,0x00,0x1F,0x03,0x82,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xD8,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xC2,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xC0,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x80,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x00,
- 0xFF,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0x00,
- 0x00,0x00,0x01,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x3F,0xD8,0x00,0x00,0x00,0x00,
- 0x3E,0x00,0x01,0x80,0x60,0x00,0x00,0x00,0x07,0xE0,0x3D,0xF0,0x01,0xF0,0x0C,0x00,
- 0xFF,0x80,0x01,0x80,0x6C,0x00,0x00,0x00,0x3E,0xF0,0x2C,0x60,0x07,0xFF,0xFC,0x00,
- 0x81,0xF8,0x71,0x01,0xDC,0x03,0xFC,0x00,0xF3,0xFF,0x87,0xE0,0x06,0x07,0xE0,0x00,
- 0x00,0x3F,0xE1,0x03,0xFC,0x0F,0x1F,0x87,0xC2,0x00,0x04,0xE0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x03,0x00,0x0C,0x1C,0x03,0xFF,0x00,0x00,0x01,0xE0,0x7F,0x03,0xF0,0x00,
- 0x00,0x00,0x03,0x00,0x18,0x10,0x00,0x00,0x00,0x00,0x01,0xC1,0xF3,0xF7,0x3C,0x00,
- 0xFF,0xC0,0x0F,0x02,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x7E,0x0E,0x00,
- 0xE1,0xFF,0xFF,0x03,0xF0,0x00,0x00,0x00,0x00,0x03,0xF8,0x7C,0x00,0x00,0x02,0x00,
- 0x00,0x01,0xE3,0x03,0xC0,0x00,0x03,0xFF,0x00,0x0F,0x1F,0xE0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x03,0x01,0x00,0x00,0x0F,0x03,0xF0,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x03,0xFC,0x03,0x01,0x0F,0x00,0x0C,0x00,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x0F,0x0F,0x8D,0x01,0x3F,0xE0,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x1C,0x01,0xFD,0x81,0x30,0x7C,0x03,0xC0,0xFE,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
- 0x18,0x00,0x01,0xBF,0x00,0x0F,0xFF,0x07,0xC7,0xE0,0x00,0x00,0x1C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFF,0x80,0x01,0xF8,0x3E,0x00,0x78,0x0F,0xF0,0x78,0x00,0x00,0x00,
- 0x00,0x0F,0x00,0x7F,0x83,0x80,0x3F,0xF1,0xF8,0x1E,0x1C,0x7F,0xE0,0x07,0xE0,0x00,
- 0x00,0x1F,0xE0,0x3F,0xDF,0xFE,0x00,0x07,0x9F,0x83,0xF0,0x00,0x00,0x1C,0x7C,0x00,
- 0x00,0x78,0x70,0x1F,0xD0,0x07,0xC0,0x3C,0x01,0xF8,0x03,0xC0,0x00,0x18,0x00,0x00,
- 0xFF,0xE0,0x1F,0x73,0xE0,0x00,0xFF,0xE0,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x07,0xE1,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x0F,0x80,0x00,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x7F,0xE0,0x00,0x07,0x9E,0x00,0x7F,0xC0,0x60,0x0F,0xC0,0x0F,0x00,0x00,0x00,
- 0x00,0xE0,0x7C,0x00,0x03,0xF7,0xC7,0xE0,0xFF,0xE0,0x3F,0xFF,0xFC,0x00,0x00,0x00,
- 0x01,0xC0,0x0F,0x00,0x03,0xBD,0xFE,0xFC,0x00,0x00,0xF0,0x1F,0xF0,0x00,0xC6,0x00
- };
- /***********主函数开始***********/
- void main(void)
- { Delay400Ms(); // 启动等待,等LCD讲入工作状态
- LCDInit(); // LCD初始化
- while(1){
- LCDClear();
- DisplayImage(tmp); //显示图形
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- LCDClear();
- DisplayListChar(0,1,u1); //显示字库中的中文与数字
- DisplayListChar(0,2,u2); //显示字库中的字符与数字
- DisplayListChar(0,3,u3); //显示字库中的中文
- DisplayListChar(0,4,u4); //显示字库中的字符与数字
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- LCDFlash(); //闪烁效果
- }
- }
- /***********写数据***********/
- void WriteDataLCD(unsigned char WDLCD)
- { ReadStatusLCD(); //检测忙
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_Data = WDLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- /***********写指令************/
- void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
- { if (BuysC) ReadStatusLCD(); //根据需要检测忙
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_Data = WCLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- /***********读数据***********/
- unsigned char ReadDataLCD(void)
- { unsigned char LCDDA;
- LCD_RS = 1;
- LCD_RW = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCDDA=LCD_Data;
- LCD_E = 0;
- return(LCDDA);
- }
- /***********读状态***********/
- unsigned char ReadStatusLCD(void)
- { LCD_Data = 0xFF;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_E = 1;
- LCD_E = 1;
- while (LCD_Data & Busy); //检测忙信号
- LCD_E = 0;
- return(1);
- }
- /***********初始化**********/
- void LCDInit(void)
- { WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
- WriteCommandLCD(0x01,1); //显示清屏
- WriteCommandLCD(0x06,1); // 显示光标移动设置
- WriteCommandLCD(0x0C,1); // 显示开及光标设置
- }
- /***********清屏************/
- void LCDClear(void)
- { WriteCommandLCD(0x01,1); //显示清屏
- WriteCommandLCD(0x34,1); // 显示光标移动设置
- WriteCommandLCD(0x30,1); // 显示开及光标设置
- }
- /***********闪烁效果***********/
- void LCDFlash(void)
- { WriteCommandLCD(0x08,1); //显示清屏
- Delay400Ms();
- WriteCommandLCD(0x0c,1); // 显示开及光标设置
- Delay400Ms();
- WriteCommandLCD(0x08,1); //显示清屏
- Delay400Ms();
- WriteCommandLCD(0x0c,1); // 显示开及光标设置
- Delay400Ms();
- WriteCommandLCD(0x08,1); //显示清屏
- Delay400Ms();
- }
- /***********按指定位置显示一个字符************/
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
- { if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; // 限制X不能大于16,Y不能大于1
- switch(Y){
- case 1:X|=0X80;break;
- case 2:X|=0X90;break;
- case 3:X|=0X88;break;
- case 4:X|=0X98;break;
- }
- WriteCommandLCD(X, 0); // 这里不检测忙信号,发送地址码
- WriteDataLCD(DData);
- }
- /***********按指定位置显示一串字符**************/
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
- { unsigned char ListLength,X2;
- ListLength = 0;
- X2=X;
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; // 限制X不能大于16,Y在1-4之内
- switch(Y){
- case 1:X2|=0X80;break; // 根据行数来选择相应地址
- case 2:X2|=0X90;break;
- case 3:X2|=0X88;break;
- case 4:X2|=0X98;break;
- }
- WriteCommandLCD(X2, 1); // 发送地址码
- while (DData[ListLength]>=0x20){ // 若到达字串尾则退出
- if (X <= 0x0F){ // X坐标应小于0xF
- WriteDataLCD(DData[ListLength]);
- ListLength++;
- X++;
- Delay5Ms();
- }
- }
- }
- /********输出128*64图形数据************/
- void DisplayImage (unsigned char code *DData){
- unsigned char x,y,i;
- unsigned int tmp=0;
- for(i=0;i<9;)
- {
- for(x=0;x<32;x++)
- { // 32行
- WriteCommandLCD(0x34,1);
- WriteCommandLCD((0x80+x),1); // 列地址
- WriteCommandLCD((0x80+i),1); // 行地址,下半屏,即第三行地址0X88
- WriteCommandLCD(0x30,1);
- for(y=0;y<16;y++)
- WriteDataLCD(DData[tmp+y]); // 读取数据写入LCD
- tmp+=16;
- }
- i+=8;
- }
- WriteCommandLCD(0x36,1); // 扩充功能设定
- WriteCommandLCD(0x30,1);
- }
- /***********短延时**************/
- void Delay5Ms(void)
- { unsigned int TempCyc = 5552;
- while(TempCyc--);
- }
- /***********长延时**************/
- void Delay400Ms(void)
- { unsigned char TempCycA = 5;
- unsigned int TempCycB;
- while(TempCycA--){
- TempCycB=7269;
- while(TempCycB--);
- }
- }
复制代码经程序编译和下载,运行时的显示效果如下:
由于QC12864B输出的内容是基于字符的,要想显示一串数值,则需要将数值中的每个数转换为对于的数符,以数值3为例,要显示该数符“3”,需通过3+“0”来完成。 在QC12864B上要显示图形,需要把对应的图形数据存入相应的数组中以供图形的再现。
|