女生肾疼是什么原因| ceremony是什么意思| 小孩耳鸣是什么原因引起的| 怀孕初期应该注意什么| 利空是什么意思| 海参吃什么| 什么品种的狗最粘人| 阴虚吃什么| 菊花脑是什么菜| 葛根和什么搭配泡水好| 贫血要注意些什么| 空气栓塞取什么卧位| 纤维素纤维是什么面料| 脾虚湿热吃什么中成药| 一厢情愿什么意思| 什么人不适合做收银员| 二线用药是什么意思| nasa是什么牌子| 喉炎是什么原因引起的| 疖子用什么药膏最好| 什么食物降尿酸效果好| 什么人容易得精神病| 复方对乙酰氨基酚片是什么药| 什么的迎春花| 空调健康模式是什么意思| 外甥是什么意思| 潮喷是什么感觉| 喝什么美白| 1901年属什么生肖| 11.5是什么星座| 什么颜色可以调成红色| 情定三生大结局是什么| 吃什么补黄体酮| 舌根放血有什么好处| 烧心是什么原因引起的| 副师级是什么军衔| pcv是什么意思| 感冒了不能吃什么食物| 会诊是什么意思| 活动性肺结核是什么意思| 诺欣妥是什么药| 乳头痒是怎么回事是什么原因| 梦见石头是什么意思| 海带与什么食物相克| 妇科杆菌是什么引起的| 荷花的花语是什么| 茶白色是什么颜色| 三月18号是什么星座的| 文静是什么意思| 李商隐被称为什么| 胃不舒服能吃什么水果| 1963年的兔是什么命| 屈光是什么意思| 天麻是什么东西| 叶酸片什么时候吃合适| 1月17日是什么星座| 八面玲珑是指什么生肖| 王菲属什么生肖| 周杰伦为什么喜欢昆凌| 熵是什么| 双鱼和什么星座最配对| 幼小衔接班主要教什么| 乙肝表面抗体高是什么意思| 暂停服务是什么意思| 秀才指什么生肖| 槲皮素是什么东西| 梦见烧纸钱是什么意思| 眼镜蛇为什么叫眼镜蛇| 树菠萝什么时候成熟| 一什么杨桃| 伸筋草主治什么病| 儿童喉咙发炎吃什么药| 人为什么要吃肉| cashmere是什么面料| 10.5号是什么星座| 排骨和什么菜搭配最好| 婴儿胎发什么时候剪最好| 牛子是什么意思| arf是什么意思| 过敏去医院挂什么科| 无什么无什么| 黄绿色痰液是什么感染| 一单一双眼皮叫什么眼| 什么叫走读生| 白癜风不能吃什么| 后背容易出汗是什么原因| 心慌挂什么科| 电饭煲煮粥为什么会溢出来| 双向是什么意思| 看颈椎挂什么科| 为什么一吃辣的就拉肚子| a型血的人是什么性格| 血氧低是什么原因| 研究生体检都检查什么| 农田种什么最赚钱| 什么的池塘| 重阳节是什么生肖| 得糖尿病的原因是什么| 梦见自己相亲是什么征兆| 三周年祭奠有什么讲究| 网调是什么意思| 老花眼有什么症状| 软是什么意思| iris是什么意思啊| 亚临床甲亢是什么意思| t2是什么意思| 皋读什么| 六月六是什么日子| 儿童牙龈肿痛吃什么药| 梦见大便是什么意思| 铅中毒是什么引起的| 驾崩是什么意思| 梵天是什么意思| 激素六项检查挂什么科| 公安局局长是什么级别| 男女双修是什么意思| 入伏吃羊肉有什么好处| 系带割掉了有什么影响| 金碧辉煌是什么生肖| 读警校需要什么条件| 医生为什么穿白大褂| 一什么花生| 树大招风的意思是什么| 中气不足是什么意思| 破财免灾什么意思| 肺栓塞的主要症状是什么| 言尽于此是什么意思| 葡萄糖高是什么原因| 晚上吃什么减肥快| 紫砂壶什么泥料最好| 吃什么补营养最快| 缺钠是什么原因造成的| 下身瘙痒用什么药| 腹黑是什么意思| bayer是什么药| 香蕉有什么功效和作用| 梦见花椒是什么意思| 间质瘤是什么性质的瘤| 白起为什么被赐死| 孕妇贫血吃什么药| 指甲发青是什么原因| 高血压吃什么水果好| mcm中文叫什么牌子| 沙茶酱什么味道| 女人什么时候容易怀孕| 口角炎吃什么药| 座驾是什么意思| 政绩是什么意思| 儿童遗尿挂什么科| cbd是什么| 腹部b超能检查出什么| 笙是什么意思| 胆结石能吃什么水果| 什么是格局| 6s管理内容是什么| 办离婚证需要带什么证件| 琼花是什么意思| cv是什么| z世代是什么意思| 兔子拉稀是什么原因| 吃什么东西补钙| sunny是什么意思| 用什么水和面烙饼最软| 胸部检查挂什么科| 甲状腺功能减退是什么意思| dan什么意思| 世界上最大的海洋是什么| 点痣后用什么修复最好| 肺癌积水意味什么结果| 推车是什么意思| 熠熠生辉什么意思| 石英是什么| 水潴留是什么意思| 头不舒服去医院挂什么科| gr是什么意思| 牙缝越来越大是什么原因| 清补凉是什么| 邓紫棋属什么生肖| 同人小说是什么| 为什么屎是黑色的| 仟字五行属什么| 口幼读什么| 儿童补钙吃什么| 赵云字什么| 急性肠胃炎可以吃什么| 疱疹是什么样的| 姘头是什么意思| 洋葱不能和什么食物一起吃| 螺内酯片治什么病| 子宫小结节是什么意思| 湿疹涂什么| 木姜子是什么| 手脚发麻吃什么药| 27属什么| 四月初四是什么节日| 什么食物是碱性的| 肺肿瘤吃什么好| 米饭配什么菜好吃| 正事是什么意思| 布洛芬是什么药| 补钙什么时间段最好| 脸无缘无故的肿是什么原因| 什么人不适合做业务员| 什么是理学| 什么情况需要做肠镜| c14检查前需要注意什么| 尘螨是什么| 中性粒细胞是指什么| 落子无悔是什么意思| 血脂高吃什么食物最好| 乳头痒用什么药| 耷拉是什么意思| pp材质是什么| 12年属什么| 吃什么减肥效果最快| 什么是预科生| 狸猫换太子是什么意思| 麾下是什么意思| 梦到门牙掉了是什么意思| 死心是什么意思| 跳大神是什么意思| fd是什么意思| 梦见租房子住是什么意思| 什么茶叶降血压最好| 712什么星座| 什么店可以买到老鼠药| 吃什么能让月经量增多| 部首和偏旁有什么区别| 碳素厂是做什么的| 小时的单位是什么| 雅典娜是什么神| 颠是什么意思| 良民是什么意思| 灵芝和什么煲汤好| 神疲乏力是什么症状| 腰间盘突出挂什么科| 做梦和别人吵架意味着什么| 醋加小苏打有什么作用| 什么是汗疱疹| 8023是什么意思啊| 脾大吃什么可以缩脾| 一个月一个元念什么| 小揪揪什么意思| 7点至9点是什么时辰| 草龟吃什么食物| 梦见女人是什么意思| 炖牛肉什么时候放盐| 姨妈期不能吃什么| 大佬什么意思| 急性肠胃炎吃什么药效果好| 出汗多是什么病| 泡脚出汗有什么好处| 公主抱是什么意思| 眼睛模糊是什么原因引起的| 肌无力是什么原因引起的| 腰酸是什么原因女性| 牙龈上火肿痛吃什么药| 发量多的女生适合什么发型| 单宁是什么| 木变石是什么| 河童是什么意思| 飞短流长是什么意思| 孕妇吃鸽子蛋对胎儿有什么好处| 疱疹在什么情况下传染| 百度
打印
[AT32M412]

