数码之家

 找回密码
 立即注册
搜索
查看: 3865|回复: 83

[C51] 2线驱动LCD12864液晶屏

[复制链接]
发表于 2023-6-26 21:51:33 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
架不住廉价的诱惑,买了些1元的LCD12864。
有大佬分享了2线SPI驱动方法,写了个代码验证下,确实可行。
这是原分享图片的截图
1.jpg
2.jpg
CS直接接地,RST接VCC,悬空也行
4.JPG
网上找的驱动改改,成功了
3.JPG
主要就是在写入数据前,多写一个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);
    }
   

}


打赏

参与人数 3家元 +239 收起 理由
springvirus + 30 以資鼓勵
亚历山大 + 9
家睦 + 200

查看全部打赏

发表于 2023-6-26 22:41:56 | 显示全部楼层
刷新率能做到多高?
回复 支持 反对

使用道具 举报

发表于 2023-6-26 22:57:23 | 显示全部楼层
这个玩玩可以。
回复 支持 反对

使用道具 举报

发表于 2023-6-27 01:47:13 | 显示全部楼层
请教LZ,1元的车还有吗
回复 支持 反对

使用道具 举报

发表于 2023-6-27 06:41:28 | 显示全部楼层
cs接地只能软件模拟spi时可以,硬件spi cs接地不显示~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-27 06:41:56 | 显示全部楼层
mimidog 发表于 2023-6-27 01:47
请教LZ,1元的车还有吗

还有呢,淘宝搜  “老王电子数码DIY”。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-27 06:48:58 | 显示全部楼层
crazy0qwer 发表于 2023-6-26 22:41
刷新率能做到多高?

没测试。
同频率下,肯定比IIC快,又比通用SPI慢一点点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-27 07:07:55 | 显示全部楼层
qrut 发表于 2023-6-27 06:41
cs接地只能软件模拟spi时可以,硬件spi cs接地不显示~

是的,2线只能软件模拟了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-27 09:01:31 | 显示全部楼层
crazy0qwer 发表于 2023-6-26 22:41
刷新率能做到多高?

修改测试了一下
void main()
{
        delay(100);
       
        DuanKou_ChuShiHua();
        initlcm();
        lcdclear();
        IO_LED =1;       
        while(1)
        {               
                p = TuXiang_12864_1;
                LCD_xianshi(0,0,8,128, p);
                //delay(1000);
                IO_LED =!IO_LED;
        }
}

单片机:STC8G1K08
时钟频率:35MHz
IO_LED端口脉冲频率:120Hz
屏幕刷新率应该是240Hz了,显示稳定。
只会玩点51单片机,更高频率无法测试。
回复 支持 反对

使用道具 举报

发表于 2023-6-27 09:44:42 | 显示全部楼层
反正俺看不懂
回复 支持 反对

使用道具 举报

发表于 2023-6-27 10:11:22 | 显示全部楼层
会编程的都是大神
回复 支持 反对

使用道具 举报

发表于 2023-6-27 10:38:28 | 显示全部楼层
我也没看懂
回复 支持 反对

使用道具 举报

发表于 2023-6-27 10:54:40 | 显示全部楼层
节约IO口是主要的,快速画图还得是并口
回复 支持 反对

使用道具 举报

发表于 2023-6-27 14:51:17 | 显示全部楼层
这个屏幕驱动是UC1609,2线驱动就是3线SPI去掉一个RST或者9bitSPI去掉一个RST,试验过ESP8266和STM32F103的硬件SPI貌似都不支持,只能软SPI。软SPI的速度和硬件SPI没法比。当然优点就是省IO口,在对速度要求不高的情况下很合适。
这块屏幕的速度还不错,20FPS时拖影比较少,最快勉强到25FPS
回复 支持 反对

使用道具 举报

发表于 2023-6-27 17:02:57 | 显示全部楼层
好多拼音,哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-27 21:00:50 | 显示全部楼层
lemontreenm 发表于 2023-6-27 14:51
这个屏幕驱动是UC1609,2线驱动就是3线SPI去掉一个RST或者9bitSPI去掉一个RST,试验过ESP8266和STM32F103的 ...

大师很专业,钦佩!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-27 21:03:26 | 显示全部楼层

见笑了,英语不会,又想玩单片机

打赏

参与人数 1家元 +30 收起 理由
springvirus + 30 加油!!!

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2023-6-27 21:57:39 来自手机浏览器 | 显示全部楼层
拼音编程直观,算是起步了。
回复 支持 反对

使用道具 举报

发表于 2023-6-28 09:38:25 | 显示全部楼层
外挂设备引脚少了,MCU多出来的引脚就可以干其他事了
回复 支持 反对

使用道具 举报

发表于 2023-6-28 17:59:43 来自手机浏览器 | 显示全部楼层
本帖最后由 wwb2002 于 2023-6-30 15:05 编辑
lemontreenm 发表于 2023-6-27 14:51
这个屏幕驱动是UC1609,2线驱动就是3线SPI去掉一个RST或者9bitSPI去掉一个RST,试验过ESP8266和STM32F103的 ...


uc1609不是19264吗?楼主的屏是12864啊。我也买了几块,stm32f303驱动,u8g2库,两线三线的区别是两线没有DC ,而且这个DC 并不属于spi外设的信号,而是单独一个f303的gpio,f303的spi好像没有DC 线这个配置,网上也有介绍spi有的是有DC 线的,有DC 就是s8模式,没DC 就用s9。f303是可以硬件spi驱动的
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 17:29 , Processed in 0.124800 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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