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

QQ登錄

只需一步,快速開始

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

st7565芯片1.32英寸SO12864帶字庫芯片W25X16單片機(jī)驅(qū)動(dòng)程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
感謝別人的分享,提供給需要的人方便。


引腳圖:


還提供這些資料:
W25X16中文手冊(cè).pdf
W25X40BL—字庫芯片資料.pdf
st7565中文參考資料.pdf

51單片機(jī)st7565源程序如下:
  1. /*STC89C52 3.3v小屏12864 串口 測(cè)試STC12C5A60S2能用,延時(shí)時(shí)間有差別
  2.   字符0-9=203-212,A-Z=220-245,a-z=252-277
  3.   GB漢字編碼和字符地址公式:芯片地址*32=GB高8位*256+GB低8位-43807-((GB高8位-0xb0)*162)
  4.   全格數(shù)字字母地址公式:芯片地址*32=GB高8位*256+GB低8位-41701
  5.   半格數(shù)字字母地址公式:芯片地址*32=ISCII碼+155
  6.   注:字符芯片參考的是W25X16中文手冊(cè),芯片用的是3.3v電壓,與5v電壓的C52連接的I/O口都串接了1.3K的電阻*/
  7. #include<reg52.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10.                                                                                
  11. sbit Z_DO=P3^1;                                        //字符芯片串行數(shù)據(jù)輸出端 (MOSI)       
  12. sbit Z_CS=P3^2;                                        //字符芯片串行片選端
  13. sbit L_CS=P3^3;                                        //LCD片選端
  14. sbit L_RST=P3^4;                                //LCD復(fù)位端
  15. sbit L_A0=P3^5;                                        //LCD數(shù)據(jù)/命令(H/L)選擇端
  16. sbit CLK=P3^6;                                        //LCD和字符芯片串行時(shí)鐘端                         (共用)
  17. sbit SI=P3^7;                                        //LCD和字符芯片共用串行數(shù)據(jù)端 (MISO) (共用)

  18. code uchar t123[]="0123456789ABCDEF";

  19. void delay(uint XMS)                        //延時(shí)
  20. {
  21.         uint i;
  22.         for(;XMS>0;XMS--)
  23.                 for(i=123;i>0;i--);
  24. }
  25. void write_byte(uchar dat)                //LCD和字符芯片串口寫入1個(gè)字節(jié)(8位)
  26. {
  27.         uchar i;
  28.         for(i=0;i<8;i++)
  29.         {
  30.                 if(dat&0x80) SI=1;
  31.                 else SI=0;
  32.                 dat<<=1;
  33.                 CLK=0;
  34.                 CLK=1;
  35.         }
  36. }
  37. void lcd_write_cmd(uchar cmd)        //LCD寫入命令
  38. {
  39.         L_A0=0;                                                        //命令                                                  
  40.         L_CS=0;                                                        //片選
  41.         write_byte(cmd);
  42.         L_CS=1;
  43. }
  44. void lcd_write_dat(uchar dat)        //LCD寫入數(shù)據(jù)
  45. {
  46.         L_A0=1;                                                        //數(shù)據(jù)                                                  
  47.         L_CS=0;                                                        //片選
  48.         write_byte(dat);
  49.         L_CS=1;
  50. }
  51. void clr_lcd()                                        //LCD清屏
  52. {
  53.         uchar i,j;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 lcd_write_cmd(0xb0+i);
  57.                 lcd_write_cmd(0x10+0);
  58.                 lcd_write_cmd(0x00+0);
  59.                 for(j=132;j>0;j--)
  60.                         lcd_write_dat(0x00);
  61.         }
  62. }
  63. void lcd_init()                                        //LCD初始化
  64. {
  65.         L_RST=0;
  66.         L_RST=1;
  67.         lcd_write_cmd(0xaf);                                //0xaf開顯示;0xae關(guān)顯示

  68.         lcd_write_cmd(0x40);                                //起始行顯示地址(0-63)(設(shè)置哪一行顯示為首行)

  69.         lcd_write_cmd(0xa1);                                //開ADC=0xa1,顯示從下往上0-127;關(guān)ADC=0xa0,顯示由上往下3-131  

  70.         lcd_write_cmd(0xa6);                                //0xa6關(guān)反白,0xa7開反白

  71.     lcd_write_cmd(0xa4);                                //0xa4正常顯示,0xa5顯示所有點(diǎn)
  72.   
  73.         lcd_write_cmd(0xa2);                                //LCD的偏壓比 1/9BIAS

  74.         lcd_write_cmd(0xc8);                                //0xc8正常輸出方向(上為首行);0x80反向輸出(下為首行)

  75.         lcd_write_cmd(0x2f);                                //內(nèi)部電源選擇(0x28-0x2f,應(yīng)設(shè)0x2f)

  76.         lcd_write_cmd(0x24);                                //LCD驅(qū)動(dòng)電壓的電阻比(0x20-0x27,5v可設(shè)0x24)

  77.         lcd_write_cmd(0x81);                                //進(jìn)入設(shè)置對(duì)比度輸出電壓V0

  78.         lcd_write_cmd(0x24);                                //為對(duì)比度的第二條指令,對(duì)比度電壓的等級(jí)(0x00-0x3f)

  79.         clr_lcd();
  80. }
  81. /*void z_write_byte(uchar dat)        //字符芯片寫入1個(gè)字節(jié)
  82. {
  83.         Z_CS=0;                                                //片選
  84.         write_byte(dat);
  85.         Z_CS=1;
  86. }*/
  87. uchar z_read_byte()                                //字符芯片讀出1個(gè)字節(jié)
  88. {
  89.         uchar val=0,i;
  90.         Z_DO=1;
  91.         for(i=8;i>0;i--)
  92.         {                       
  93.                 val<<=1;          
  94.                 CLK=0;
  95.                 CLK=1;
  96.                 if(Z_DO) val++;
  97.         }
  98.         return val;
  99. }
  100. /*uchar z_read_add(uchar h,uchar z,uchar l)                                //讀字符芯片相應(yīng)地址的單個(gè)數(shù)據(jù)
  101. {
  102.         uchar val;
  103.         Z_CS=0;                                                //片選
  104.         write_byte(0x03);
  105.         write_byte(h);
  106.         write_byte(z);
  107.         write_byte(l);
  108.         val=z_read_byte();
  109.         Z_CS=1;
  110.         return val;
  111. }*/
  112. void z_init()                                        //字符芯片初始化
  113. {
  114.         Z_CS=1;
  115. }
  116. void init()                                                //程序初始化
  117. {
  118.         delay(100);
  119.         lcd_init();
  120.         z_init();
  121.         delay(100);
  122. }
  123. void lcd_out_spot(uchar y,uchar x,uchar dat)        //X軸(左0-127右),Y軸(上0-7下),8位數(shù)(8個(gè)點(diǎn),左低-右高)
  124. {
  125.         y&=0x07; x&=127;                                                //數(shù)值限制
  126.         lcd_write_cmd(0xb0+y);                                        //頁地址(0-7)
  127.         lcd_write_cmd(0x10|(x>>4));                                //列地址高4位(0-131)
  128.         lcd_write_cmd(0x00+(x&0x0f));                        //列地址低4位(0-131)
  129.         lcd_write_dat(dat);
  130. }
  131. void lcd_typeface(uchar y,uchar x,uint zt)                //在xy坐標(biāo)地址顯示字符
  132. {
  133.         uchar temp[32];
  134.         uchar i;
  135.         Z_CS=0;                                                                                //片選
  136.         write_byte(0x03);
  137.         write_byte((zt>>11)&0xff);
  138.         write_byte((zt>>3)&0xff);
  139.         write_byte((zt<<5)&0xff);
  140.         for(i=0;i<32;i++)
  141.                 temp[i]=z_read_byte();
  142.         Z_CS=1;
  143.         y%=7;                                                                                //因一個(gè)字占兩個(gè)頁(行,16點(diǎn)),所以限制只能到6
  144.         x%=113;                                                                                //因一個(gè)字占16(列點(diǎn)),所以限制只能到112
  145.         lcd_write_cmd(0xb0+y);                                                //頁地址(0-7)
  146.         lcd_write_cmd(0x10|(x>>4));                                        //列地址高4位(0-131)
  147.         lcd_write_cmd(0x00+(x&0x0f));                                //列地址低4位(0-131)
  148.         for(i=0;i<16;i++)
  149.                 lcd_write_dat(temp[i]);
  150.         lcd_write_cmd(0xb0+y+1);                                        //頁地址(0-7)
  151.         lcd_write_cmd(0x10|(x>>4));                                        //列地址高4位(0-131)
  152.         lcd_write_cmd(0x00+(x&0x0f));                                //列地址低4位(0-131)
  153.         for(i=0;i<16;i++)
  154.                 lcd_write_dat(temp[i+16]);
  155. }
  156. uint GB_ZT(uchar *p)                //漢字GB碼轉(zhuǎn)換成字體芯片對(duì)應(yīng)漢字地址(只適用中文)
  157. {
  158.         uchar m,n;
  159.         uint val=0;
  160.         m=*p;
  161.         p++;
  162.         n=*p;
  163.         val=m<<8|n;
  164.         val=val-43807-((m-0xb0)*162);
  165.         return val;
  166. }
  167. uint GB_ZF_WORD(uchar *p)                //GB碼表轉(zhuǎn)換成字體芯片地址(只適用全格數(shù)字和字母)
  168. {
  169.         uchar m,n;
  170.         uint val=0;
  171.         m=*p;
  172.         p++;
  173.         n=*p;
  174.         val=m<<8|n;
  175.         val=val-41701;
  176.         return val;       
  177. }
  178. uint GB_ZF_BYTE(uchar *p)                //GB碼表轉(zhuǎn)換成字體芯片地址(只適用半格數(shù)字和字母)(適用于ASCII數(shù)字查表)
  179. {
  180.         uint val;
  181.         val=*p+155;
  182.         return val;
  183. }
  184. void out_lcd()                                //輸出到LCD
  185. {
  186.         uint i;                                                                        
  187.         lcd_out_spot(0,0,0x00);                                        //畫點(diǎn)
  188.         lcd_typeface(0,0,78);                                        //星 符號(hào)
  189. ……………………

  190. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
20170508 小屏12860串口.rar (1.98 MB, 下載次數(shù): 133)

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

使用道具 舉報(bào)

沙發(fā)
ID:216379 發(fā)表于 2017-7-2 10:26 | 只看該作者
所有資料51hei提供下載:
回復(fù)

使用道具 舉報(bào)

板凳
ID:44037 發(fā)表于 2017-7-3 11:43 | 只看該作者
謝謝分享  正好有個(gè)液晶模塊   試一下
回復(fù)

使用道具 舉報(bào)

地板
ID:713797 發(fā)表于 2020-3-23 08:52 | 只看該作者
thank you share data
回復(fù)

使用道具 舉報(bào)

5#
ID:975756 發(fā)表于 2022-6-24 22:41 | 只看該作者
想問一下,如何讓屏幕豎屏顯示字體,是有什么指令嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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