王慧敏--浙江频道--人民网

[复制链接]
719|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yinwuqing110 于 2025-6-16 20:45 编辑

       本次使用AT-START-M412驱动1.77寸TFT-LCD屏,该屏驱动芯片ST7735S,购买链接:AFL128160A0-1.77N12NTM-ANO,屏的点像素为128x160,通讯接口SPI,为方便移植,这里驱动采用GPIO口模拟SPI通讯方式。LCD屏的规格书如下附件:
AFL128160A0-1.77N12NTM-ANO.pdf (416.33 KB)
        AT-START-M412开发板与ST7735S屏硬件接口连线:

         接下来移植相关驱动源码,代码展示如下。
lcd_st7735.c与lcd_st7735.h文件
#include "lcd_st7735.h"
#include "at32m412_416_board.h"
#include "at32m412_416_conf.h"
#include  "lcdfont.h"
#include  "pics.h"

#define SOFTWARE_SPI_ENABLE   1
/*
        AT32M412      LCD屏
        GND              GND
        3.3V              VCC
        PA0               RES(复位)
        PA1               DC(命令数据选择)
        PA2               CS(片选)               
        PA3               SCLK
        PA4               MOSI
        PA5               BL(背光)
*/
#define TFT_RST_GPIO_PORT     GPIOA
#define TFT_RST_PIN           GPIO_PINS_0
#define TFT_DC_GPIO_PORT      GPIOA
#define TFT_DC_PIN            GPIO_PINS_1
#define TFT_CS_GPIO_PORT      GPIOA
#define TFT_CS_PIN            GPIO_PINS_2
#define TFT_SCLK_GPIO_PORT    GPIOA
#define TFT_SCLK_PIN          GPIO_PINS_3
#define TFT_MOSI_GPIO_PORT    GPIOA
#define TFT_MOSI_PIN          GPIO_PINS_4
#define TFT_BLK_GPIO_PORT     GPIOA
#define TFT_BLK_PIN           GPIO_PINS_5
        
