找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5832|回复: 4
收起左侧

st7565芯片1.32英寸SO12864带字库芯片W25X16单片机驱动程序

  [复制链接]
ID:162136 发表于 2017-5-11 20:02 | 显示全部楼层 |阅读模式
感谢别人的分享,提供给需要的人方便。
0.png 0.png

引脚图:
0.png 0.png

还提供这些资料:
W25X16中文手册.pdf
W25X40BL—字库芯片资料.pdf
st7565中文参考资料.pdf

51单片机st7565源程序如下:
  1. /*STC89C52 3.3v小屏12864 串口 测试STC12C5A60S2能用,延时时间有差别
  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.   全格数字字母地址公式:芯片地址*32=GB高8位*256+GB低8位-41701
  5.   半格数字字母地址公式:芯片地址*32=ISCII码+155
  6.   注:字符芯片参考的是W25X16中文手册,芯片用的是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;                                        //字符芯片串行数据输出端 (MOSI)       
  12. sbit Z_CS=P3^2;                                        //字符芯片串行片选端
  13. sbit L_CS=P3^3;                                        //LCD片选端
  14. sbit L_RST=P3^4;                                //LCD复位端
  15. sbit L_A0=P3^5;                                        //LCD数据/命令(H/L)选择端
  16. sbit CLK=P3^6;                                        //LCD和字符芯片串行时钟端                         (共用)
  17. sbit SI=P3^7;                                        //LCD和字符芯片共用串行数据端 (MISO) (共用)

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

  19. void delay(uint XMS)                        //延时
  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个字节(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写入数据
  45. {
  46.         L_A0=1;                                                        //数据                                                  
  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关显示

  68.         lcd_write_cmd(0x40);                                //起始行显示地址(0-63)(设置哪一行显示为首行)

  69.         lcd_write_cmd(0xa1);                                //开ADC=0xa1,显示从下往上0-127;关ADC=0xa0,显示由上往下3-131  

  70.         lcd_write_cmd(0xa6);                                //0xa6关反白,0xa7开反白

  71.     lcd_write_cmd(0xa4);                                //0xa4正常显示,0xa5显示所有点
  72.   
  73.         lcd_write_cmd(0xa2);                                //LCD的偏压比 1/9BIAS

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

  75.         lcd_write_cmd(0x2f);                                //内部电源选择(0x28-0x2f,应设0x2f)

  76.         lcd_write_cmd(0x24);                                //LCD驱动电压的电阻比(0x20-0x27,5v可设0x24)

  77.         lcd_write_cmd(0x81);                                //进入设置对比度输出电压V0

  78.         lcd_write_cmd(0x24);                                //为对比度的第二条指令,对比度电压的等级(0x00-0x3f)

  79.         clr_lcd();
  80. }
  81. /*void z_write_byte(uchar dat)        //字符芯片写入1个字节
  82. {
  83.         Z_CS=0;                                                //片选
  84.         write_byte(dat);
  85.         Z_CS=1;
  86. }*/
  87. uchar z_read_byte()                                //字符芯片读出1个字节
  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)                                //读字符芯片相应地址的单个数据
  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位数(8个点,左低-右高)
  124. {
  125.         y&=0x07; x&=127;                                                //数值限制
  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坐标地址显示字符
  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;                                                                                //因一个字占两个页(行,16点),所以限制只能到6
  144.         x%=113;                                                                                //因一个字占16(列点),所以限制只能到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码转换成字体芯片对应汉字地址(只适用中文)
  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码表转换成字体芯片地址(只适用全格数字和字母)
  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码表转换成字体芯片地址(只适用半格数字和字母)(适用于ASCII数字查表)
  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);                                        //画点
  188.         lcd_typeface(0,0,78);                                        //星 符号
  189. ……………………

  190. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
20170508 小屏12860串口.rar (1.98 MB, 下载次数: 123)
回复

使用道具 举报

ID:216379 发表于 2017-7-2 10:26 | 显示全部楼层
所有资料51hei提供下载:
回复

使用道具 举报

ID:44037 发表于 2017-7-3 11:43 | 显示全部楼层
谢谢分享  正好有个液晶模块   试一下
回复

使用道具 举报

ID:713797 发表于 2020-3-23 08:52 | 显示全部楼层
thank you share data
回复

使用道具 举报

ID:975756 发表于 2022-6-24 22:41 | 显示全部楼层
想问一下,如何让屏幕竖屏显示字体,是有什么指令吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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