| 为了尽快掌握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上要显示图形,需要把对应的图形数据存入相应的数组中以供图形的再现。 
 
 |