#define LCD_RES_LOW()   gpio_bits_reset(TFT_RST_GPIO_PORT, TFT_RST_PIN)//RES
#define LCD_RES_HIGH()  gpio_bits_set(TFT_RST_GPIO_PORT, TFT_RST_PIN)

#define LCD_DC_LOW()    gpio_bits_reset(TFT_DC_GPIO_PORT, TFT_DC_PIN) //DC
#define LCD_DC_HIGH()   gpio_bits_set(TFT_DC_GPIO_PORT, TFT_DC_PIN)

#define LCD_CS_LOW()    gpio_bits_reset(TFT_CS_GPIO_PORT, TFT_CS_PIN) //CS
#define LCD_CS_HIGH()   gpio_bits_set(TFT_CS_GPIO_PORT, TFT_CS_PIN)
                     
#define LCD_BLK_LOW()   gpio_bits_reset(TFT_BLK_GPIO_PORT, TFT_BLK_PIN) //BLK
#define LCD_BLK_HIGH()  gpio_bits_set(TFT_BLK_GPIO_PORT, TFT_BLK_PIN)

#if SOFTWARE_SPI_ENABLE
#define LCD_SCLK_LOW()  gpio_bits_reset(TFT_SCLK_GPIO_PORT, TFT_SCLK_PIN) //SCLK
#define LCD_SCLK_HIGH() gpio_bits_set(TFT_SCLK_GPIO_PORT, TFT_SCLK_PIN)

#define LCD_MOSI_LOW()  gpio_bits_reset(TFT_MOSI_GPIO_PORT, TFT_MOSI_PIN) //MOSI
#define LCD_MOSI_HIGH() gpio_bits_set(TFT_MOSI_GPIO_PORT, TFT_MOSI_PIN)
#endif

#define USE_HORIZONTAL 1  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
        #define LCD_W 128  
        #define LCD_H 160  
#else
        #define LCD_W 160
        #define LCD_H 128
#endif

