发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[STM32F1]

使用STM32F103驱动ST7567液晶屏

[复制链接]
13394|225
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yangjiaxu 于 2021-5-20 11:26 编辑
#申请原创#           
      前言:第一次使用社区的背景,感觉还不错,此处要@21小跑堂 还是跑堂兄教我的呢,跑堂兄太棒了,超级奈斯。5.20快乐哦!!!
      回到正题,ST7567是一种LCD液晶屏的驱动芯片之一,它是单芯片点矩阵式的LCD驱动器,集成了LCD控制器和公共/段驱动器。从MPU发送的显示数据存储在65x132位的内部显示数据RAM(DDRAM)中。DDRAM中存储的显示数据位与LCD面板的像素直接相关。ST7567包含132个段输出,64个公共输出和1个图标公共输出。借助内置的振荡电路和低功耗电源电路,ST7567无需外部时钟或电源即可生成LCD驱动信号,从而可以使显示系统的组件最少,功耗最小。而且它还具有6800,8080和4线SPI等通信方式,其中6800和8080是屏幕专用的一种并口通信方式,但是我们常用的就是8080总线方式和4线SPI通信方式来驱动液晶屏,本次使用的是4线SPI通信方式来驱动ST7567的LCD液晶屏。今天我们就来驱动一款TM9665ACC的LCD液晶屏。


      这个是老王的屏幕,这个屏幕最大的特点就是便宜好用,驱动简单,但是这个屏里有个背景纸,不是太好看,如果动手能力强的话,可以把背景纸去掉,显示效果会更好看。非常通透。
      首先,要知道屏的各个引脚,而且要知道每个引脚是什么功能。屏幕引脚如下图所示。
      首先,这个屏有14个引脚,1,2,3,11和14引脚是GND其次是4,5引脚是VCC,电压是3.3V接下来6,7,8,9,10,都是功能引脚,分别是复位引脚,CS片选引脚,A0数据/命令引脚,数据信号,时钟信号,12和13是背光引脚,A代表正极,K代表负极,知道每个引脚的定义之后,就可以焊接或者做电路板了,由于之前做好了电路,就不用很麻烦的飞线了。电路板的图纸是搬抄群里大佬的,在这里深表感谢
接下来由于知道驱动是ST7567,所以就可以直接写驱动代码了,驱动代码部分展示。
void Lcd_Init(void)
{
    delay_ms(10);
    LCD_RST_LOW();
    delay_us(100);
    LCD_RST_HIGH();
    delay_ms(255);
    delay_ms(255);
    delay_ms(255);

    LCD_WR_REG(0X2F);                //开内部升压,不然要接外部VLCD
    LCD_WR_REG(0X81);                //要求输入对比度
    LCD_WR_REG(0XB0);                //对比度数值,这个要自己试验一下最佳效果。
    LCD_WR_REG(0XEB);                //液晶偏压设置  1/9
    LCD_WR_REG(0XC2);                //设置扫描方式,默认从左到右,上到下。
    LCD_WR_REG(0XAF);                //开显示
}
//清屏函数
void LCD_Clear(void)
{
    u16 i, j;
    i = 192 * 64 / 8; //128X64像素,但是RAM是192列的,我也没有找到如何设置列结束位置。数据大小要除以8位数据
    for(; i > 0; i--)
    LCD_WR_DATA8(0x00); //DAT =0X00,清全白,OXFF,清全黑
}
//-------LCD设置坐标---------------------------------------
void LCD_SetPos(u8 page, u8 column)
{
    column = column - 1; //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
    page = page - 1;
    LCD_WR_REG(0xb0 + page);/*设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。我们平常所说的第 1 页,在 LCD
                                                                                                        驱动 IC 里是第 0 页,所以在这里减去 1*/
                LCD_WR_REG(column & 0x0f); //设置列地址的低 4 位
          column >>= 4;
    column        =        column | 0x10;
    LCD_WR_REG(column);                                                                //取高4位行地址
}
//显示 16x16 点阵图像、汉字、生僻字或 16x16 
void display_graphic_16x16(u8 page, u8 column, unsigned char *dp)
{
    u8 i, j;
    LCD_SetPos(page, column);                //发送地址,第一页
    for (i = 0; i < 16; i++)                                //第一页的数据16字节,列号自动累加
    {
        LCD_WR_DATA8( *dp); //写数据到LCD,如果要反色显示,就在*P前用~取反。
        dp++;
    }
    LCD_SetPos(page + 1, column);                //发送地址,第二页

    for (i = 0; i < 16; i++)                                //第二页的数据16字节
    {
        LCD_WR_DATA8( *dp); //写数据到LCD,如果要反色显示,就在*P前用~取反。
        dp++;
    }
}
汉字取模部分代码
unsigned char huan[] =
{
    0x04, 0x24, 0x44, 0x84, 0x64, 0x9C, 0x40, 0x30, 0x0F, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00, 0x00,
    0x10, 0x08, 0x06, 0x01, 0x82, 0x4C, 0x20, 0x18, 0x06, 0x01, 0x06, 0x18, 0x20, 0x40, 0x80, 0x00
};/*"欢",0*/
unsigned char ying[] =
{
    0x40, 0x40, 0x42, 0xCC, 0x00, 0x00, 0xFC, 0x04, 0x02, 0x00, 0xFC, 0x04, 0x04, 0xFC, 0x00, 0x00,
    0x00, 0x40, 0x20, 0x1F, 0x20, 0x40, 0x4F, 0x44, 0x42, 0x40, 0x7F, 0x42, 0x44, 0x43, 0x40, 0x00
};/*"迎",1*/
unsigned char shi[] =
{
    0x80, 0x60, 0xF8, 0x07, 0x04, 0xE4, 0x24, 0x24, 0x24, 0xFF, 0x24, 0x24, 0x24, 0xE4, 0x04, 0x00,
    0x00, 0x00, 0xFF, 0x00, 0x80, 0x81, 0x45, 0x29, 0x11, 0x2F, 0x41, 0x41, 0x81, 0x81, 0x80, 0x00
};/*"使",0*/
unsigned char yong[] =
{
    0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0xFE, 0x22, 0x22, 0x22, 0x22, 0xFE, 0x00, 0x00, 0x00,
    0x80, 0x60, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x7F, 0x02, 0x02, 0x42, 0x82, 0x7F, 0x00, 0x00, 0x00
};/*"用",1*/
主函数部分代码
int main(void)
{
        u8 t;
        u8 *temp;
        u16 SET_VOLTAGE = 123;
                SystemInit ();
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
            delay_init();                        //延时初始化
            LCD_IO_init();                        //显示屏IO初始化
                   Lcd_Init();                        //显示屏寄存器初始化
                   LCD_Clear();                        //显示屏清屏操作
                uart_init(9600);                 //波特率使用115200
            printf("欢迎使用\r\n");

    while(1)
    {
                display_graphic_16x16(3, 16, 0, huan);
                display_graphic_16x16(3, 32, 0, ying);
                display_graphic_16x16(3, 48, 0, shi);
                display_graphic_16x16(3, 64, 0, yong);
}
}





      “欢迎使用”是最终的显示效果,感觉显示的效果还是不错的,而且比较清晰好看。不过显示过程中也有很多麻烦,比如显示位置不对,最后发现是设置坐标函数有问题导致的,重新计算和修改之后就没有这种问题发生了。最后把驱动程序部分分享出来,方便大家使用。

