打印
[STM32F1]

STM32F103驱动ST7567液晶屏

[复制链接]
914|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ST7567是一种LCD液晶屏的驱动芯片之一,它是单芯片点矩阵式的LCD驱动器,集成了LCD控制器和公共/段驱动器。从MPU发送的显示数据存储在65x132位的内部显示数据RAM(DDRAM)中。
驱动代码部分如下:


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++;
    }
}



使用特权

评论回复
沙发
小小蚂蚁举千斤|  楼主 | 2024-1-28 22:40 | 只看该作者
汉字取模部分代码

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);
}
}





使用特权

评论回复
板凳
sjzcxj| | 2024-7-9 15:46 | 只看该作者
老帖子翻出来了,学习一下

使用特权

评论回复
地板
chenjun89| | 2024-7-9 19:35 | 只看该作者
这颗LCD驱动芯片也是很经典的一款了。

使用特权

评论回复
5
初级工程渣| | 2024-7-26 13:38 | 只看该作者
代码假设使用的是 I2C 接口(常见的接口之一),如果使用 SPI 或其他接口,具体实现会有所不同

使用特权

评论回复
6
初级工程渣| | 2024-7-26 13:38 | 只看该作者
#include <stdint.h>
#include <stdbool.h>

// I2C 地址定义,依据你的硬件设置
#define ST7567_I2C_ADDRESS 0x3C

// I2C 操作函数的声明(需要根据你的硬件平台实现)
void I2C_WriteByte(uint8_t address, uint8_t data);
void I2C_WriteData(uint8_t address, uint8_t* data, uint16_t length);
void I2C_WriteCommand(uint8_t address, uint8_t cmd);

// ST7567 命令定义
#define ST7567_CMD_DISPLAY_OFF      0xAE
#define ST7567_CMD_DISPLAY_ON       0xAF
#define ST7567_CMD_SET_PAGE_ADDR    0xB0
#define ST7567_CMD_SET_COLUMN_ADDR  0x00
#define ST7567_CMD_SET_START_LINE   0x40
#define ST7567_CMD_SET_COM_SCAN_DIR 0xC0
#define ST7567_CMD_SET_CONTRAST     0x81

// 初始化 ST7567
void ST7567_Init(void) {
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_DISPLAY_OFF);
   
    // 设置起始行
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_START_LINE);
   
    // 设置列地址
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_COLUMN_ADDR);
   
    // 设置页面地址
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_PAGE_ADDR);
   
    // 设置对比度
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_CONTRAST);
    I2C_WriteCommand(ST7567_I2C_ADDRESS, 0x7F); // 设定对比度值
   
    // 反向扫描
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_COM_SCAN_DIR);
   
    // 开启显示
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_DISPLAY_ON);
}

// 写数据到 ST7567 DDRAM
void ST7567_WriteData(uint8_t* data, uint16_t length) {
    I2C_WriteData(ST7567_I2C_ADDRESS, data, length);
}

// 清除显示内容
void ST7567_Clear(void) {
    uint8_t clearBuffer[65*132 / 8] = {0}; // 65x132 点阵,单位为字节
    ST7567_WriteData(clearBuffer, sizeof(clearBuffer));
}

// 设置光标位置
void ST7567_SetCursor(uint8_t page, uint8_t column) {
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_PAGE_ADDR | (page & 0x07));
    I2C_WriteCommand(ST7567_I2C_ADDRESS, ST7567_CMD_SET_COLUMN_ADDR | (column & 0x3F));
}

使用特权

评论回复
7
初级工程渣| | 2024-7-26 13:38 | 只看该作者
解释说明
初始化:ST7567_Init() 函数初始化 ST7567 显示器,包括关闭显示、设置显示参数和开启显示。

写数据:ST7567_WriteData() 函数将数据写入显示数据 RAM(DDRAM),用于更新显示内容。

清除显示:ST7567_Clear() 函数通过写入全零的数据清除显示内容。

设置光标位置:ST7567_SetCursor() 函数设置当前显示光标的位置,以便于后续的数据写入。

使用特权

评论回复
8
初级工程渣| | 2024-7-26 13:38 | 只看该作者
注意事项
I2C 操作函数:I2C_WriteByte()、I2C_WriteData() 和 I2C_WriteCommand() 是与硬件平台相关的函数,需要根据实际硬件平台实现。

显示参数:实际使用中可能需要调整命令和参数值,具体取决于 ST7567 驱动芯片的 datasheet 和显示器的规格。

LCD 屏幕尺寸:上面的代码假设 LCD 是 65x132 点阵。如果实际显示器的分辨率不同,需要相应调整代码中的相关设置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2037

帖子

1

粉丝