void LcdIoInit(void)
{
        gpio_init_type gpio_init_struct;
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
        
        gpio_init_struct.gpio_pins   = TFT_BLK_PIN;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_struct.gpio_mode  = GPIO_MODE_OUTPUT;
        gpio_init(GPIOA, &gpio_init_struct);
        
        gpio_init_struct.gpio_pins   = TFT_RST_PIN;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_struct.gpio_mode  = GPIO_MODE_OUTPUT;
        gpio_init(GPIOA, &gpio_init_struct);
        
        gpio_init_struct.gpio_pins   = TFT_DC_PIN;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_struct.gpio_mode  = GPIO_MODE_OUTPUT;
        gpio_init(GPIOA, &gpio_init_struct);
        
        gpio_init_struct.gpio_pins   = TFT_CS_PIN;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_struct.gpio_mode  = GPIO_MODE_OUTPUT;
        gpio_init(GPIOA, &gpio_init_struct);
         
        gpio_init_struct.gpio_pins   = TFT_SCLK_PIN;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_struct.gpio_mode  = GPIO_MODE_OUTPUT;
        gpio_init(GPIOA, &gpio_init_struct);
         
        gpio_init_struct.gpio_pins   = TFT_MOSI_PIN;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_struct.gpio_mode  = GPIO_MODE_OUTPUT;
        gpio_init(GPIOA, &gpio_init_struct);
}

/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat  要写入的串行数据
返回值:  无
******************************************************************************/
void LCD_Writ_Bus(uint8_t dat)
{        
        uint8_t i;
        
        LCD_CS_LOW();
#if SOFTWARE_SPI_ENABLE        
        for(i=0;i<8;i++)
        {                          
                LCD_SCLK_LOW();
                if(dat&0x80)
                {
                   LCD_MOSI_HIGH();
                }
                else
                {
                   LCD_MOSI_LOW();
                }
                LCD_SCLK_HIGH();
                dat<<=1;
        }
#else

        SPI_SendData(CW_SPI2, dat);
        while(SPI_GetFlagStatus(CW_SPI2, SPI_FLAG_TXE) == RESET);

#endif        
        LCD_CS_HIGH();        
}

/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值:  无
******************************************************************************/
void LCD_WR_DATA8(uint8_t dat)
{
        LCD_Writ_Bus(dat);
}

/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值:  无
******************************************************************************/
void LCD_WR_DATA(uint16_t dat)
{
        LCD_Writ_Bus(dat>>8);
        LCD_Writ_Bus(dat);
}

/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值:  无
******************************************************************************/
void LCD_WR_REG(uint8_t  dat)
{
        LCD_DC_LOW();//写命令
        LCD_Writ_Bus(dat);
        LCD_DC_HIGH();//写数据
}

/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
                  y1,y2 设置行的起始和结束地址
返回值:  无
******************************************************************************/
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
        if(USE_HORIZONTAL==0)
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+2);
                LCD_WR_DATA(x2+2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+1);
                LCD_WR_DATA(y2+1);
                LCD_WR_REG(0x2c);//储存器写
        }
        else if(USE_HORIZONTAL==1)
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+2);
                LCD_WR_DATA(x2+2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+1);
                LCD_WR_DATA(y2+1);
                LCD_WR_REG(0x2c);//储存器写
        }
        else if(USE_HORIZONTAL==2)
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+1);
                LCD_WR_DATA(x2+1);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+2);
                LCD_WR_DATA(y2+2);
                LCD_WR_REG(0x2c);//储存器写
        }
        else
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+1);
                LCD_WR_DATA(x2+1);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+2);
                LCD_WR_DATA(y2+2);
                LCD_WR_REG(0x2c);//储存器写
        }
}

