找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7935|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ST7567A-12864LCD屏幕驅(qū)動(dòng)程序與資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
入手一個(gè)ST7567A-12864LCD屏的屏幕,不知道怎么驅(qū)動(dòng)。自己搗鼓了很久,先用網(wǎng)上的代碼,發(fā)現(xiàn)行不通。
我就在網(wǎng)上找了很久,找到了這款屏幕的資料。

這個(gè)屏幕跟常見(jiàn)的LCD12864是不一樣的,它沒(méi)有字庫(kù)。
下面是單片機(jī)驅(qū)動(dòng)代碼:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "LCD12864.h"
  4. #include "charcode.h"
  5. #include <delay.h>


  6. //寫(xiě)入一個(gè)命令到12864
  7. void LCD12864_Write_A_Command(uchar cmd)
  8. {
  9.         CSPIN = 0;           //打開(kāi)片選
  10.         RDPIN = 1;           //讀失能
  11.         RSPIN = 0;       //選擇命令
  12.         RWPIN = 0;       //選擇寫(xiě)模式
  13.         _nop_();
  14.         _nop_();

  15.         LCD_DATA_PORT = cmd; //放置命令
  16.         _nop_();
  17.         _nop_();

  18.         RWPIN = 1;           //寫(xiě)入命令
  19. }

  20. //寫(xiě)入一個(gè)數(shù)據(jù)到12864
  21. void LCD12864_Write_A_Data(uchar dat)
  22. {
  23.         CSPIN = 0;           //打開(kāi)片選
  24.         RDPIN = 1;           //讀失能
  25.         RSPIN = 1;       //選擇數(shù)據(jù)
  26.         RWPIN = 0;       //選擇寫(xiě)模式
  27.         _nop_();
  28.         _nop_();

  29.         LCD_DATA_PORT = dat;       //放置數(shù)據(jù)
  30.         _nop_();
  31.         _nop_();

  32.         RWPIN = 1;           //寫(xiě)數(shù)據(jù)
  33. }

  34. //初始化12864
  35. void LCD12864_Init(void)
  36. {
  37.         uchar i;
  38.         RESET = 0;
  39.         for (i=0; i<100; i++);
  40.         CSPIN = 0;
  41.         RESET = 1;

  42.         //----------------Start Initial Sequence-------//
  43.         //------程序初始化設(shè)置,具體命令可以看文件夾下的數(shù)據(jù)手冊(cè)---//

  44.         //--軟件初始化--//
  45.         LCD12864_Write_A_Command(0xE2);  //reset
  46.         for (i=0; i<100; i++);           //延時(shí)一下

  47.         //--表格第8個(gè)命令,0xA0段(左右)方向選擇正常方向(0xA1為反方向)--//
  48.         LCD12864_Write_A_Command(0xA0);  //ADC select segment direction

  49.         //--表格第15個(gè)命令,0xC8普通(上下)方向選擇選擇反向,0xC8為正常方向,0xC0反向--//
  50.         LCD12864_Write_A_Command(0xC8);  //Common direction

  51.         //--表格第9個(gè)命令,0xA6為設(shè)置字體為黑色,背景為白色---//
  52.         //--0xA7為設(shè)置字體為白色,背景為黑色---//
  53.         LCD12864_Write_A_Command(0xA6);  //reverse display

  54.         //--表格第10個(gè)命令,0xA4像素正常顯示,0xA5像素全開(kāi)--//
  55.         LCD12864_Write_A_Command(0xA4);  //normal display

  56.         //--表格第11個(gè)命令,0xA3偏壓為1/7,0xA2偏壓為1/9--//
  57.         LCD12864_Write_A_Command(0xA2);  //bias set 1/9

  58.         //--表格第19個(gè)命令,這個(gè)是個(gè)雙字節(jié)的命令,0xF800選擇增壓為4X;--//
  59.         //--0xF801,選擇增壓為5X,其實(shí)效果差不多--//
  60.         LCD12864_Write_A_Command(0xF8);  //Boost ratio set
  61.         LCD12864_Write_A_Command(0x01);  //x4

  62.         //--表格第18個(gè)命令,這個(gè)是個(gè)雙字節(jié)命令,高字節(jié)為0X81,低字節(jié)可以--//
  63.         //--選擇從0x00到0X3F。用來(lái)設(shè)置背景光對(duì)比度。---/
  64.         LCD12864_Write_A_Command(0x81);  //V0 a set
  65.         LCD12864_Write_A_Command(0x23);

  66.         //--表格第17個(gè)命令,選擇調(diào)節(jié)電阻率--//
  67.         LCD12864_Write_A_Command(0x25);  //Ra/Rb set

  68.         //--表格第16個(gè)命令,電源設(shè)置。--//
  69.         LCD12864_Write_A_Command(0x2F);
  70.         for (i=0; i<100; i++);

  71.         //--表格第2個(gè)命令,設(shè)置顯示開(kāi)始位置--//
  72.         LCD12864_Write_A_Command(0x40);  //start line

  73.         //--表格第1個(gè)命令,開(kāi)啟顯示--//
  74.         LCD12864_Write_A_Command(0xAF);  // display on
  75.         for (i=0; i<100; i++);
  76. }

  77. //清屏12864
  78. void LCD12864_Clear_Screen(void)
  79. {
  80.         uchar i, j;

  81.         for(i=0; i<8; i++)
  82.         {
  83.                 //--表格第3個(gè)命令,設(shè)置Y的坐標(biāo)--//
  84.                 //--Y軸有64個(gè),一個(gè)坐標(biāo)8位,也就是有8個(gè)坐標(biāo)--//
  85.                 //所以一般我們使用的也就是從0xB0到0x07,就夠了--//
  86.                 LCD12864_Write_A_Command(0xB0 + i);

  87.                 //--表格第4個(gè)命令,設(shè)置X坐標(biāo)--//
  88.                 //--當(dāng)你的段初始化為0xA1時(shí),X坐標(biāo)從0x10,0x04到0x18,0x04,一共128位--//
  89.                 //--當(dāng)你的段初始化為0xA0時(shí),X坐標(biāo)從0x10,0x00到0x18,0x00,一共128位--//
  90.                 //--在寫(xiě)入數(shù)據(jù)之后X坐標(biāo)的坐標(biāo)是會(huì)自動(dòng)加1的,我們初始化使用0xA0所以--//
  91.                 //--我們的X坐標(biāo)從0x10,0x00開(kāi)始---//
  92.                 LCD12864_Write_A_Command(0x10);
  93.                 LCD12864_Write_A_Command(0x00);

  94.                 //--X軸有128位,就一共刷128次,X坐標(biāo)會(huì)自動(dòng)加1,所以我們不用再設(shè)置坐標(biāo)--//
  95.                 for(j = 0; j < 128; j++)
  96.                 {
  97.                         LCD12864_Write_A_Data(0x00);  //如果設(shè)置背景為白色時(shí),清屏選擇0XFF
  98.                 }
  99.         }
  100. }
  101. // 清屏12864,指定區(qū)域清屏(x1, y1)-(x2, y2)
  102. uchar LCD12864_Clear_XYScreen(uchar x1, uchar y1, uchar x2, uchar y2)
  103. {
  104.         uchar i, j, x11, x22;

  105.         //--Y的坐標(biāo)只能從0到7,大于則直接返回--//
  106.         if((y1 > 7 || y1 < 0) || (y2 > 7 || y2 < 0)){
  107.                 return 0;
  108.         }

  109.         //--X的坐標(biāo)只能從0到127,大于則直接返回--//
  110.         if((x1 > 127 || x1 < 0) || (x2 > 127 || x2 < 0)){
  111.                 return 0;
  112.         }

  113.         for(i = y1; i <= y2; i++)
  114.         {
  115.                 LCD12864_Write_A_Command(0xB0 + i); //設(shè)置y坐標(biāo)

  116.                 x11 = (x1 >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  117.                 x22 = x1 & 0x0F;          //取低四位
  118.                 //--設(shè)置X坐標(biāo)--//
  119.                 LCD12864_Write_A_Command(0x10 + x11);   //高4位
  120.                 LCD12864_Write_A_Command(0x00 + x22);        //低4位

  121.                 //X坐標(biāo)會(huì)自動(dòng)加1,所以我們不用再設(shè)置坐標(biāo)--//
  122.                 for(j = x1; j <= x2; j++)
  123.                 {
  124.                         LCD12864_Write_A_Data(0x00);  //如果設(shè)置背景為白色時(shí),清屏選擇0XFF
  125.                 }
  126.         }
  127.         return 1;
  128. }

  129. //在12864上面顯示漢字,reentrant參數(shù)使函數(shù)重入
  130. //x,y為需要顯示漢字的起始XY坐標(biāo),sized為漢字的分辨率大小,*cn為漢字字庫(kù)數(shù)組
  131. uchar LCD12864_Display_CnCHAR(uchar x, uchar y, uchar sized, uchar *cn) reentrant
  132. {
  133.         uchar i, j, x1, x2;

  134.         //--Y的坐標(biāo)只能從0到7,大于則直接返回--//
  135.         if(y > 7 || y < 0){
  136.                 return 0;
  137.         }

  138.         //--X的坐標(biāo)只能從0到127,大于則直接返回--//
  139.         if(x > 127 || x <0){
  140.                 return 0;
  141.         }

  142.         y += 0xB0;           //求取Y坐標(biāo)的值
  143.         //--設(shè)置Y坐標(biāo)--//
  144.         LCD12864_Write_A_Command(y);

  145.         x1 = (x >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  146.         x2 = x & 0x0F;          //去低四位
  147.         //--設(shè)置X坐標(biāo)--//
  148.         LCD12864_Write_A_Command(0x10 + x1);   //高4位
  149.         LCD12864_Write_A_Command(0x00 + x2);        //低4位


  150.         for(i = 0; i < (sized / 8); i++){
  151.                 for(j = 0; j < sized; j++){
  152.                         LCD12864_Write_A_Data(*cn++);
  153.                 }
  154.                 //--設(shè)置Y坐標(biāo)--//
  155.                 y++;
  156.                 LCD12864_Write_A_Command(y);

  157.                 //新行要重新設(shè)置列地址
  158.                 x1 = (x >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  159.                 x2 = x & 0x0F;          //去低四位
  160.                 //--設(shè)置X坐標(biāo)--//
  161.                 LCD12864_Write_A_Command(0x10 + x1);   //高4位
  162.                 LCD12864_Write_A_Command(0x00 + x2);        //低4位
  163.         }

  164.         return 1;
  165. }


  166. //在12864上面顯示BMP圖像
  167. //x,y為需要顯示圖像的起始XY坐標(biāo),sized為圖像的分辨率大小,*cn為圖像數(shù)組
  168. uchar LCD12864_Display_BMP(uchar x, uchar y, uchar sized, uchar *cn)
  169. {
  170.         uchar i, j, x1, x2;

  171.         //--Y的坐標(biāo)只能從0到7,大于則直接返回--//
  172.         if(y > 7 || y < 0){
  173.                 return 0;
  174.         }

  175.         //--X的坐標(biāo)只能從0到127,大于則直接返回--//
  176.         if(x > 127 || x <0){
  177.                 return 0;
  178.         }

  179.         y += 0xB0;           //求取Y坐標(biāo)的值
  180.         //--設(shè)置Y坐標(biāo)--//
  181.         LCD12864_Write_A_Command(y);

  182.         x1 = (x >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  183.         x2 = x & 0x0F;          //去低四位
  184.         //--設(shè)置X坐標(biāo)--//
  185.         LCD12864_Write_A_Command(0x10 + x1);   //高4位
  186.         LCD12864_Write_A_Command(0x00 + x2);        //低4位


  187.         for(i = 0; i < (sized / 8); i++){        //sized/8為顯示完圖像需要的行數(shù),一行為8位,所以顯示16x16的圖像需要兩行
  188.                 for(j = 0; j < sized; j++){                //sized為顯示完圖像需要的列數(shù),一列1位,所以顯示16x16的圖像需要16列
  189.                         LCD12864_Write_A_Data(*cn++);
  190.                 }
  191.                 //--設(shè)置Y坐標(biāo)--//
  192.                 //顯示完第一行的數(shù)據(jù),需要重新設(shè)置下一行的地址
  193.                 y++;
  194.                 LCD12864_Write_A_Command(y);


  195.                 //寫(xiě)列數(shù)據(jù)時(shí),x坐標(biāo)會(huì)自動(dòng)+1,所以新行要重新設(shè)置列地址
  196.                 x1 = (x >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  197.                 x2 = x & 0x0F;          //去低四位
  198.                 //--設(shè)置X坐標(biāo)--//
  199.                 LCD12864_Write_A_Command(0x10 + x1);   //高4位
  200.                 LCD12864_Write_A_Command(0x00 + x2);        //低4位
  201.         }

  202.         return 1;
  203. }

  204. uchar a;
  205. //啟動(dòng)頁(yè)
  206. void LCD_Start_Page(void)
  207. {

  208.         while(1){
  209.                         a=a+1;
  210.         if(a>9){
  211.                 a=0;
  212.         }
  213.         LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, number+a*32);
  214.         LCD12864_Display_CnCHAR(14, 6, CHINESECHARSIZE16, function+4*32);
  215.         LCD12864_Display_CnCHAR(30, 6, CHINESECHARSIZE16, function+5*32);
  216.         Delay1000ms();
  217.         LCD12864_Clear_Screen();
  218.         }
  219.         //LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, number);//功
  220.         //LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, number + 32);//能

  221.         //LCD12864_Display_CnCHAR(95, 6, CHINESECHARSIZE16, number + 64);//鎖
  222.         //LCD12864_Display_CnCHAR(111, 6, CHINESECHARSIZE16, number + 96);//定

  223.         //LCD12864_Display_CnCHAR(16, 1, CHINESECHARSIZE16, number);//中
  224.         //LCD12864_Display_CnCHAR(40, 1, CHINESECHARSIZE16, number + 72);//國(guó)
  225.         //LCD12864_Display_CnCHAR(64, 1, CHINESECHARSIZE16, number + 144);//聯(lián)
  226.         //LCD12864_Display_CnCHAR(88, 1, CHINESECHARSIZE16, number + 216);//通
  227. }

  228. //顯示左右圖標(biāo)
  229. void LCD_Display_ForRew(void)
  230. {
  231.         LCD12864_Display_BMP(20, 2, BMPSIZE16, for_rew);//左圖標(biāo)
  232.         LCD12864_Display_BMP(92, 2, BMPSIZE16, for_rew + 32);//右圖標(biāo)
  233. }

  234. //顯示短信信息頁(yè)
  235. void LCD_Display_Message(void)
  236. {
  237.         LCD_Display_ForRew();//顯示左右圖標(biāo)
  238.         LCD12864_Display_BMP(48, 0, BMPSIZE32, message);//顯示信息圖標(biāo)

  239.         //LCD12864_Clear_XYScreen(40, 4, 88, 5);//清除顯示屏指定位置信息

  240.         LCD12864_Display_CnCHAR(48, 4, CHINESECHARSIZE16, message + 128);//信
  241.         LCD12864_Display_CnCHAR(64, 4, CHINESECHARSIZE16, message + 160);//息

  242.         LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, select_return);//選
  243.         LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, select_return + 32);//擇

  244.         LCD12864_Display_CnCHAR(95, 6, CHINESECHARSIZE16, select_return + 64);//返
  245.         LCD12864_Display_CnCHAR(111, 6, CHINESECHARSIZE16, select_return + 96);//回
  246. }

  247. //顯示聯(lián)系人信息頁(yè)
  248. void LCD_Display_Contact(void)
  249. {
  250.         LCD_Display_ForRew();//顯示左右圖標(biāo)
  251.         LCD12864_Display_BMP(48, 0, BMPSIZE32, contact);//顯示聯(lián)系人圖標(biāo)

  252.         //LCD12864_Clear_XYScreen(40, 4, 88, 5);//清除顯示屏指定位置信息

  253.         LCD12864_Display_CnCHAR(40, 4, CHINESECHARSIZE16, contact + 128);//聯(lián)
  254.         LCD12864_Display_CnCHAR(56, 4, CHINESECHARSIZE16, contact + 160);//系
  255.         LCD12864_Display_CnCHAR(72, 4, CHINESECHARSIZE16, contact + 192);//人

  256.         LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, select_return);//選
  257.         LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, select_return + 32);//擇

  258.         LCD12864_Display_CnCHAR(95, 6, CHINESECHARSIZE16, select_return + 64);//返
  259.         LCD12864_Display_CnCHAR(111, 6, CHINESECHARSIZE16, select_return + 96);//回
  260. }

  261. //鎖定屏幕
  262. void LCD_Locked_Screen(void)
  263. {
  264.         LCD12864_Display_CnCHAR(4, 1, CHINESECHARSIZE24, locked_screen);//屏
  265.         LCD12864_Display_CnCHAR(28, 1, CHINESECHARSIZE24, locked_screen + 72);//幕
  266.         LCD12864_Display_CnCHAR(52, 1, CHINESECHARSIZE24, locked_screen + 144);//已
  267.         LCD12864_Display_CnCHAR(74, 1, CHINESECHARSIZE24, locked_screen + 216);//鎖
  268.         LCD12864_Display_CnCHAR(98, 1, CHINESECHARSIZE24, locked_screen + 288);//定

  269.         LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, locked_screen + 360);//解
  270.         LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, locked_screen + 392);//鎖
  271. }
復(fù)制代碼

驅(qū)動(dòng)芯片的資料(僅供參考): ST7565p數(shù)據(jù)手冊(cè).pdf (858.26 KB, 下載次數(shù): 99)

其他不重要資料(僅供參考):
12864數(shù)據(jù)手冊(cè).pdf (1.3 MB, 下載次數(shù): 72)
12864轉(zhuǎn)接原理圖.pdf (148.73 KB, 下載次數(shù): 52)
實(shí)驗(yàn)必讀.doc (291 KB, 下載次數(shù): 51)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表