游客,如果您要查看本帖隐藏内容请回复









使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2021-05-20
理由:恭喜通过原创文章审核!请多多加油哦!

沙发
laocuo1142| | 2021-5-20 09:33 | 只看该作者
过来借鉴一下

使用特权

评论回复
板凳
gyh974| | 2021-5-20 14:58 | 只看该作者
打赏帖还是想看看内容

使用特权

评论回复
地板
yangjiaxu|  楼主 | 2021-5-20 22:05 | 只看该作者
gyh974 发表于 2021-5-20 14:58
打赏帖还是想看看内容

没什么问题,程序都是可用的

使用特权

评论回复
5
xrtsky123| | 2021-5-23 07:23 | 只看该作者
很不错哦

使用特权

评论回复
6
54zzw2018| | 2021-5-23 08:16 | 只看该作者
学习一下

使用特权

评论回复
7
诸葛少羽| | 2021-5-24 11:09 | 只看该作者
很好,借鉴下

使用特权

评论回复
8
mbutterfly| | 2021-5-25 10:54 | 只看该作者

学习一下

使用特权

评论回复
9
WENHX| | 2021-5-25 11:06 | 只看该作者
ST7567液晶屏

使用特权

评论回复
10
雨潇潇、、、| | 2021-7-30 15:34 | 只看该作者
看看

使用特权

评论回复
11
arima| | 2021-10-24 22:49 | 只看该作者
使用STM32F103驱动ST7567液晶屏

使用特权

评论回复
12
lisingch| | 2021-10-24 23:35 | 只看该作者
谢谢分享

使用特权

评论回复
13
290399937| | 2021-11-5 20:44 | 只看该作者
Thanks♪(・ω・)ノ

使用特权

评论回复
14
zhiguoxin| | 2021-11-20 11:08 | 只看该作者
6666666

使用特权

评论回复
15
cqk49| | 2022-3-13 00:00 | 只看该作者
学习一下

使用特权

评论回复
16
onlycook| | 2022-3-14 16:00 | 只看该作者
66666。。。。学习一下

使用特权

评论回复
17
caoenq| | 2022-3-15 08:39 | 只看该作者
非常不错

使用特权

评论回复
18
d1ng2x| | 2022-3-17 14:03 | 只看该作者
厉害了楼主

使用特权

评论回复
19
alvpeg| | 2022-4-1 12:38 | 只看该作者
液晶屏能显示动画吗

使用特权

评论回复
20
qq609211457| | 2022-4-16 16:37 | 只看该作者
我看看

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

618

主题

2562

帖子

5

粉丝