/******************************************************************************
函数说明:LCD初始化,包含硬件IO
入口数据:无
返回值:  无
******************************************************************************/
void LcdInit(void)
{
        LcdIoInit();
        
        LCD_RES_LOW();
        delay_ms(100);
        LCD_RES_HIGH();
        delay_ms(100);
        LCD_BLK_HIGH();
        delay_ms(100);
      
        LCD_WR_REG(0x11);
        delay_ms(120);
        LCD_WR_REG(0xB1);
        LCD_WR_DATA8(0x05);
        LCD_WR_DATA8(0x3C);
        LCD_WR_DATA8(0x3C);
        LCD_WR_REG(0xB2);
        LCD_WR_DATA8(0x05);
        LCD_WR_DATA8(0x3C);
        LCD_WR_DATA8(0x3C);
        LCD_WR_REG(0xB3);
        LCD_WR_DATA8(0x05);
        LCD_WR_DATA8(0x3C);
        LCD_WR_DATA8(0x3C);
        LCD_WR_DATA8(0x05);
        LCD_WR_DATA8(0x3C);
        LCD_WR_DATA8(0x3C);
        LCD_WR_REG(0xB4);
        LCD_WR_DATA8(0x03);
        LCD_WR_REG(0xC0);
        LCD_WR_DATA8(0x28);
        LCD_WR_DATA8(0x08);
        LCD_WR_DATA8(0x04);
        LCD_WR_REG(0xC1);
        LCD_WR_DATA8(0XC0);
        LCD_WR_REG(0xC2);
        LCD_WR_DATA8(0x0D);
        LCD_WR_DATA8(0x00);
        LCD_WR_REG(0xC3);
        LCD_WR_DATA8(0x8D);
        LCD_WR_DATA8(0x2A);
        LCD_WR_REG(0xC4);
        LCD_WR_DATA8(0x8D);
        LCD_WR_DATA8(0xEE);
        LCD_WR_REG(0xC5);
        LCD_WR_DATA8(0x1A);
        LCD_WR_REG(0x36);
        
        if(USE_HORIZONTAL==0)
                LCD_WR_DATA8(0x00);
        else if(USE_HORIZONTAL==1)
                LCD_WR_DATA8(0xC0);
        else if(USE_HORIZONTAL==2)
                LCD_WR_DATA8(0x70);
        else
                LCD_WR_DATA8(0xA0);
      
        LCD_WR_REG(0xE0);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x22);
        LCD_WR_DATA8(0x07);
        LCD_WR_DATA8(0x0A);
        LCD_WR_DATA8(0x2E);
        LCD_WR_DATA8(0x30);
        LCD_WR_DATA8(0x25);
        LCD_WR_DATA8(0x2A);
        LCD_WR_DATA8(0x28);
        LCD_WR_DATA8(0x26);
        LCD_WR_DATA8(0x2E);
        LCD_WR_DATA8(0x3A);
        LCD_WR_DATA8(0x00);
        LCD_WR_DATA8(0x01);
        LCD_WR_DATA8(0x03);
        LCD_WR_DATA8(0x13);
        LCD_WR_REG(0xE1);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x16);
        LCD_WR_DATA8(0x06);
        LCD_WR_DATA8(0x0D);
        LCD_WR_DATA8(0x2D);
        LCD_WR_DATA8(0x26);
        LCD_WR_DATA8(0x23);
        LCD_WR_DATA8(0x27);
        LCD_WR_DATA8(0x27);
        LCD_WR_DATA8(0x25);
        LCD_WR_DATA8(0x2D);
        LCD_WR_DATA8(0x3B);
        LCD_WR_DATA8(0x00);
        LCD_WR_DATA8(0x01);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x13);
        LCD_WR_REG(0x3A);
        LCD_WR_DATA8(0x05);
        LCD_WR_REG(0x29);
}

/******************************************************************************
函数说明:在指定区域填充颜色
入口数据:xsta,ysta   起始坐标
                  xend,yend   终止坐标
                  color       要填充的颜色
返回值:  无
******************************************************************************/
void LcdFill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{         
        uint16_t i,j;
        
        LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
        
        for(i=ysta;i<yend;i++)
        {                                                                                                                           
                for(j=xsta;j<xend;j++)
                {
                        LCD_WR_DATA(color);
                }
        }                                                      
}

/******************************************************************************
函数说明:在指定位置画点
入口数据:x,y 画点坐标
                  color 点的颜色
返回值:  无
******************************************************************************/
void LcdDrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
        LCD_Address_Set(x,y,x,y);//设置光标位置
        LCD_WR_DATA(color);
}

