感谢别人的分享,提供给需要的人方便。
引脚图:
还提供这些资料:
W25X16中文手册.pdf
W25X40BL—字库芯片资料.pdf
st7565中文参考资料.pdf
51单片机st7565源程序如下:
- /*STC89C52 3.3v小屏12864 串口 测试STC12C5A60S2能用,延时时间有差别
- 字符0-9=203-212,A-Z=220-245,a-z=252-277
- GB汉字编码和字符地址公式:芯片地址*32=GB高8位*256+GB低8位-43807-((GB高8位-0xb0)*162)
- 全格数字字母地址公式:芯片地址*32=GB高8位*256+GB低8位-41701
- 半格数字字母地址公式:芯片地址*32=ISCII码+155
- 注:字符芯片参考的是W25X16中文手册,芯片用的是3.3v电压,与5v电压的C52连接的I/O口都串接了1.3K的电阻*/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit Z_DO=P3^1; //字符芯片串行数据输出端 (MOSI)
- sbit Z_CS=P3^2; //字符芯片串行片选端
- sbit L_CS=P3^3; //LCD片选端
- sbit L_RST=P3^4; //LCD复位端
- sbit L_A0=P3^5; //LCD数据/命令(H/L)选择端
- sbit CLK=P3^6; //LCD和字符芯片串行时钟端 (共用)
- sbit SI=P3^7; //LCD和字符芯片共用串行数据端 (MISO) (共用)
- code uchar t123[]="0123456789ABCDEF";
- void delay(uint XMS) //延时
- {
- uint i;
- for(;XMS>0;XMS--)
- for(i=123;i>0;i--);
- }
- void write_byte(uchar dat) //LCD和字符芯片串口写入1个字节(8位)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- if(dat&0x80) SI=1;
- else SI=0;
- dat<<=1;
- CLK=0;
- CLK=1;
- }
- }
- void lcd_write_cmd(uchar cmd) //LCD写入命令
- {
- L_A0=0; //命令
- L_CS=0; //片选
- write_byte(cmd);
- L_CS=1;
- }
- void lcd_write_dat(uchar dat) //LCD写入数据
- {
- L_A0=1; //数据
- L_CS=0; //片选
- write_byte(dat);
- L_CS=1;
- }
- void clr_lcd() //LCD清屏
- {
- uchar i,j;
- for(i=0;i<8;i++)
- {
- lcd_write_cmd(0xb0+i);
- lcd_write_cmd(0x10+0);
- lcd_write_cmd(0x00+0);
- for(j=132;j>0;j--)
- lcd_write_dat(0x00);
- }
- }
- void lcd_init() //LCD初始化
- {
- L_RST=0;
- L_RST=1;
- lcd_write_cmd(0xaf); //0xaf开显示;0xae关显示
- lcd_write_cmd(0x40); //起始行显示地址(0-63)(设置哪一行显示为首行)
-
- lcd_write_cmd(0xa1); //开ADC=0xa1,显示从下往上0-127;关ADC=0xa0,显示由上往下3-131
- lcd_write_cmd(0xa6); //0xa6关反白,0xa7开反白
-
- lcd_write_cmd(0xa4); //0xa4正常显示,0xa5显示所有点
-
- lcd_write_cmd(0xa2); //LCD的偏压比 1/9BIAS
-
- lcd_write_cmd(0xc8); //0xc8正常输出方向(上为首行);0x80反向输出(下为首行)
-
- lcd_write_cmd(0x2f); //内部电源选择(0x28-0x2f,应设0x2f)
-
- lcd_write_cmd(0x24); //LCD驱动电压的电阻比(0x20-0x27,5v可设0x24)
-
- lcd_write_cmd(0x81); //进入设置对比度输出电压V0
-
- lcd_write_cmd(0x24); //为对比度的第二条指令,对比度电压的等级(0x00-0x3f)
-
- clr_lcd();
- }
- /*void z_write_byte(uchar dat) //字符芯片写入1个字节
- {
- Z_CS=0; //片选
- write_byte(dat);
- Z_CS=1;
- }*/
- uchar z_read_byte() //字符芯片读出1个字节
- {
- uchar val=0,i;
- Z_DO=1;
- for(i=8;i>0;i--)
- {
- val<<=1;
- CLK=0;
- CLK=1;
- if(Z_DO) val++;
- }
- return val;
- }
- /*uchar z_read_add(uchar h,uchar z,uchar l) //读字符芯片相应地址的单个数据
- {
- uchar val;
- Z_CS=0; //片选
- write_byte(0x03);
- write_byte(h);
- write_byte(z);
- write_byte(l);
- val=z_read_byte();
- Z_CS=1;
- return val;
- }*/
- void z_init() //字符芯片初始化
- {
- Z_CS=1;
- }
- void init() //程序初始化
- {
- delay(100);
- lcd_init();
- z_init();
- delay(100);
- }
- void lcd_out_spot(uchar y,uchar x,uchar dat) //X轴(左0-127右),Y轴(上0-7下),8位数(8个点,左低-右高)
- {
- y&=0x07; x&=127; //数值限制
- lcd_write_cmd(0xb0+y); //页地址(0-7)
- lcd_write_cmd(0x10|(x>>4)); //列地址高4位(0-131)
- lcd_write_cmd(0x00+(x&0x0f)); //列地址低4位(0-131)
- lcd_write_dat(dat);
- }
- void lcd_typeface(uchar y,uchar x,uint zt) //在xy坐标地址显示字符
- {
- uchar temp[32];
- uchar i;
- Z_CS=0; //片选
- write_byte(0x03);
- write_byte((zt>>11)&0xff);
- write_byte((zt>>3)&0xff);
- write_byte((zt<<5)&0xff);
- for(i=0;i<32;i++)
- temp[i]=z_read_byte();
- Z_CS=1;
- y%=7; //因一个字占两个页(行,16点),所以限制只能到6
- x%=113; //因一个字占16(列点),所以限制只能到112
- lcd_write_cmd(0xb0+y); //页地址(0-7)
- lcd_write_cmd(0x10|(x>>4)); //列地址高4位(0-131)
- lcd_write_cmd(0x00+(x&0x0f)); //列地址低4位(0-131)
- for(i=0;i<16;i++)
- lcd_write_dat(temp[i]);
- lcd_write_cmd(0xb0+y+1); //页地址(0-7)
- lcd_write_cmd(0x10|(x>>4)); //列地址高4位(0-131)
- lcd_write_cmd(0x00+(x&0x0f)); //列地址低4位(0-131)
- for(i=0;i<16;i++)
- lcd_write_dat(temp[i+16]);
- }
- uint GB_ZT(uchar *p) //汉字GB码转换成字体芯片对应汉字地址(只适用中文)
- {
- uchar m,n;
- uint val=0;
- m=*p;
- p++;
- n=*p;
- val=m<<8|n;
- val=val-43807-((m-0xb0)*162);
- return val;
- }
- uint GB_ZF_WORD(uchar *p) //GB码表转换成字体芯片地址(只适用全格数字和字母)
- {
- uchar m,n;
- uint val=0;
- m=*p;
- p++;
- n=*p;
- val=m<<8|n;
- val=val-41701;
- return val;
- }
- uint GB_ZF_BYTE(uchar *p) //GB码表转换成字体芯片地址(只适用半格数字和字母)(适用于ASCII数字查表)
- {
- uint val;
- val=*p+155;
- return val;
- }
- void out_lcd() //输出到LCD
- {
- uint i;
- lcd_out_spot(0,0,0x00); //画点
- lcd_typeface(0,0,78); //星 符号
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
20170508 小屏12860串口.rar
(1.98 MB, 下载次数: 133)
|