ST7565显示屏驱动,本地缓存/任意位置显示+滚动显示+字符串显示

ST7565显示屏驱动,本地缓存/任意位置显示+滚动显示+字符串显示中英混输

GB2312编码

基本展示:

在这里插入图片描述

//显示字符串
lcd_string(0,47,"Shape of 天.",LCD_POLARITY_POS,lcd_test_cache);
//滚动显示
static lcd_roll_t roll;
if(initFlag == 0){
    roll.lcd_cache = lcd_test_cache;
    roll.roll_index = 0;
    roll.spead = 1000;
    roll.step = 1;
    roll.type = LCD_WORD_TYPE_ASCII16;
    roll.x = 1;
    roll.y = 16;
    roll.x_size = 126;
    lcd_roll_display(&roll, "abcdefghizklmnopqrstu天地玄黄宇宙洪荒");
    initFlag = 1;
}
lcd_roll_run(&roll);
//画边框
lcd_draw_square(0,0,1,64,LCD_POLARITY_POS,lcd_test_cache);
lcd_draw_square(0,63,128,1,LCD_POLARITY_POS,lcd_test_cache);
lcd_draw_square(0,0,128,1,LCD_POLARITY_POS,lcd_test_cache);
lcd_draw_square(127,0,1,63,LCD_POLARITY_POS,lcd_test_cache);

字库软件

在这里插入图片描述
PCtoLCD2002.exe

头文件

/**********************************
 * @file st7565_driver.h
 * @author yujinjiang
 * @date 2024.01.19
 * *******************************/
//注意:使用PCtoLCD软件生成字库的时候,使用逐列式

#ifndef __ST_7565_DRIVER_H_
#define __ST_7565_DRIVER_H_

#define LCD_W               128         
#define LCD_OFFSET          1           
#define LCD_PAGE            8           
#define LCD_CMD_DISPLAY_ON  0xAF
#define LCD_CMD_START_LINE  0xC0
#define LCD_CMD_ADC_NORMAL  0xA0
#define LCD_CMD_COM_NORMAL  0xC8
#define LCD_CMD_POWER_CTRL  0x2F
#define LCD_CMD_VOP_MODE    0x81
#define LCD_CMD_VOP_VALUE   30
#define LCD_CMD_DISP_OFF    0xAE
#define LCD_CMD_RESET       0xE2
#define LCD_CMD_COM0        0X60        //设置起始行,40-7F(31shi 60)
#define LCD_CMD_MX          0XA0        //设置SEG方向,正常(S0-S131)是0xa0;反向(S131-S0)是OXA1
#define LCD_CMD_MY          0XC8        //设置COM方向,C0=C0-C63,C8=C63-C0(c8)
#define LCD_CMD_INV         0XA6        //正常显示设为OXA6,反显设为0XA7
#define LCD_CMD_BS          0XA2        //设置偏压,1/65占空比时,1/9时,设为OXA2;1/7时,设为OXA3
#define LCD_CMD_RA          0X25        //设置RA/RB,0X20-0X27
#define LCD_CMD_BL          0X00        //SET BOOSTER LEVEL 4X时设为0,5X时设为1,一般设为0lcd_draw

#include <stdint.h>

#define ROLL_DISPLAY_MAX_SIZE   (32)//最多显示汉字数,ASCII * 2

typedef enum {
    LCD_POLA_POS,
    LCD_POLA_NEG
}lcd_display_polarity_enum_t;

typedef struct {
    char *word;
    uint8_t data[32];
}lcd_chinese_16_t;

typedef struct {
    char *word;
    uint8_t data[16];
}lcd_ascii_16_t;

typedef struct  {
    uint8_t buffer[LCD_PAGE][LCD_W];
    uint8_t x_index;
    uint8_t y_index;
}lcd_cache_t;

typedef struct {
    uint8_t x;//位置横坐标
    uint8_t y;//位置纵坐标
    uint8_t x_size;//显示区域长度
    int spead;//速度0-1000
    uint8_t step;//每次步进像素点数
    lcd_cache_t *lcd_cache;//对应的缓存区
    uint8_t first_index_wait_count;//非设置参数,内部变量
    uint8_t data_length;//非设置参数,内部变量
    uint8_t data[32 * ROLL_DISPLAY_MAX_SIZE];///非设置参数,内部变量
    int roll_index;//非设置参数,内部变量
    int counter;//非设置参数,内部变量
}lcd_roll_t;


/***************************************************
 * @name lcd_cache_init
 * @brief 初始化缓存中所有像素点
 * @param pola 像素点极性
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_cache_init(lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_cache_update
 * @brief 将缓存中所有数据更新到LCD
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_cache_update(lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_Init
 * @brief 初始化LCD
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_Init(lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_clear_all
 * @brief 清空/同时清空缓存
 * @param pola 像素点极性
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_clear_all(lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_string
 * @brief 显示字符串到LCD
 * @param type 显示字符串类型
 * @param x 显示字符串左上角坐标(0~127)
 * @param y 显示字符串左上角坐标(0~63)
 * @param string 要显示的字符串 比如:"hello world"/"你好",汉字的话,要添加汉字到st7565_data中才能显示。
 * @param pola 像素点极性
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_string(uint8_t x,uint8_t y,char *string,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_draw_num
 * @brief 显示数字到lcd
 * @param type 显示字符串类型
 * @param x 显示字符串左上角坐标(0~127)
 * @param y 显示字符串左上角坐标(0~63)
 * @param number 要显示的数字
 * @param pola 像素点极性
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_draw_num(uint8_t x,uint8_t y,int number,uint8_t size,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_draw_square
 * @brief 画正方形
 * @param x 显示方形左上角左边
 * @param y 显示方形左上角坐标
 * @param x_size x方向长度(0~127)
 * @param y_size y方向长度(0~63)
 * @param pola 像素点极性
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_draw_square(uint8_t x,uint8_t y,uint8_t x_size,uint8_t y_size,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_draw_point
 * @brief 画点
 * @param x 显示方形左上角左边
 * @param y 显示方形左上角坐标
 * @param x_size x方向长度(0~127)
 * @param y_size y方向长度(0~63)
 * @param pola 像素点极性
 * @param lcd_cache LCD缓存
 * @return null
 ***************************************************/