/******************************************************************************
函数说明:画线
入口数据:x1,y1   起始坐标
                  x2,y2   终止坐标
                  color   线的颜色
返回值:  无
******************************************************************************/
void LcdDrawLine(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color)
{
        uint16_t t;
        int xerr=0,yerr=0,delta_x,delta_y,distance;
        int incx,incy,uRow,uCol;
        
        delta_x=x2-x1; //计算坐标增量
        delta_y=y2-y1;
        uRow=x1;//画线起点坐标
        uCol=y1;
        if(delta_x>0)incx=1; //设置单步方向
        else if (delta_x==0)incx=0;//垂直线
        else {incx=-1;delta_x=-delta_x;}
        if(delta_y>0)incy=1;
        else if (delta_y==0)incy=0;//水平线
        else {incy=-1;delta_y=-delta_y;}
        if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
        else distance=delta_y;
        
        for(t=0;t<distance+1;t++)
        {
                LcdDrawPoint(uRow,uCol,color);//画点
                xerr+=delta_x;
                yerr+=delta_y;
                if(xerr>distance)
                {
                        xerr-=distance;
                        uRow+=incx;
                }
                if(yerr>distance)
                {
                        yerr-=distance;
                        uCol+=incy;
                }
        }
}

/******************************************************************************
函数说明:画矩形
入口数据:x1,y1   起始坐标
                  x2,y2   终止坐标
                  color   矩形的颜色
返回值:  无
******************************************************************************/
void LcdDrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color)
{
        LcdDrawLine(x1,y1,x2,y1,color);
        LcdDrawLine(x1,y1,x1,y2,color);
        LcdDrawLine(x1,y2,x2,y2,color);
        LcdDrawLine(x2,y1,x2,y2,color);
}

/******************************************************************************
函数说明:画圆
入口数据:x0,y0   圆心坐标
                  r       半径
                  color   圆的颜色
返回值:  无
******************************************************************************/
void LcdDrawCircle(uint16_t x0,uint16_t y0,uint8_t r,uint16_t color)
{
        int a,b;
        
        a=0;b=r;         
        while(a<=b)
        {
                LcdDrawPoint(x0-b,y0-a,color);              //3           
                LcdDrawPoint(x0+b,y0-a,color);             //0           
                LcdDrawPoint(x0-a,y0+b,color);             //1               
                LcdDrawPoint(x0-a,y0-b,color);              //2            
                LcdDrawPoint(x0+b,y0+a,color);            //4               
                LcdDrawPoint(x0+a,y0-b,color);             //5
                LcdDrawPoint(x0+a,y0+b,color);            //6
                LcdDrawPoint(x0-b,y0+a,color);             //7
                a++;
                if((a*a+b*b)>(r*r))//判断要画的点是否过远
                {
                        b--;
                }
        }
}

/******************************************************************************
函数说明:显示单个字符
入口数据:x,y显示坐标
                  ch 要显示的字符
                  fc 字的颜色
                  bc 字的背景色
                  csize 字号
返回值:  无
******************************************************************************/
void LcdShowChar(uint16_t x,uint16_t y,uint8_t ch,uint16_t fc,uint16_t bc,uint8_t csize)
{
        const unsigned char  *temp;
        uint8_t i,j,k;
        uint16_t x0=x,y0=y;
        uint8_t row=0,column=0;
        
        row=(csize/8+((csize%8)?1:0));  //计算行
        column=csize/2;                        //列
        ch=ch-' ';                                  //得到偏移后的值
               
        switch(csize)
        {
                case 12:temp=Ascii_6x12[ch]; break;
                case 16:temp=Ascii_8x16[ch]; break;
                case 24:temp=Ascii_12x24[ch]; break;
                case 32:temp=Ascii_16x32[ch]; break;
                default: temp=Ascii_6x12[ch]; break;
        }
        
        //显示要与取模方式保持一致
        for(i=0;i<row;i++)
        {
                for(j=0;j<column;j++)
                {
                        for(k=0;k<8;k++)
                        {
                                if((*temp)&(0x01<<k))
                                {
                                        LcdDrawPoint(x,y,fc);//画一个点,字体色
                                }
                                else
                                {
                                        LcdDrawPoint(x,y,bc);//画一个点,背景色
                                }
                                y++;
                        }
                        y=y0;
                        x++;
                        temp++;
                }
                x=x0;
                y0+=8;
                y=y0;
        }
}

