查看: 1986|回复: 4

[其他] QC12864B液晶显示屏学习笔记_2

[复制链接]
  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    连续签到: 1 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7123
    最后登录
    2023-4-20
    发表于 2016-1-17 21:42:20 | 显示全部楼层 |阅读模式
    为了尽快掌握QC12864B的使用方法,这里采用先在51单片机上实现QC12864B的显示功能以验证程序的可靠性,然后再将其移植到YL-KL26Z 开发板上看能否实现显示功能。
         51单片机5V的并行模式
    从并行模式的信号时序可知,在接好QC12864B的工作电源外,还要连接的引脚有RSR/WEDB0~DB7
    在单片机最小系统的基础上,可按如下原理图来构建。其中RSP1.0连接,R/WP1.1连接,EP1.2连接,DB0~DB7与P0.0~P0.7向连。调节RW1可改变QC12864B的显示亮度。

    LCD12864上以并行模式显示字符、汉字、图形的代码如下:
    1. /***********************************************
    2. 标题:        LCD12864程序
    3. 效果:        基于51单片机STC89C52的LCD12864液晶屏
    4.         并行模式显示程序,显示内容为字符、汉字及图形
    5. ************************************************/
    6. #include "reg51.h"
    7. /********IO引脚定义********/
    8. sbit LCD_RS=P1^0;
    9. sbit LCD_RW=P1^1;
    10. sbit LCD_E=P1^2;
    11. sbit PSB =P1^6;                   //  PSB=1,使用8位并行模式
    12. /********宏定义********/
    13. #define LCD_Data P0
    14. #define Busy    0x80   //   用于检测LCD状态字中的Busy标识
    15. /********函数声明********/
    16. void WriteDataLCD(unsigned char WDLCD);
    17. void WriteCommandLCD(unsigned char WCLCD,BuysC);
    18. unsigned char ReadDataLCD(void);
    19. unsigned char ReadStatusLCD(void);
    20. void LCDInit(void);
    21. void LCDClear(void);
    22. void LCDFlash(void);
    23. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
    24. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
    25. void DisplayImage (unsigned char code *DData);
    26. void Delay5Ms(void);
    27. void Delay400Ms(void);
    28. /********数据定义********/
    29. code unsigned char  u1[] = {"5 1 单片机实验板"};
    30. code unsigned char  u2[] = {" www.5i51.com  "};
    31. code unsigned char  u3[] = {"自学单片机的首选"};
    32. code unsigned char  u4[] = {"  QQ: 12345678  "};
    33. code unsigned char tmp[]={//128*64点阵图形海豚戏水数据
    34. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    35. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    36. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    37. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    40. 0x00,0x7F,0x00,0x00,0x00,0x03,0xFE,0x00,0x00,0x00,0x00,0x02,0x00,0x76,0x00,0x00,
    41. 0x00,0xC3,0xFF,0x00,0x00,0x3F,0xE7,0xE0,0x00,0x00,0x00,0x03,0x00,0xFF,0x80,0x00,
    42. 0x00,0x81,0xFF,0xFE,0x00,0x7C,0x03,0xF0,0x00,0x00,0x00,0x01,0xF7,0xCB,0xF8,0x00,
    43. 0x01,0x83,0xF8,0x7B,0x00,0x40,0x00,0x30,0x00,0x00,0x00,0x00,0x3F,0xC0,0xF8,0x00,
    44. 0x03,0x1E,0x3C,0x01,0x80,0x60,0x00,0x30,0x00,0x00,0x00,0x00,0x01,0x40,0x18,0x00,
    45. 0x03,0x30,0x0C,0x01,0xE0,0x6C,0x00,0x70,0x00,0x00,0x00,0x00,0x01,0x7C,0xCC,0x00,
    46. 0x03,0x24,0x6F,0x31,0x20,0x7C,0x40,0x60,0x00,0x00,0x00,0x00,0x01,0x97,0xFC,0x00,
    47. 0x01,0xBF,0xFB,0xF3,0xE0,0x3F,0xE7,0xC0,0x00,0x00,0x00,0x00,0x01,0xFB,0x1C,0x00,
    48. 0x00,0x9B,0xC2,0x1F,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x0C,0xFE,0x00,
    49. 0x00,0xCC,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xB8,0x00,
    50. 0x00,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
    51. 0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,
    52. 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xE0,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,
    53. 0x00,0x00,0x00,0x1F,0x00,0x00,0x78,0x01,0xC0,0x00,0x00,0x70,0x00,0x00,0x00,0x00,
    54. 0x00,0x00,0x00,0x20,0x80,0x00,0xF8,0x01,0x80,0x00,0x00,0x30,0x00,0x00,0x00,0x00,
    55. 0x00,0x00,0x00,0x2E,0x80,0x00,0xD8,0x03,0x60,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,
    56. 0x00,0x00,0x00,0x2A,0x80,0x00,0x98,0x02,0x60,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,
    57. 0x00,0x00,0x00,0x2E,0x80,0x01,0x98,0x03,0xE0,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,
    58. 0x00,0x00,0x00,0x20,0x83,0xFF,0x8C,0x07,0xE1,0xC8,0x00,0x30,0x00,0x00,0x00,0x00,
    59. 0x00,0x00,0x00,0x1F,0x7F,0x07,0x8C,0x0F,0xFF,0x8C,0x00,0x18,0x00,0x00,0x00,0x00,
    60. 0x00,0x00,0x00,0x00,0xB8,0x0F,0xCC,0x1F,0x83,0x8F,0x00,0x18,0x00,0x00,0x00,0x00,
    61. 0x00,0x00,0x00,0x39,0xC0,0x38,0xFE,0x1E,0x00,0x8F,0xC0,0x0C,0x00,0x00,0x00,0x00,
    62. 0x00,0x00,0x00,0x3B,0x80,0x70,0x1E,0x00,0x00,0xCC,0xF0,0x0C,0x00,0x00,0x00,0x00,
    63. 0x00,0x00,0x00,0x76,0x00,0xC0,0x00,0x00,0x00,0x6E,0x3C,0x06,0x00,0x00,0x00,0x00,
    64. 0x00,0x00,0x00,0x7E,0x01,0x80,0x00,0x00,0x00,0x3F,0x0E,0x06,0x00,0x00,0x00,0x00,
    65. 0x00,0x00,0x00,0xDC,0x03,0x00,0x00,0x00,0x00,0x1F,0x03,0x82,0x00,0x00,0x00,0x00,
    66. 0x00,0x00,0x00,0xD8,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xC2,0x00,0x00,0x00,0x00,
    67. 0x00,0x00,0x00,0xC0,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x00,
    68. 0x00,0x00,0x00,0x80,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,
    69. 0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00,
    70. 0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,
    71. 0x00,0x00,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x00,
    72. 0xFF,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0x00,
    73. 0x00,0x00,0x01,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x3F,0xD8,0x00,0x00,0x00,0x00,
    74. 0x3E,0x00,0x01,0x80,0x60,0x00,0x00,0x00,0x07,0xE0,0x3D,0xF0,0x01,0xF0,0x0C,0x00,
    75. 0xFF,0x80,0x01,0x80,0x6C,0x00,0x00,0x00,0x3E,0xF0,0x2C,0x60,0x07,0xFF,0xFC,0x00,
    76. 0x81,0xF8,0x71,0x01,0xDC,0x03,0xFC,0x00,0xF3,0xFF,0x87,0xE0,0x06,0x07,0xE0,0x00,
    77. 0x00,0x3F,0xE1,0x03,0xFC,0x0F,0x1F,0x87,0xC2,0x00,0x04,0xE0,0x00,0x00,0x00,0x00,
    78. 0x00,0x00,0x03,0x00,0x0C,0x1C,0x03,0xFF,0x00,0x00,0x01,0xE0,0x7F,0x03,0xF0,0x00,
    79. 0x00,0x00,0x03,0x00,0x18,0x10,0x00,0x00,0x00,0x00,0x01,0xC1,0xF3,0xF7,0x3C,0x00,
    80. 0xFF,0xC0,0x0F,0x02,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x7E,0x0E,0x00,
    81. 0xE1,0xFF,0xFF,0x03,0xF0,0x00,0x00,0x00,0x00,0x03,0xF8,0x7C,0x00,0x00,0x02,0x00,
    82. 0x00,0x01,0xE3,0x03,0xC0,0x00,0x03,0xFF,0x00,0x0F,0x1F,0xE0,0x00,0x00,0x00,0x00,
    83. 0x00,0x00,0x03,0x01,0x00,0x00,0x0F,0x03,0xF0,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,
    84. 0x03,0xFC,0x03,0x01,0x0F,0x00,0x0C,0x00,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
    85. 0x0F,0x0F,0x8D,0x01,0x3F,0xE0,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    86. 0x1C,0x01,0xFD,0x81,0x30,0x7C,0x03,0xC0,0xFE,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
    87. 0x18,0x00,0x01,0xBF,0x00,0x0F,0xFF,0x07,0xC7,0xE0,0x00,0x00,0x1C,0x00,0x00,0x00,
    88. 0x00,0x00,0x00,0xFF,0x80,0x01,0xF8,0x3E,0x00,0x78,0x0F,0xF0,0x78,0x00,0x00,0x00,
    89. 0x00,0x0F,0x00,0x7F,0x83,0x80,0x3F,0xF1,0xF8,0x1E,0x1C,0x7F,0xE0,0x07,0xE0,0x00,
    90. 0x00,0x1F,0xE0,0x3F,0xDF,0xFE,0x00,0x07,0x9F,0x83,0xF0,0x00,0x00,0x1C,0x7C,0x00,
    91. 0x00,0x78,0x70,0x1F,0xD0,0x07,0xC0,0x3C,0x01,0xF8,0x03,0xC0,0x00,0x18,0x00,0x00,
    92. 0xFF,0xE0,0x1F,0x73,0xE0,0x00,0xFF,0xE0,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,
    93. 0x00,0x00,0x07,0xE1,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    94. 0x00,0x0F,0x80,0x00,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    95. 0x00,0x7F,0xE0,0x00,0x07,0x9E,0x00,0x7F,0xC0,0x60,0x0F,0xC0,0x0F,0x00,0x00,0x00,
    96. 0x00,0xE0,0x7C,0x00,0x03,0xF7,0xC7,0xE0,0xFF,0xE0,0x3F,0xFF,0xFC,0x00,0x00,0x00,
    97. 0x01,0xC0,0x0F,0x00,0x03,0xBD,0xFE,0xFC,0x00,0x00,0xF0,0x1F,0xF0,0x00,0xC6,0x00
    98. };
    99. /***********主函数开始***********/
    100. void main(void)
    101. {         Delay400Ms();         //  启动等待,等LCD讲入工作状态
    102.         LCDInit();                 //  LCD初始化
    103.           while(1){
    104.                 LCDClear();
    105.                 DisplayImage(tmp);                        //显示图形
    106.                 Delay400Ms();
    107.                 Delay400Ms();
    108.                 Delay400Ms();
    109.                 Delay400Ms();
    110.                 Delay400Ms();
    111.                 Delay400Ms();
    112.                 Delay400Ms();
    113.                 Delay400Ms();
    114.                 LCDClear();
    115.                 DisplayListChar(0,1,u1);            //显示字库中的中文与数字
    116.                 DisplayListChar(0,2,u2);                //显示字库中的字符与数字
    117.                 DisplayListChar(0,3,u3);                //显示字库中的中文
    118.                 DisplayListChar(0,4,u4);                //显示字库中的字符与数字
    119.                 Delay400Ms();
    120.                 Delay400Ms();
    121.                 Delay400Ms();
    122.                 Delay400Ms();
    123.                 LCDFlash();                                        //闪烁效果
    124.         }
    125. }
    126. /***********写数据***********/
    127. void WriteDataLCD(unsigned char WDLCD)
    128. {         ReadStatusLCD(); //检测忙
    129.         LCD_RS = 1;
    130.         LCD_RW = 0;
    131.         LCD_Data = WDLCD;
    132.         LCD_E = 1;
    133.         LCD_E = 1;
    134.         LCD_E = 1;
    135.         LCD_E = 0;
    136. }
    137. /***********写指令************/
    138. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
    139. {         if (BuysC) ReadStatusLCD(); //根据需要检测忙
    140.         LCD_RS = 0;
    141.         LCD_RW = 0;
    142.         LCD_Data = WCLCD;
    143.         LCD_E = 1;
    144.         LCD_E = 1;
    145.         LCD_E = 1;
    146.         LCD_E = 0;  
    147. }
    148. /***********读数据***********/
    149. unsigned char ReadDataLCD(void)
    150. {        unsigned char LCDDA;
    151.         LCD_RS = 1;
    152.         LCD_RW = 1;
    153.         LCD_E = 1;
    154.         LCD_E = 1;
    155.         LCDDA=LCD_Data;
    156.         LCD_E = 0;
    157.         return(LCDDA);
    158. }
    159. /***********读状态***********/
    160. unsigned char ReadStatusLCD(void)
    161. {         LCD_Data = 0xFF;
    162.         LCD_RS = 0;
    163.         LCD_RW = 1;
    164.         LCD_E = 1;
    165.         LCD_E = 1;
    166.         while (LCD_Data & Busy); //检测忙信号       
    167.         LCD_E = 0;
    168.         return(1);
    169. }
    170. /***********初始化**********/
    171. void LCDInit(void)
    172. {         WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
    173.         WriteCommandLCD(0x01,1); //显示清屏
    174.         WriteCommandLCD(0x06,1); // 显示光标移动设置
    175.         WriteCommandLCD(0x0C,1); // 显示开及光标设置
    176. }
    177. /***********清屏************/       
    178. void LCDClear(void)
    179. {         WriteCommandLCD(0x01,1); //显示清屏
    180.         WriteCommandLCD(0x34,1); // 显示光标移动设置
    181.         WriteCommandLCD(0x30,1); // 显示开及光标设置
    182. }
    183. /***********闪烁效果***********/
    184. void LCDFlash(void)
    185. {         WriteCommandLCD(0x08,1); //显示清屏
    186.         Delay400Ms();
    187.         WriteCommandLCD(0x0c,1); // 显示开及光标设置
    188.         Delay400Ms();
    189.         WriteCommandLCD(0x08,1); //显示清屏
    190.         Delay400Ms();
    191.         WriteCommandLCD(0x0c,1); // 显示开及光标设置
    192.         Delay400Ms();
    193.         WriteCommandLCD(0x08,1); //显示清屏
    194.         Delay400Ms();
    195. }

    196. /***********按指定位置显示一个字符************/       
    197. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
    198. {        if(Y<1)
    199.                 Y=1;
    200.         if(Y>4)
    201.                 Y=4;
    202.         X &= 0x0F;                             // 限制X不能大于16,Y不能大于1
    203.         switch(Y){
    204.         case 1:X|=0X80;break;
    205.         case 2:X|=0X90;break;
    206.         case 3:X|=0X88;break;
    207.         case 4:X|=0X98;break;
    208.         }
    209.         WriteCommandLCD(X, 0);  // 这里不检测忙信号,发送地址码
    210.         WriteDataLCD(DData);
    211. }
    212. /***********按指定位置显示一串字符**************/
    213. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
    214. {        unsigned char ListLength,X2;
    215.         ListLength = 0;
    216.         X2=X;
    217.         if(Y<1)
    218.                 Y=1;
    219.         if(Y>4)
    220.                 Y=4;
    221.         X &= 0x0F;                                 // 限制X不能大于16,Y在1-4之内
    222.         switch(Y){
    223.         case 1:X2|=0X80;break;        // 根据行数来选择相应地址
    224.         case 2:X2|=0X90;break;
    225.         case 3:X2|=0X88;break;
    226.         case 4:X2|=0X98;break;
    227.         }
    228.         WriteCommandLCD(X2, 1);              // 发送地址码
    229.           while (DData[ListLength]>=0x20){  // 若到达字串尾则退出
    230.                    if (X <= 0x0F){                              // X坐标应小于0xF
    231.                      WriteDataLCD(DData[ListLength]);
    232.                      ListLength++;
    233.                          X++;
    234.                          Delay5Ms();
    235.             }
    236.           }
    237. }
    238. /********输出128*64图形数据************/
    239. void DisplayImage (unsigned char code *DData){
    240.         unsigned char x,y,i;
    241.         unsigned int tmp=0;
    242.         for(i=0;i<9;)
    243.     {
    244.         for(x=0;x<32;x++)
    245.         {                                                    // 32行
    246.                 WriteCommandLCD(0x34,1);
    247.                 WriteCommandLCD((0x80+x),1);        // 列地址
    248.                 WriteCommandLCD((0x80+i),1);        // 行地址,下半屏,即第三行地址0X88
    249.                 WriteCommandLCD(0x30,1);               
    250.                 for(y=0;y<16;y++)       
    251.                         WriteDataLCD(DData[tmp+y]); // 读取数据写入LCD
    252.                 tmp+=16;               
    253.             }
    254.         i+=8;
    255.         }
    256.         WriteCommandLCD(0x36,1);                        // 扩充功能设定
    257.         WriteCommandLCD(0x30,1);
    258. }
    259. /***********短延时**************/
    260. void Delay5Ms(void)
    261. {         unsigned int TempCyc = 5552;
    262.         while(TempCyc--);
    263. }
    264. /***********长延时**************/
    265. void Delay400Ms(void)
    266. {         unsigned char TempCycA = 5;
    267.         unsigned int TempCycB;
    268.         while(TempCycA--){
    269.           TempCycB=7269;
    270.           while(TempCycB--);
    271.         }
    272. }
    复制代码
    经程序编译和下载,运行时的显示效果如下:

    由于QC12864B输出的内容是基于字符的,要想显示一串数值,则需要将数值中的每个数转换为对于的数符,以数值3为例,要显示该数符“3”,需通过3+0来完成。
        在QC12864B上要显示图形,需要把对应的图形数据存入相应的数组中以供图形的再现。


    我知道答案 目前已有4人回答

    并行模式电路图

    并行模式电路图

    显示效果

    显示效果

    评分

    参与人数 1NXP金币 +20 收起 理由
    小七 + 20 很给力!

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    555

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    1343
    最后登录
    2018-10-23
    发表于 2016-1-18 09:06:59 | 显示全部楼层
    谢谢分享              
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-1-18 09:10:44 | 显示全部楼层
    谢谢分享    blank.png blank1.png blank2.png blank3.png blank4.png blank5.png blank6.png blank7.png blank8.png blank9.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13128
    最后登录
    2019-1-27
    发表于 2016-1-18 14:34:21 | 显示全部楼层
    不错不错~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-1-18 17:01:40 | 显示全部楼层
    只是51上的,尽管可以移植。思路可以学习。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 15:14 , Processed in 0.104221 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表