|
发表于 2023-6-26 21:51:33
|
显示全部楼层
|
架不住廉价的诱惑,买了些1元的lcd12864。
有大佬分享了2线spi驱动方法,写了个代码验证下,确实可行。
这是原分享图片的截图
cs直接接地,rst接vcc,悬空也行
网上找的驱动改改,成功了
主要就是在写入数据前,多写一个dc位。
代码里有用拼音命名的函数名或者变量名,请见谅。
图像数据在tuxiang_128_64.h文件里,没有上传
/*****************
驱动芯片:uc1601 还是uc1609?
引脚定义 1:cs 2:rst 3:dc 4:rw 5:sck/d0 6:d1 7:d2 8:sda/d3 9-12:d4-d7
13:vcc 14:gnd 15:led (原) 16:led-(原)
焊盘 4:pm1 1:pm0 3:vcc 2:gnd
pm1pm0=00:spi(s8), 启用dc脚,h为数据,l为指令
pm1pm0=01:spi(s9),关闭dc脚,9位传输,第9位为数据指令识别位,1数据,0指令
9位传输时,rst直接接高电平,
*******************************/
#include "stc8h.h" //8h1k08@12mhz
#include "intrins.h"
#include "tuxiang_128_64.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sbit io_clk = p3^4;
sbit io_sda = p3^3;
uchar code *p;
//=====================================
/***********--1ms@stc8h-20mhz---***************/
void delay(uint n)
{
uchar i,j;
while(n--)
{
i = 26;
j = 246;
do
{
while (--j);
}
while (--i);
}
}
/* rs=0写入控制指令,rs=1写入显示数据,9位传输方式,第9位为数据指令识别位 */
void xieru_shuju_zhiling(bit rs,uchar dat )
{
uchar i;
io_clk = 0;
io_sda = rs; //9位传输方式,第9位为数据指令识别位
_nop_();
io_clk = 1;
for (i=0;i<8;i )
{
io_clk = 0;
io_sda = dat & 0x80; //从高位开始输出
_nop_();
io_clk = 1;
dat = dat<<1;
}
}
/***************清屏 *********************/
void lcdclear(void)
{
uchar i,j;
for(i = 0;i<8;i )
{
xieru_shuju_zhiling(0,0xb0 i); //0x0b:写页地址命令,i为页地址,
xieru_shuju_zhiling(0,0x10); //写初始列地址高4位,10中的1表示是高4位
xieru_shuju_zhiling(0,0x04); //写初始列地址低4位
for(j = 0;j<128;j )
{
xieru_shuju_zhiling(1,0); //写显示数据,列地址自动加1
}
}
}
void initlcm(void) //lcd初始化
{
io_clk =1;
xieru_shuju_zhiling(0,0xe2); //软件复位
delay(10);
xieru_shuju_zhiling(0,0xa2); //0xa2:lcd bias=1/9;0xa1:lcd bias=1/7
delay(1);
xieru_shuju_zhiling(0,0x2f);
delay(1);
xieru_shuju_zhiling(0,0x23); /* 0x20-0x27为v5电压内部电阻调整设置,r2,r1,r0=111,对比度粗调,数值越大,对比越强 */
delay(1);
xieru_shuju_zhiling(0,0x81); //对比度细调指令,下一行输入对比度值
xieru_shuju_zhiling(0,0x64); //修改这个值可以改变对比度
delay(1);
xieru_shuju_zhiling(0,0xa0); //列扫描方向:0xa0:从左到右,adc=0(seg1->seg132),0xa1相反
xieru_shuju_zhiling(0,0xc4); //页扫描方向:0xc4:从上到下,shl=1(com64->com1),0xc0相反
xieru_shuju_zhiling(0,0x40); //起始行,7567为:0x40,7565 0x60
xieru_shuju_zhiling(0,0xe0); //写入数据时列地址自动加1,读时不变
xieru_shuju_zhiling(0,0xaf); //开显示
}
/*显示一个汉字或者一幅图像,*/
/* dizhi_ye页地址,dizhi_lie列地址,fudu_ye显示部分所占页数,fudu_lie显示部分所占列数,*p字模数据地址 */
/* 12864从上到下共8页,地址为0-7,每页有128列,传送数据时列地址自动加1,但页地址不会 */
void lcd_xianshi(uchar dizhi_ye,uchar dizhi_lie,
uchar fudu_ye,uchar fudu_lie,uchar code *p)
{
uchar i,j;
for(j=0;j
{
xieru_shuju_zhiling(0,0xb0 dizhi_ye j); //传送页地址
xieru_shuju_zhiling(0,0x10 (dizhi_lie>>4)); //列地址先传高4位
xieru_shuju_zhiling(0,dizhi_lie&0x0f); //再传低4位
for (i=0;i
{
xieru_shuju_zhiling(1,*p ); //*p =*(p );
}
}
}
//-------------------------------------
void duankou_chushihua(void)
{
p1m0 = 0x00; p1m1 = 0x00;
p3m0 = 0x00; p3m1 = 0x00;
p5m0 = 0x00; p5m1 = 0x00;
}
//========================================
void main()
{
delay(100);
duankou_chushihua();
initlcm();
while(1)
{
lcdclear();
p = tuxiang_12864_1;
lcd_xianshi(0,0,8,128, p);
delay(1000);
}
}
|
打赏
-
|