/******************************************************************************
函数说明:显示字符串
入口数据:x,y显示坐标
                  *p 要显示的字符串
                  fc 字的颜色
                  bc 字的背景色
                  csize 字号
返回值:  无
******************************************************************************/
void LcdShowString(uint16_t x,uint16_t y,const char *p,uint16_t fc,uint16_t bc,uint8_t csize)
{         
        while(*p!='\0')
        {      
                LcdShowChar(x,y,*p,fc,bc,csize);
                x+=csize/2;
                p++;
        }  
}

/******************************************************************************
函数说明:显示汉字字符
入口数据:x,y显示坐标
                  index 汉字字符索引
                  fc 字的颜色
                  bc 字的背景色
返回值:  无
******************************************************************************/
void LcdShow16x16Hz(uint32_t x, uint32_t y, uint8_t index, uint16_t fc, uint16_t bc)        
{  
        const char *temp=Hzk[index];              // 获取字体数据在数组中的的起始位置
        uint8_t y0=y,x0=x;
        uint8_t i,j,k;
        uint8_t row=0,column=0;

        row=16/8;
        column=16;
        
        //显示要与取模方式保持一致
        for(i=0;i<row;i++)
        {
                for(j=0;j<column;j++)
                {
                        for( k=0;k<8;k++)
                        {         
                                if(*temp&(0x01<<k))
                                {
                                        LcdDrawPoint(x,y,fc);//画一个点,字体色
                                }
                                else
                                {
                                        LcdDrawPoint(x,y,bc);//画一个点,背景色
                                }
                                y++;
                        }
                        temp++;
                        x++;
                        y=y0;
                }
                x=x0;
                y0+=8;
                y=y0;
        }
}        

/******************************************************************************
      函数说明:显示图片
      入口数据:x,y起点坐标
                length 图片长度
                width  图片宽度
                pic[]  图片数组
      返回值:  无
******************************************************************************/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
        u16 i,j;
        u32 k=0;
        x=x-5;
        LCD_Address_Set(x,y,x+length-1,y+width-1);
        for(i=0;i<length;i++)
        {
                for(j=0;j<width;j++)
                {
                        LCD_WR_DATA8(pic[k*2]);
                        LCD_WR_DATA8(pic[k*2+1]);
                        k++;
                }
        }                        
}

/******************************************************************************
函数说明:显示图片
入口数据:x,y显示坐标
                  width   图片宽度
                  height  图片高度
                  image   图片数据
返回值:  无
******************************************************************************/
void LcdShowImage(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *image)
{         
        uint16_t colorData=0;
        uint32_t cnt=0;
        uint16_t i,j;
        
         for( i=0; i<height; i++)                                          // 一行一行地显示
        {
                 LCD_Address_Set(x, y+i, x+width, y+height);  // 重新设置光标位置
                for( j=0; j<width; j++)                                  // 一行中,从左到右,逐个像素处理
                {                    
                    colorData=(image[cnt*2+1]<<8) | image[cnt*2];
                    LCD_WR_DATA(colorData);                        // 写入16位颜色数据
                        cnt++;        
                }
        }         
}
#ifndef __LCD_ST7735_H__
#define __LCD_ST7735_H__

typedef unsigned int   uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char  uint8_t;

#define WHITE                  0xFFFF
#define BLACK                  0x0000         
#define BLUE                   0x001F  
#define BRED                   0XF81F
#define GRED                   0XFFE0
#define GBLUE                  0X07FF
#define RED                    0xF800
#define MAGENTA                0xF81F
#define GREEN                  0x07E0
#define CYAN                   0x7FFF
#define YELLOW                 0xFFE0
#define BROWN                  0XBC40            //棕色
#define BRRED                  0XFC07            //棕红色
#define GRAY                   0X8430            //灰色
#define DARKBLUE               0X01CF            //深蓝色
#define LIGHTBLUE              0X7D7C            //浅蓝色  
#define GRAYBLUE               0X5458            //灰蓝色
#define LIGHTGREEN             0X841F            //浅绿色
#define LGRAY                  0XC618            //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE              0XA651            //浅灰蓝色(中间层颜色)
#define LBBLUE                 0X2B12            //浅棕蓝色(选择条目的反色)

