|
架不住廉价的诱惑,买了些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<fudu_ye;j++) //一个16*16的汉字占2页
{
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<fudu_lie;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);
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|