void lcd_draw_point(uint8_t x,uint8_t y,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_roll_display
 * @brief 设置滚动显示内容
 * @param roll_stru 配置滚动显示
 * @param string 要显示的字符串
 * @return null
 ***************************************************/
void lcd_roll_display(lcd_roll_t *roll_stru,char *string);
/***************************************************
 * @name lcd_roll_run
 * @brief 刷新滚动显示 (10~100ms循环调用,一直刷)
 * @return null
 ***************************************************/
void lcd_roll_run(lcd_roll_t *roll_stru);

/***************************************************
 * @name lcd_x_get
 * @brief 获取最后lcd显示坐标
 * @param lcd_cacsh LCD缓存
 * @return x坐标值
 ***************************************************/
uint8_t lcd_x_get(lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_y_get
 * @brief 获取最后lcd显示坐标
 * @param lcd_cacsh LCD缓存
 * @return y坐标值
 ***************************************************/
uint8_t lcd_y_get(lcd_cache_t *lcd_cache);

/***************************************************
 * @name lcd_data_get
 * @brief 获取最后lcd显示数据
 * @param lcd_cacsh LCD缓存
 * @return 选定区域数据
 ***************************************************/
uint8_t lcd_data_get(uint8_t row,uint8_t x,lcd_cache_t *lcd_cache);

#endif

数据文件

/**********************************
 * @file st7565_data.h
 * @author yujinjiang
 * @date 2024.01.19get_bit_1_value
 * *******************************/

#ifndef __ST_7565_DATA_H_
#define __ST_7565_DATA_H_

#include "st7565_driver.h"

//取模方式:逐列式

const lcd_chinese_16_t lcd_ch_16x16[] = {
     {
          .word = "天",
          .data = {0x00,0x00,0x80,0x40,0x84,0x40,0x84,0x20,0x84,0x10,0x84,0x08,0x84,0x06,0xFC,0x01,0x84,0x06,0x84,0x08,0x84,0x10,0x84,0x20,0x84,0x40,0x80,0x40,0x00,0x00,0x00,0x00},/*"天"*/
     },
     {
          .word = "地",
          .data = {0x00,0x00,0x20,0x10,0x20,0x10,0xFE,0x0F,0x20,0x08,0x40,0x00,0xF8,0x3F,0x40,0x40,0x20,0x40,0xFE,0x4F,0x20,0x40,0x10,0x44,0xF8,0x47,0x00,0x70,0x00,0x00,0x00,0x00},/*"地"*/
     },
     {
          .word = "玄",
          .data = {0x00,0x00,0x08,0x00,0x08,0x21,0x88,0x21,0x48,0x31,0x28,0x29,0x1A,0x25,0x0C,0x23,0x08,0x21,0x88,0x20,0x48,0x28,0x08,0x30,0x08,0x60,0x08,0x00,0x00,0x00,0x00,0x00},/*"玄"*/
     },
     {
          .word = "黄",
          .data = {0x00,0x00,0x20,0x00,0x28,0x40,0xA8,0x2F,0xA8,0x1A,0xBE,0x0A,0xA8,0x0A,0xE8,0x0F,0xA8,0x0A,0xBE,0x0A,0xA8,0x1A,0xA8,0x2F,0x28,0x40,0x20,0x00,0x00,0x00,0x00,0x00},/*"黄"*/
     },
     {
          .word = "宇",
          .data = {0x00,0x00,0x18,0x04,0x08,0x04,0x48,0x04,0x48,0x04,0x48,0x44,0x4A,0x44,0xCC,0x7F,0x48,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0x08,0x04,0x18,0x04,0x00,0x00,0x00,0x00},/*"宇"*/
     },
     {
          .word = "宙",
          .data = {0x00,0x00,0x38,0x00,0x88,0x7F,0x88,0x24,0x88,0x24,0x88,0x24,0x8A,0x24,0xEC,0x3F,0x88,0x24,0x88,0x24,0x88,0x24,0x88,0x24,0x88,0x7F,0x38,0x00,0x00,0x00,0x00,0x00},/*"宙"*/
     },
     {
          .word = "洪",
          .data = {0x00,0x00,0x20,0x30,0x44,0x0C,0x08,0x03,0x00,0x00,0x00,0x42,0x10,0x22,0xFE,0x1B,0x10,0x02,0x10,0x02,0x10,0x02,0xFE,0x0B,0x10,0x12,0x00,0x62,0x00,0x00,0x00,0x00},/*"洪"*/
     },
     {
          .word = "荒",
          .data = {0x00,0x00,0x48,0x00,0x48,0x40,0xC8,0x23,0x5E,0x1A,0x48,0x02,0x68,0x02,0x48,0x7A,0x48,0x02,0x48,0x02,0x5E,0x3A,0x48,0x42,0x48,0x40,0x48,0x60,0x00,0x00,0x00,0x00},/*"荒"*/
     },
     {
          .word = "日",
          .data = {0x00,0x00,0x00,0x00,0xFE,0x7F,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*"日"*/
     },
     {
          .word = "月",
          .data = {0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0xFE,0x0F,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x42,0x22,0x42,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*"月"*/
     },
     {
          .word = "盈",
          .data = {0x00,0x00,0x80,0x40,0x42,0x40,0x22,0x7E,0x1E,0x42,0x82,0x42,0x5A,0x7E,0x2A,0x42,0xDA,0x7E,0x12,0x42,0x9A,0x42,0x96,0x7E,0x70,0x40,0x00,0x40,0x00,0x00,0x00,0x00},/*"盈"*/
     },
     {
          .word = "昃",
          .data = {0x00,0x00,0x00,0x40,0x00,0x30,0x7C,0x4F,0x54,0x41,0x54,0x21,0x54,0x21,0x54,0x11,0x54,0x0D,0x54,0x11,0x54,0x21,0x7C,0x21,0x00,0x41,0x00,0x40,0x00,0x00,0x00,0x00},/*"昃"*/
     },
     {
          .word = "辰",
          .data = {0x00,0x00,0x00,0x40,0xFC,0x3F,0x04,0x01,0x24,0x01,0x24,0x7F,0x24,0x41,0x24,0x21,0x24,0x07,0x24,0x09,0x24,0x11,0x24,0x29,0x04,0x45,0x04,0x41,0x00,0x00,0x00,0x00},/*"辰"*/
     },
     {
          .word = "宿",
          .data = {0x00,0x00,0x98,0x00,0x48,0x00,0xE8,0x7F,0x18,0x00,0x08,0x00,0x2A,0x7F,0x2C,0x49,0xA8,0x49,0x68,0x49,0x28,0x49,0x28,0x49,0x28,0x7F,0x18,0x00,0x00,0x00,0x00,0x00},/*"宿"*/
     },
     {
          .word = "列",
          .data = {0x00,0x00,0x00,0x02,0x04,0x41,0xC4,0x20,0x3C,0x11,0x24,0x0A,0x24,0x06,0xE4,0x01,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x40,0x00,0x40,0xFE,0x7F,0x00,0x00,0x00,0x00},/*"列"*/
     },
     {
          .word = "张",
          .data = {0x00,0x00,0xE4,0x03,0x24,0x42,0x24,0x42,0x3C,0x3E,0x80,0x00,0x80,0x00,0xFE,0x7F,0x80,0x20,0xA0,0x10,0x90,0x03,0x88,0x0C,0x84,0x10,0x80,0x20,0x00,0x00,0x00,0x00},/*"张"*/
     },
};

const lcd_ascii_16_t lcd_ascii_8x16[] = {
     {
          .word = "a",
          .data = {0x00,0x00,0x00,0x19,0x80,0x24,0x80,0x24,0x80,0x12,0x00,0x3F,0x00,0x20,0x00,0x00},/*"a"*/
     },
     {
          .word = "b",
          .data = {0x10,0x00,0xF0,0x3F,0x00,0x11,0x80,0x20,0x80,0x20,0x00,0x11,0x00,0x0E,0x00,0x00},/*"b"*/
     },
     {
          .word = "c",
          .data = {0x00,0x00,0x00,0x0E,0x00,0x11,0x80,0x20,0x80,0x20,0x80,0x20,0x00,0x11,0x00,0x00},/*"c"*/
     },
     {
          .word = "d",
          .data = {0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,0x80,0x20,0x90,0x10,0xF0,0x3F,0x00,0x20},/*"d"*/
     },
     {
          .word = "e",
          .data = {0x00,0x00,0x00,0x1F,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x24,0x00,0x17,0x00,0x00},/*"e"*/
     },
     {
          .word = "f",
          .data = {0x00,0x00,0x80,0x20,0x80,0x20,0xE0,0x3F,0x90,0x20,0x90,0x20,0x20,0x00,0x00,0x00},/*"f"*/
     },
     {
          .word = "g",
          .data = {0x00,0x00,0x00,0x6B,0x80,0x94,0x80,0x94,0x80,0x94,0x80,0x93,0x80,0x60,0x00,0x00},/*"g"*/
     },
     {
          .word = "h",
          .data = {0x10,0x20,0xF0,0x3F,0x00,0x21,0x80,0x00,0x80,0x00,0x80,0x20,0x00,0x3F,0x00,0x20},/*"h"*/
     },
     {
          .word = "i",
          .data = {0x00,0x00,0x80,0x20,0x98,0x20,0x98,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00},/*"i"*/
     },
     {
          .word = "j",
          .data = {0x00,0x00,0x80,0x21,0x80,0x30,0x80,0x2C,0x80,0x22,0x80,0x21,0x80,0x30,0x00,0x00},/*"z"*/
     },
     {
          .word = "k",
          .data = {0x10,0x20,0xF0,0x3F,0x00,0x24,0x00,0x06,0x80,0x29,0x80,0x30,0x80,0x20,0x00,0x00},/*"k"*/
     },
     {
          .word = "l",
          .data = {0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00},/*"l"*/
     },
     {
          .word = "m",
          .data = {0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,0x3F},/*"m"*/
     },
     {
          .word = "n",
          .data = {0x80,0x20,0x80,0x3F,0x00,0x21,0x80,0x00,0x80,0x00,0x80,0x20,0x00,0x3F,0x00,0x20},/*"n"*/
     },
     {
          .word = "o",
          .data = {0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x00,0x1F,0x00,0x00},/*"o"*/
     },
     {
          .word = "p",
          .data = {0x80,0x80,0x80,0xFF,0x00,0x91,0x80,0x20,0x80,0x20,0x00,0x11,0x00,0x0E,0x00,0x00},/*"p"*/
     },
     {
          .word = "q",
          .data = {0x00,0x00,0x00,0x0E,0x00,0x11,0x80,0x20,0x80,0x20,0x00,0x91,0x80,0xFF,0x00,0x80},/*"q"*/
     },
     {
          .word = "r",
          .data = {0x80,0x20,0x80,0x20,0x80,0x3F,0x00,0x21,0x80,0x20,0x80,0x00,0x80,0x01,0x00,0x00},/*"r"*/
     },
     {
          .word = "s",
          .data = {0x00,0x00,0x00,0x33,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x19,0x00,0x00},/*"s"*/
     },
     {
          .word = "t",
          .data = {0x00,0x00,0x80,0x00,0x80,0x00,0xE0,0x1F,0x80,0x20,0x80,0x20,0x00,0x10,0x00,0x00},/*"t"*/
     },
     {
          .word = "u",
          .data = {0x80,0x00,0x80,0x1F,0x00,0x20,0x00,0x20,0x00,0x20,0x80,0x10,0x80,0x3F,0x00,0x20},/*"u"*/
     },
     {
          .word = "v",
          .data = {0x80,0x00,0x80,0x03,0x80,0x0C,0x00,0x30,0x80,0x0C,0x80,0x03,0x80,0x00,0x00,0x00},/*"v"*/
     },
     {
          .word = "w",
          .data = {0x80,0x01,0x80,0x0E,0x00,0x30,0x80,0x0C,0x80,0x07,0x00,0x38,0x80,0x06,0x80,0x01},/*"w"*/
     },
     {
          .word = "x",
          .data = {0x00,0x00,0x80,0x20,0x80,0x31,0x80,0x0E,0x00,0x2E,0x80,0x31,0x80,0x20,0x00,0x00},/*"x"*/
     },
     {
          .word = "y",
          .data = {0x80,0x00,0x80,0x81,0x80,0x86,0x00,0x78,0x00,0x18,0x80,0x06,0x80,0x01,0x80,0x00},/*"y"*/
     },
     {
          .word = "z",
          .data = {0x00,0x00,0x80,0x21,0x80,0x30,0x80,0x2C,0x80,0x22,0x80,0x21,0x80,0x30,0x00,0x00},/*"z"*/
     },
     {
          .word = "A",
          .data = {0x00,0x20,0x00,0x3C,0xC0,0x23,0x38,0x02,0xE0,0x02,0x00,0x27,0x00,0x38,0x00,0x20},/*"A"*/
     },
     {
          .word = "B",
          .data = {0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x20,0x88,0x20,0x70,0x11,0x00,0x0E,0x00,0x00},/*"B"*/
     },
     {
          .word = "C",
          .data = {0xC0,0x07,0x30,0x18,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x38,0x08,0x00,0x00},/*"C"*/
     },
     {
          .word = "D",
          .data = {0x08,0x20,0xF8,0x3F,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00},/*"D"*/
     },
     {
          .word = "E",
          .data = {0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x20,0xE8,0x23,0x08,0x20,0x10,0x18,0x00,0x00},/*"E"*/
     },
     {
          .word = "F",
          .data = {0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x00,0xE8,0x03,0x08,0x00,0x10,0x00,0x00,0x00},/*"F"*/
     },
     {
          .word = "G",
          .data = {0xC0,0x07,0x30,0x18,0x08,0x20,0x08,0x20,0x08,0x22,0x38,0x1E,0x00,0x02,0x00,0x00},/*"G"*/
     },
     {
          .word = "H",
          .data = {0x08,0x20,0xF8,0x3F,0x08,0x21,0x00,0x01,0x00,0x01,0x08,0x21,0xF8,0x3F,0x08,0x20},/*"H"*/
     },
     {
          .word = "I",
          .data = {0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00},/*"I"*/
     },
     {
          .word = "Z",
          .data = {0x10,0x20,0x08,0x38,0x08,0x26,0x08,0x21,0xC8,0x20,0x38,0x20,0x08,0x18,0x00,0x00},/*"Z"*/
     },
     {
          .word = "K",
          .data = {0x08,0x20,0xF8,0x3F,0x88,0x20,0xC0,0x01,0x28,0x26,0x18,0x38,0x08,0x20,0x00,0x00},/*"K"*/
     },
     {
          .word = "L",
          .data = {0x08,0x20,0xF8,0x3F,0x08,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x00},/*"L"*/
     },
     {
          .word = "M",
          .data = {0x08,0x20,0xF8,0x3F,0xF8,0x01,0x00,0x3E,0xF8,0x01,0xF8,0x3F,0x08,0x20,0x00,0x00},/*"M"*/
     },
     {
          .word = "N",
          .data = {0x08,0x20,0xF8,0x3F,0x30,0x20,0xC0,0x00,0x00,0x07,0x08,0x18,0xF8,0x3F,0x08,0x00},/*"N"*/
     },
     {
          .word = "O",
          .data = {0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00},/*"O"*/
     },
     {
          .word = "P",
          .data = {0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*"P"*/
     },
     {
          .word = "Q",
          .data = {0xE0,0x0F,0x10,0x10,0x08,0x28,0x08,0x28,0x08,0x30,0x10,0x50,0xE0,0x4F,0x00,0x00},/*"Q"*/
     },
     {
          .word = "R",
          .data = {0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x00,0x88,0x03,0x88,0x0C,0x70,0x30,0x00,0x20},/*"R"*/
     },
     {
          .word = "S",
          .data = {0x00,0x00,0x70,0x38,0x88,0x20,0x08,0x21,0x08,0x21,0x08,0x22,0x38,0x1C,0x00,0x00},/*"S"*/
     },
     {
          .word = "T",
          .data = {0x18,0x00,0x08,0x00,0x08,0x20,0xF8,0x3F,0x08,0x20,0x08,0x00,0x18,0x00,0x00,0x00},/*"T"*/
     },
     {
          .word = "U",
          .data = {0x08,0x00,0xF8,0x1F,0x08,0x20,0x00,0x20,0x00,0x20,0x08,0x20,0xF8,0x1F,0x08,0x00},/*"U"*/
     },
     {
          .word = "V",
          .data = {0x08,0x00,0x78,0x00,0x88,0x07,0x00,0x38,0x00,0x0E,0xC8,0x01,0x38,0x00,0x08,0x00},/*"V"*/
     },
     {
          .word = "W",
          .data = {0x08,0x00,0xF8,0x03,0x00,0x3E,0xF8,0x01,0x00,0x3E,0xF8,0x03,0x08,0x00,0x00,0x00},/*"W"*/
     },
     {
          .word = "X",
          .data = {0x08,0x20,0x18,0x30,0x68,0x2C,0x80,0x03,0x80,0x03,0x68,0x2C,0x18,0x30,0x08,0x20},/*"X"*/
     },
     {
          .word = "Y",
          .data = {0x08,0x00,0x38,0x00,0xC8,0x20,0x00,0x3F,0xC8,0x20,0x38,0x00,0x08,0x00,0x00,0x00},/*"Y"*/
     },
     {
          .word = "Z",
          .data = {0x10,0x20,0x08,0x38,0x08,0x26,0x08,0x21,0xC8,0x20,0x38,0x20,0x08,0x18,0x00,0x00},/*"Z"*/
     },
     {
          .word = "1",
          .data = {0x00,0x00,0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00},/*"1"*/
     },
     {
          .word = "2",
          .data = {0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x08,0x21,0xF0,0x30,0x00,0x00},/*"2"*/
     },
     {
          .word = "3",
          .data = {0x00,0x00,0x30,0x18,0x08,0x20,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00},/*"3"*/
     },
     {
          .word = "4",
          .data = {0x00,0x00,0x00,0x06,0x80,0x05,0x40,0x24,0x30,0x24,0xF8,0x3F,0x00,0x24,0x00,0x24},/*"4"*/
     },
     {
          .word = "5",
          .data = {0x00,0x00,0xF8,0x19,0x88,0x20,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00},/*"5"*/
     },
     {
          .word = "6",
          .data = {0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x90,0x20,0x00,0x1F,0x00,0x00},/*"6"*/
     },
     {
          .word = "7",
          .data = {0x00,0x00,0x18,0x00,0x08,0x00,0x08,0x3E,0x88,0x01,0x68,0x00,0x18,0x00,0x00,0x00},/*"7"*/
     },
     {
          .word = "8",
          .data = {0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00},/*"8"*/
     },
     {
          .word = "9",
          .data = {0x00,0x00,0xF0,0x01,0x08,0x12,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00},/*"9"*/
     },
     {
          .word = "0",
          .data = {0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00},/*"0"*/
     },
     {
          .word = "~",
          .data = {0x00,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x00,0x00},/*"~"*/
     },
     {
          .word = "`",
          .data = {0x00,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`"*/
     },
     {
          .word = "!",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!"*/
     },
     {
          .word = "@",
          .data = {0xC0,0x07,0x30,0x18,0xC8,0x27,0x28,0x28,0xE8,0x2F,0x10,0x28,0xE0,0x17,0x00,0x00},/*"@"*/
     },
     {
          .word = "$",
          .data = {0x00,0x00,0x70,0x18,0x88,0x20,0x88,0x20,0xFC,0xFF,0x08,0x21,0x30,0x1E,0x00,0x00},/*"$"*/
     },
     {
          .word = "%",
          .data = {0xF0,0x00,0x08,0x31,0xF0,0x0C,0x80,0x03,0x60,0x1E,0x18,0x21,0x00,0x1E,0x00,0x00},/*"%"*/
     },
     {
          .word = "^",
          .data = {0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00},/*"^"*/
     },
     {
          .word = "&",
          .data = {0x00,0x1E,0xF0,0x21,0x08,0x23,0x88,0x2C,0x70,0x19,0x00,0x27,0x00,0x21,0x00,0x10},/*"&"*/
     },
     {
          .word = "*",
          .data = {0x40,0x02,0x40,0x02,0x80,0x01,0xF0,0x0F,0x80,0x01,0x40,0x02,0x40,0x02,0x00,0x00},/*"*"*/
     },
     {
          .word = "(",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x18,0x18,0x04,0x20,0x02,0x40,0x00,0x00},/*"("*/
     },
     {
          .word = ")",
          .data = {0x00,0x00,0x02,0x40,0x04,0x20,0x18,0x18,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*")"*/
     },
     {
          .word = "_",
          .data = {0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"_"*/
     },
     {
          .word = "-",
          .data = {0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00},/*"-"*/
     },
     {
          .word = "+",
          .data = {0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xE0,0x0F,0x00,0x01,0x00,0x01,0x00,0x01},/*"+"*/
     },
     {
          .word = "=",
          .data = {0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x00,0x00},/*"="*/
     },
     {
          .word = "{",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x3E,0x02,0x40,0x02,0x40},/*"{"*/
     },
     {
          .word = "[",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x00},/*"["*/
     },
     {
          .word = "}",
          .data = {0x02,0x40,0x02,0x40,0xFC,0x3E,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}"*/
     },
     {
          .word = "]",
          .data = {0x00,0x00,0x02,0x40,0x02,0x40,0x02,0x40,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*"]"*/
     },
     {
          .word = "|",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},/*"|"*/
     },
     {
          .word = "'\'",
          .data = {0x00,0x00,0x04,0x00,0x38,0x00,0xC0,0x01,0x00,0x06,0x00,0x38,0x00,0xC0,0x00,0x00},/*"\"*/
     },
     {
          .word = ":",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00},/*":"*/
     },
     {
          .word = ";",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";"*/
     },
     {
          .word = "\"",
          .data = {0x00,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x00,0x00},/*"""*/
     },
     {
          .word = "'",
          .data = {0x00,0x00,0x12,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'"*/
     },
     {
          .word = "<",
          .data = {0x00,0x00,0x00,0x01,0x80,0x02,0x40,0x04,0x20,0x08,0x10,0x10,0x08,0x20,0x00,0x00},/*"<"*/
     },
     {
          .word = ",",
          .data = {0x00,0x00,0x00,0x90,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*","*/
     },
     {
          .word = ">",
          .data = {0x00,0x00,0x08,0x20,0x10,0x10,0x20,0x08,0x40,0x04,0x80,0x02,0x00,0x01,0x00,0x00},/*">"*/
     },
     {
          .word = ".",
          .data = {0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"."*/
     },
     {
          .word = "?",
          .data = {0x00,0x00,0x70,0x00,0x48,0x00,0x08,0x30,0x08,0x37,0x88,0x00,0x70,0x00,0x00,0x00},/*"?"*/
     },
     {
          .word = "/",
          .data = {0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x07,0xC0,0x00,0x38,0x00,0x04,0x00,0x00,0x00},/*"/"*/
     },
     {
          .word = " ",
          .data = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" "*/
     },
};



#endif

C文件

/**********************************
 * @file st7565_driver.c
 * @author yujinjiang
 * @date 2024.01.19
 * *******************************/

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "hc32f460keta.h"
#include "hc32f460_gpio.h"
#include "hc32f460_clk.h"
#include "hc32f460_utility.h"
#include "hc32f460_spi.h"
#include "hc32f460_pwc.h"
#include "chip-def.h"
#include "st7565_driver.h"
#include "st7565_data.h"

void lcd_xy_set(uint8_t row,uint8_t col);
uint8_t lcd_draw(uint8_t x, uint8_t y, uint8_t x_size, uint8_t y_size, uint8_t *data,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);
void lcd_write_16x16(uint8_t x,uint8_t y,uint8_t *hz,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);
void lcd_write_8x16(uint8_t x,uint8_t y,uint8_t *hz,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache);

void lcd_cache_init(lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    memset(lcd_cache,(pola == LCD_POLA_POS)?0xff:0x00,sizeof(lcd_cache_t));
}

static void lcd_spi_init(void)
{
    //gpio init
    stc_port_init_t stcPortInit;
    memset(&stcPortInit,0,sizeof(stc_port_init_t));
    stcPortInit.enPinMode = Pin_Mode_Out;
    stcPortInit.enPinOType = Pin_OType_Cmos;
    stcPortInit.enExInt = Enable;
    stcPortInit.enPullUp = Enable;
    PORT_Init(LCD_A0_PORT, LCD_A0_PIN, &stcPortInit);
    PORT_Init(LCD_RESET_PORT, LCD_RESET_PIN, &stcPortInit);
    PORT_Init(LCD_BACK_LIGHT_PORT, LCD_BACK_LIGHT_PIN, &stcPortInit);
    PORT_ResetBits(LCD_BACK_LIGHT_PORT, LCD_BACK_LIGHT_PIN);//点亮背光

    //spi init
    stc_spi_init_t stcSpiInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcSpiInit);

    /* Configuration peripheral clock */
    PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_SPI1, Enable);

    /* Configuration SPI pin */
    PORT_SetFunc(LCD_SPI_CS_PORT, LCD_SPI_CS_PIN, Func_Spi1_Nss0, Disable);
    PORT_SetFunc(LCD_SPI_SCK_PORT, LCD_SPI_SCK_PIN, Func_Spi1_Sck, Disable);
    PORT_SetFunc(LCD_SPI_MOSI_PORT, LCD_SPI_MOSI_PIN, Func_Spi1_Mosi, Disable);

    /* Configuration SPI structure */
    stcSpiInit.enClkDiv = SpiClkDiv8;
    stcSpiInit.enFrameNumber = SpiFrameNumber1;
    stcSpiInit.enDataLength = SpiDataLengthBit8;
    stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB;
    stcSpiInit.enSckPolarity = SpiSckIdleLevelLow;//CPOL = 0
    stcSpiInit.enSckPhase = SpiSckOddSampleEvenChange;//CPHA = 0
    stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer;
    stcSpiInit.enWorkMode = SpiWorkMode4Line;
    stcSpiInit.enTransMode = SpiTransOnlySend;
    stcSpiInit.enCommAutoSuspendEn = Disable;
    stcSpiInit.enModeFaultErrorDetectEn = Disable;
    stcSpiInit.enParitySelfDetectEn = Disable;
    stcSpiInit.enParityEn = Disable;
    stcSpiInit.enParity = SpiParityEven;
    stcSpiInit.enMasterSlaveMode = SpiModeMaster;
    SPI_Init(LCD_SPI_UNIT, &stcSpiInit);
    SPI_Cmd(LCD_SPI_UNIT, Enable);
}

static void lcd_command_write(uint8_t data)
{
    PORT_ResetBits(LCD_A0_PORT,LCD_A0_PIN);
    SPI_SendData8(LCD_SPI_UNIT,data);
    while (Reset == SPI_GetFlag(LCD_SPI_UNIT, SpiFlagSendBufferEmpty));
}

static void lcd_data_write(uint8_t data)
{
    PORT_SetBits(LCD_A0_PORT,LCD_A0_PIN);
    SPI_SendData8(LCD_SPI_UNIT,data);
    while (Reset == SPI_GetFlag(LCD_SPI_UNIT, SpiFlagSendBufferEmpty));
}

void lcd_Init(lcd_cache_t *lcd_cache)
{
    //LCD_SPI_INIT
    lcd_spi_init();
    //LCD_RESET
    PORT_ResetBits(LCD_RESET_PORT,LCD_RESET_PIN);
    Ddl_Delay1ms(25);
    PORT_SetBits(LCD_RESET_PORT,LCD_RESET_PIN);
    Ddl_Delay1ms(25);
    //LCD
    lcd_command_write(LCD_CMD_RESET); //Reset
    Ddl_Delay1ms(2);
    lcd_command_write(LCD_CMD_DISP_OFF); //DISP OFF
    lcd_command_write(LCD_CMD_COM0); //DISP START LINE SET  40-7F(31shi 60)
    lcd_command_write(LCD_CMD_BS);   //LCD Bias Set,A2=1/9,A3=1/7
    lcd_command_write(LCD_CMD_MX);   //Segment Driver Direction Select A0=NORMAL,A1=REVERSE(a0)
    lcd_command_write(LCD_CMD_MY);   //Common Output Mode Select,C0=C0-C63,C8=C63-C0(c8)
    lcd_command_write(LCD_CMD_INV);   //Display Normal/Reverse,A6=NORMAL,A7=REVERSE
    lcd_command_write(LCD_CMD_RA); //V0 Voltage Regulator Internal Resistor Ratio Set, Rb/Ra Ratio 20-27
    lcd_command_write(LCD_CMD_VOP_MODE); //VOP SET 
    lcd_command_write(LCD_CMD_VOP_VALUE); //00-3F
    lcd_command_write(0xf8); //Booster Ratio Select Mode Set
    lcd_command_write(0xBL); //Booster ratio select00=2X,3X,4X  01=5X  03=6X
    lcd_command_write(0xa4); //Display All Points ON/OFF ,A4=NORMAL display mode,A5=Display all points ON
    lcd_command_write(LCD_CMD_POWER_CTRL); //Power Controller Set
    lcd_command_write(LCD_CMD_DISPLAY_ON); //DISP ON
    lcd_cache_init(LCD_POLA_NEG,lcd_cache);
    lcd_clear_all(LCD_POLA_POS,lcd_cache);
    lcd_clear_all(LCD_POLA_NEG,lcd_cache);
}

static void lcd_xy_set(uint8_t row,uint8_t col)
{
 	uint8_t cbyte;
 	cbyte=row;
 	cbyte=cbyte | 0XB0;  /* 合成命令 */
 	lcd_command_write(cbyte);  /* 写入页地址 */ 
 	cbyte =(((col+LCD_OFFSET)>>4) | 0X10);  /* 合成命令 */ //EXCURSION 为地址修正,从SO开始为0,S1开始为1
 	lcd_command_write(cbyte);  /*写入列地址的高4位*/
 	cbyte =(((col+LCD_OFFSET) & 0x0F) | 0X00);  /* 合成命令 */
 	lcd_command_write(cbyte);  /* 写入列地址的低4位 */
}

/********************************** lcd function **************************************/

void lcd_clear_all(lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    lcd_cache_init(pola,lcd_cache);
    for(int i = 0;i < LCD_PAGE;i++){
        lcd_xy_set(i,0);     /* 写入页首地址 */
        for (int j = 0; j < LCD_W; j++)
        {
            lcd_data_write((pola == LCD_POLA_POS)?0xff:0x00);
        }
    }
}

void lcd_write_16x16(uint8_t x,uint8_t y,uint8_t *hz,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
		lcd_draw(x,y,16,16,hz,pola,lcd_cache);
}

void lcd_write_8x16(uint8_t x,uint8_t y,uint8_t *hz,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
		lcd_draw(x,y,8,16,hz,pola,lcd_cache);
}

uint8_t *lcd_find_ch16(char *word)
{
    for (uint32_t i = 0; i < sizeof(lcd_ch_16x16)/sizeof(lcd_chinese_16_t); i++)
    {
        if((memcmp(word,lcd_ch_16x16[i].word,strlen("字"))) == 0){
            return (uint8_t *)lcd_ch_16x16[i].data;
        }
    }
    return (uint8_t *)lcd_ch_16x16[0].data;
}

uint8_t *lcd_find_ascii16(char *word)
{
    for (uint32_t i = 0; i < sizeof(lcd_ascii_8x16)/sizeof(lcd_ascii_16_t); i++)
    {
        if((memcmp(word,lcd_ascii_8x16[i].word,strlen("A"))) == 0){
            return (uint8_t *)lcd_ascii_8x16[i].data;
        }
    }
    return (uint8_t *)lcd_ascii_8x16[0].data;
}

void lcd_string(uint8_t x,uint8_t y,char *string,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    for(int i = 0;string[i] != 0;){
        if((string[i] & 0x80) == 0){//非汉字
            lcd_write_8x16(x + 8 * i,y,lcd_find_ascii16(&string[i]),pola,lcd_cache);
            i++;
        }
        else{//汉字
            lcd_write_16x16(x + 8 * i,y,lcd_find_ch16(&string[i]),pola,lcd_cache);
            i+=2;
        }
    }
}

void lcd_draw_square(uint8_t x,uint8_t y,uint8_t x_size,uint8_t y_size,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    lcd_draw(x,y,x_size,y_size,0,pola,lcd_cache);
}

void lcd_draw_point(uint8_t x,uint8_t y,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    lcd_draw(x,y,1,1,0,pola,lcd_cache);   
}

void lcd_cache_update(lcd_cache_t *lcd_cache)
{

    for (int i = 0; i < LCD_PAGE; i++) {//扫行
        lcd_xy_set(i, 0);
        for (int j = 0; j < LCD_W; j++) {//扫列
            lcd_data_write(lcd_cache->buffer[i][j]);
        }
    }
}

void lcd_draw_num(uint8_t x,uint8_t y,int number,uint8_t size,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    char string[6];
    string[0] = (char)(number/10000 + 0x30);
    string[1] = (char)(number%10000/1000 + 0x30);
    string[2] = (char)(number%1000/100 + 0x30);
    string[3] = (char)(number%100/10 + 0x30);
    string[4] = (char)(number%10 + 0x30);
    string[5] = '\0';
    lcd_string(x,y,&string[5 - size],pola,lcd_cache);
}

void lcd_roll_display(lcd_roll_t *roll_stru,char *string)
{
    roll_stru->counter = 0;
    roll_stru->roll_index = 0;
    roll_stru->first_index_wait_count = 0;
    //将数据提出装入数组
    int i = 0;
    for(i = 0;string[i] != 0;){
        if((string[i] & 0x80) == 0){//非汉字
            memcpy(&roll_stru->data[i*16],lcd_find_ascii16(&string[i]),16);
            i++;
        }
        else{//汉字
            memcpy(&roll_stru->data[i*16],lcd_find_ch16(&string[i]),32);
            i+=2;
        }
    }
    roll_stru->data_length = i;
}
void lcd_roll_run(lcd_roll_t *roll_stru)
{
    roll_stru->counter += roll_stru->spead;
    if(1000  <= roll_stru->counter){
        roll_stru->counter = 0;
        if(roll_stru->roll_index == 0)roll_stru->first_index_wait_count++;
        lcd_draw(roll_stru->x,roll_stru->y,roll_stru->x_size,16,roll_stru->data + roll_stru->roll_index*2,LCD_POLA_POS,roll_stru->lcd_cache);
        if(roll_stru->first_index_wait_count > 3)roll_stru->roll_index += roll_stru->step;
        if(roll_stru->roll_index > roll_stru->data_length*8){
            roll_stru->roll_index = 0;
            roll_stru->first_index_wait_count = 0;
        }
    }
}

static uint8_t lcd_draw(uint8_t x, uint8_t y, uint8_t x_size, uint8_t y_size, uint8_t *data,lcd_display_polarity_enum_t pola,lcd_cache_t *lcd_cache)
{
    int row_start = y / 8;
    int row_end = (y + y_size - 1) / 8;
    int write_data_bit_index = 0;
    uint8_t old_cache_data = 0;
    lcd_cache->x_index = x + x_size - 1;
    lcd_cache->y_index = y + y_size - 1;
    for (int i = x; i < x + x_size; i++) {//扫行
        for (int j = row_start; j <= row_end; j++) {//扫列
            int bit_start = (y < (j * 8)) ? 0 : y % 8;
            int bit_end = ((y + y_size - 1) > ((j + 1) * 8 - 1)) ? 7 : (y + y_size - 1) % 8;
            old_cache_data = lcd_cache->buffer[j][i];
            for (int k = bit_start; k <= bit_end; k++) {//写数据
                char get_data = data[write_data_bit_index / 8];
                if(data == 0){
                    get_data = (pola == LCD_POLA_NEG)?0x00:0xff;
                }
                else{
                    if(pola == LCD_POLA_NEG)get_data = ~data[write_data_bit_index / 8];
                }
                lcd_cache->buffer[j][i] &= ~(1 << k);
                lcd_cache->buffer[j][i] |= ((get_data>> (write_data_bit_index % 8)) & 1) << k;
                write_data_bit_index++;
            }
            if(old_cache_data != lcd_cache->buffer[j][i]){//需要更新
                lcd_xy_set(j, i);
                lcd_data_write(lcd_cache->buffer[j][i]);
            }
        }
    }
    return 1;
}

uint8_t lcd_x_get(lcd_cache_t *lcd_cache)
{
		return lcd_cache->x_index;
}

uint8_t lcd_y_get(lcd_cache_t *lcd_cache)
{
		return lcd_cache->y_index;
}

uint8_t lcd_data_get(uint8_t row,uint8_t x,lcd_cache_t *lcd_cache)
{
		return lcd_cache->buffer[row][x];
}

/********************************** lcd test case **************************************/


#if 0

void lcd_test_case_run(lcd_cache_t *lcd_test_cache,char *string_ascii)
{
    static uint8_t i = 0;
    if(i < 4){
        i++;
    }
    else{
        i = 5;
    }
    switch (i)
    {
    case 1:
        //清屏
        lcd_clear_all(LCD_POLA_NEG,lcd_test_cache);
        break;
    case 2:
        //文字
        lcd_string(0,0,"天地玄黄宇宙洪荒",LCD_POLA_POS,lcd_test_cache);
        lcd_draw(16 * 0, 40-10,16,16,lcd_find_ch16("日"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 1, 38-10,16,16,lcd_find_ch16("月"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 2, 36-10,16,16,lcd_find_ch16("盈"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 3, 34-10,16,16,lcd_find_ch16("昃"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 4, 32-10,16,16,lcd_find_ch16("辰"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 5, 30-10,16,16,lcd_find_ch16("宿"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 6, 28-10,16,16,lcd_find_ch16("列"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw(16 * 7, 26-10,16,16,lcd_find_ch16("张"),LCD_POLA_NEG,lcd_test_cache);
        lcd_draw_num(88,34,12345,5,LCD_POLA_POS,lcd_test_cache);
        break;
    case 3:
        //画边框
        lcd_draw_square(0,0,1,64,LCD_POLA_POS,lcd_test_cache);
        lcd_draw_square(0,63,128,1,LCD_POLA_POS,lcd_test_cache);
        lcd_draw_square(0,0,128,1,LCD_POLA_POS,lcd_test_cache);
        lcd_draw_square(127,0,1,63,LCD_POLA_POS,lcd_test_cache);
        break;
    case 4:
				
        break;
    case 5:
        lcd_string(1,47,string_ascii,LCD_POLA_POS,lcd_test_cache);
        break;

    default:
        break;
    }
}


//static lcd_roll_t roll2;
void lcd_test_case2_run(lcd_cache_t *lcd_test_cache)
{
    static int initFlag = 0;
    
    static lcd_roll_t roll;
    if(initFlag == 0){
        roll.lcd_cache = lcd_test_cache;
        roll.roll_index = 0;
        roll.spead = 1000;
        roll.step = 1;
        roll.x = 1;
        roll.y = 16;
        roll.x_size = 126;
        lcd_roll_display(&roll, "ABCDEFGHIZKLMNOPQRSTUVWXYZabcdefghizklmnopqrstuvwxyz1234567890");
        initFlag = 1;
    }
    lcd_roll_run(&roll);
		
//    static int initFlag2 = 0;
//    if(initFlag2 == 0){
//        roll2.lcd_cache = lcd_test_cache;
//        roll2.roll_index = 0;
//        roll2.spead = 1000;
//        roll2.step = 1;
//        roll2.x = 1;
//        roll2.y = 32;
//        roll2.x_size = 128;
//        lcd_roll_display(&roll2, "abcdefghizklmnopqrstuvwxyzABCDEFGHIZKLMNOPQRSTUVWXYZ1234567890");
//        initFlag2 = 1;
//    }
//    lcd_roll_run(&roll2);
}

#endif //CHIP_DEBUG

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值