void Display_Test(void);
void LcdDrawPoint(uint16_t x,uint16_t y,uint16_t color);
void LcdInit(void);
#endif
应用相关接口代码如下:
main.c
/* includes */
#include "at32m412_416_board.h"
#include "at32m412_416_clock.h"
#include "lcd_st7735.h"

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
  system_clock_config();
  at32_board_init();
        LcdInit();
       
  while(1)
  {
  Display_Test();
  }
}

在lcd_st7735.c中添加LCD测试接口代码:
/******************************************************************************
函数说明:LCD显示测试
入口数据:无
返回值:  无
******************************************************************************/
void Display_Test(void)
{
        LcdFill(0,3,LCD_W,LCD_H,BLACK);
        LcdShow16x16Hz(8, 3, 0, YELLOW, BLACK);
        LcdShow16x16Hz(24, 3, 1, YELLOW, BLACK);
        LcdShow16x16Hz(40, 3, 2, YELLOW, BLACK);
        LcdShow16x16Hz(56, 3, 3, YELLOW, BLACK);
        LcdShow16x16Hz(72, 3, 4, YELLOW, BLACK);
        LcdShow16x16Hz(88, 3, 5, YELLOW, BLACK);
        LcdShow16x16Hz(104,3, 6, YELLOW, BLACK);
        LcdShowString(12,24,"AT32F412",RED, BLACK,24);
        delay_ms(100);
        LcdShow16x16Hz(38,60, 7, BLUE, WHITE);
        delay_ms(100);
        LcdShow16x16Hz(56,60, 8, BLUE, WHITE);
        delay_ms(100);
        LcdShow16x16Hz(74,60, 9, BLUE, WHITE);
        delay_ms(1000);
        LCD_ShowPicture(0,0,128,160,gImage_1);
        delay_ms(1000);
}
硬件实物连线如下:

这里的中文字符与彩色图片制作,需要借助汉字取模工具“PCtoLCD2002”与图片取模工具“Img2Lcd”。
PCtoLCD2002.zip (886.17 KB)
Image2Lcd.zip (506.45 KB)
驱动的效果见B站视频:AT32M412驱动ST7735S彩屏




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

本版积分规则

106

主题

1096

帖子

7

粉丝
局限是什么意思 月光蓝是什么颜色 什么是速写 幺妹是什么意思 水猴子是什么动物
五蕴指什么 铜钱草能治什么病 纯爱是什么意思 总头晕是什么原因 什么的秃鹫
人的血压一天中什么时候最高 苦涩是什么意思 肺结节是什么病严重吗 碳酸钠呈什么性 口我什么意思
乔字五行属什么 珍珠五行属什么 为什么明星不激光祛斑 维生素b2是什么 儿童反复发烧什么原因
阴道有褐色分泌物是什么原因hcv9jop2ns1r.cn 什么是社会hcv7jop9ns6r.cn 八面玲珑代表什么生肖hanqikai.com c反应蛋白偏高说明什么hcv8jop6ns3r.cn 普萘洛尔是什么药hcv8jop6ns7r.cn
耳前瘘管有什么危害hcv8jop7ns0r.cn 敏是什么意思hcv9jop8ns2r.cn 意淫是什么意思hcv8jop5ns2r.cn 吃什么补阳气最快hcv9jop5ns0r.cn 高钙血症是什么意思hcv8jop1ns6r.cn
梦见自己流血是什么预兆hcv9jop6ns2r.cn 台湾以前叫什么名字hcv7jop5ns0r.cn 平板支撑有什么好处hcv8jop4ns3r.cn 海鸥吃什么食物hcv7jop7ns1r.cn 子宫肌瘤有什么症状表现wuhaiwuya.com
自行车什么牌子好hcv8jop7ns2r.cn 天台是什么意思hcv8jop2ns4r.cn 射手座跟什么星座最配huizhijixie.com 胸口痛吃什么药hcv8jop9ns4r.cn 致青春是什么意思hcv9jop7ns1r.cn
百度