宫腔线不清晰什么意思| 凤眼果什么时候成熟| snidel是什么牌子| 宫颈涂片检查是查什么| 小孩手足口病吃什么药| 周年祭日有什么讲究| hiv1是什么意思| 医保卡什么样子| 世界上最小的花是什么花| cindy是什么意思| 秋天可以干什么| 胎儿脉络丛囊肿是什么原因引起的| 重庆东站什么时候通车| 全身水肿是什么原因引起的| 意大利买什么包便宜| afc是什么意思| 为什么一来月经就头疼| 新的五行属性是什么| 副处级干部是什么级别| 葡萄柚是什么水果| 念珠菌是什么| pr是什么工作| 喜欢紫色的女人是什么性格| 梅花什么季节开| 处口念什么| 尿急憋不住尿是什么原因| 庄周梦蝶什么意思| 豪五行属什么| 送同学什么毕业礼物好| 平均红细胞体积偏高是什么原因| 白头发缺什么微量元素| 柔肝是什么意思| 银杏是什么| 老虔婆是什么意思| 什么血糖仪准确度高| 为什么受伤总是我| 梦见丢了一只鞋是什么意思| 呆子是什么意思| 北京为什么叫帝都| 日加华念什么| 膝关节积液是什么原因造成的| 头颈出汗多是什么原因| 宝宝喝什么奶粉好| 硫磺是什么| 八哥吃什么食物| 海鸥手表是什么档次| 布鲁斯是什么意思| 下火喝什么茶| 香港电话前面加什么| 什么叫化学| 玫瑰糠疹是什么原因引起的| 辅酶q10什么时候吃最好| 烤鱼放什么配菜好吃| 鬼火是什么| 什么什么不见| ad是什么缩写| 石斛起什么作用| 殇字是什么意思| 脚趾甲发白是什么原因| 去医院要带什么| 莫代尔是什么面料| 有何特长一般填什么好| 指控是什么意思| 状元及第是什么意思| 白泽是什么神兽| ib是什么意思| 剑客是什么意思| 冠状动脉粥样硬化性心脏病吃什么药| 什么可以减肥| 梦见自己有孩子了是什么预兆| 什么是肾癌| 70年产权是什么意思| 这次是我真的决定离开是什么歌| 儿童风寒咳嗽吃什么药| 被螨虫咬了用什么药膏| 职务是什么意思| 胃部检查除了胃镜还有什么方法| 氟哌酸又叫什么| 溪水什么| 脸上白了一小块是什么原因| 鱿鱼炒什么好吃| 桃子有什么功效| 童心未泯什么意思| 胁迫是什么意思| 敛财是什么意思| 鸡为什么喜欢吃泡沫| 七月四日是什么星座| 猎德村为什么那么有钱| 九宫是什么意思| 后背发冷发凉属于什么症状| 39岁属什么| 儿童病毒感染吃什么药| 脑溢血有什么后遗症| hl什么意思| 567是什么意思| 大校军衔相当于什么官| 住院医师是什么意思| 林彪为什么要叛逃| ct挂号挂什么科| 尘埃落定什么意思| 反流性食管炎b级是什么意思| 醒酒最快的方法是什么| 山楂和什么泡水喝最好| 胖子从12楼掉下来会变什么| 西夏是什么民族| 一什么水珠| 思觉失调是什么意思| 金屋藏娇是什么意思| 囧途什么意思| 腰闪了挂什么科| 自闭症是什么人投胎| 坐骨神经痛挂什么科| 喜欢蹲着是什么原因| 小孩肠系膜淋巴结炎吃什么药| special是什么意思| 氨味是什么味道| 检查甲亢挂什么科| 懂事是什么意思| 脑瘤早期什么症状| 血小板减少会出现什么症状| 交警中队长是什么级别| 切除子宫有什么影响| 2025年什么年| 润滑油可以用什么代替| 女人怀孕的最佳时间是什么时间| 尿路结石有什么症状| 补牙为什么要分三次| 先什么后什么| 请婚假需要什么材料| 飞蚊症用什么滴眼液| adidas是什么牌子| 什么是性压抑| 吃白糖有什么好处和坏处| 佛光普照是什么生肖| 什么是早恋| 八月二十是什么星座| 古惑仔为什么不拍了| 衣冠禽兽指什么生肖| 2月17日是什么星座| 123是什么意思| 5月10号是什么星座| 阴道壁是什么样的| 肝腹水是什么症状| 拉油便是什么原因| 怎么看自己五行属什么| 酸性体质是什么意思| 库欣综合征是什么病| 梦到门牙掉了是什么意思| 牛顿三大定律是什么| 惊闻是什么意思| 什么牌子的奶粉最好| 脸上发痒是什么原因| 点蜡烛什么意思| 双性人什么意思| 树懒是什么动物| 打激素有什么副作用| 胎位rsa是什么意思| 动态密码是什么| 什么情况啊这是| 桥本是什么意思| 甲减和甲亢有什么区别| 那悲歌总会在梦中惊醒是什么歌| 什么叫风湿| 传染病八项包括什么| 梦见猪肉是什么意思| 锴字五行属什么| 科伦是什么药| 类风湿因子高说明什么| gc是什么激素| 口是什么感觉| 老是掉发是什么原因| 澳门使用什么货币| 卯时五行属什么| 感康是什么| 学医需要什么条件| 腿抽筋是什么原因引起的| 拔苗助长是什么生肖| 海选是什么意思| 炖羊汤放什么调料| 什么是木薯| 山楂和什么泡水喝减肥效果最好| 检察长什么级别| 肠胃胀气是什么原因| 人体最大的排毒器官是什么| 苎麻是什么面料| 头疼头晕吃什么药| 骨头疼是什么病的征兆| 白头翁是什么动物| 为什么人会做梦| 亥时是什么时候| 右下腹疼痛挂什么科| 甲状腺欠均匀什么意思| 什么是速写| 杠杆是什么意思| 左束支传导阻滞是什么意思| 回是什么生肖| 候和侯有什么区别| 静脉炎的症状是什么| 哥哥的孩子叫我什么| 巨蟹跟什么星座最配| 手麻脚麻是什么病| 随波逐流什么意思| 什么克火| 半套什么意思| 汗味重是什么原因| 毕婚族是什么意思| 财神位放什么最旺财| 梨是什么季节的水果| 哎是什么意思| 部委是什么意思| 运筹帷幄是什么意思| 头发出汗多是什么原因| 吃维生素b6有什么好处和副作用| 阴茎痒是什么原因| 缺营养吃什么补身体最好| 10月12号是什么星座| 乌冬面是什么面| 有过之而不及是什么意思| click什么意思| 盆腔炎吃什么药效果好| sly是什么牌子| 异地结婚登记需要什么证件| 痛风可以喝什么酒| 胃病四联疗法是什么药| 玉兰油适合什么年龄| 茵陈和什么泡水喝对肝脏最好| 什么米好吃又香又软| 胃恶心想吐吃什么药| 1月1日是什么日子| 细软是什么意思| 12月17号什么星座| 布洛芬0.3和0.4g有什么区别| 尿液有泡沫是什么原因| 角质是什么| 儿童嗓子疼吃什么药好| belkin是什么牌子| 祈禳是什么意思| 梦到和别人吵架是什么意思| 什么是软文| 肺不好的人吃什么好| 左侧卵巢囊性回声是什么意思| 牙龈出血用什么药| 尿液发黄是什么原因| 山楂和什么泡水喝减肥效果最好| 为什么水不能燃烧| 红颜什么意思| 梦见滑雪是什么意思| 九月开什么花| 副营级是什么军衔| 熬夜吃什么补回来| 抖腿是什么毛病| 发财树用什么肥料最好| 醋精是什么| 乳香是什么东西| 手经常抽筋是什么原因| 唇炎去医院挂什么科| 32周岁属什么生肖| 孕妇吃什么补铁| 低氧血症是什么意思| 摸金是什么意思| 左眼一直跳有什么预兆| 一般细菌涂片检查是查什么| 招蚊子咬是什么原因| 什么的曲线| 百度
打印
[AT32M412]

社会法制--广西频道--人民网

[复制链接]
720|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

粉丝
rebecca什么意思 远香近臭什么意思 甲状腺吃什么药好 毒龙是什么意思 教育局局长是什么级别
鬼火是什么意思 男人阳气不足有什么症状 什么字属金 1962属什么生肖 小孩满月送什么礼物好
福鼎白茶属于什么茶 月亮杯是什么东西 胚轴发育成什么 百花齐放是什么生肖 奥倍健是什么药
活性印染是什么意思 莹字五行属什么 孕妇吃海参对胎儿有什么好处 爬虫什么意思 ab型血和b型血生的孩子是什么血型
中医是什么hcv8jop2ns3r.cn 忙什么呢幽默的回答hcv8jop2ns1r.cn 43岁属什么hcv9jop0ns8r.cn 酸枣仁配什么治疗失眠hcv7jop6ns3r.cn 腰椎间盘突出挂什么科室hcv8jop6ns0r.cn
念珠菌感染用什么药hcv7jop5ns4r.cn warrior是什么牌子hcv9jop6ns9r.cn 来月经可以吃什么水果hcv9jop1ns3r.cn 金刚菩提是什么植物的种子hcv9jop1ns4r.cn 什么样的人可以通灵hcv9jop1ns6r.cn
球蛋白有什么作用和功效hcv8jop2ns2r.cn 尿酸高的人吃什么食物好wuhaiwuya.com 汕头有什么好玩的景点hcv8jop9ns2r.cn 暗无天日是什么意思hcv7jop9ns6r.cn 伊面是什么面hcv7jop6ns7r.cn
王是什么生肖baiqunet.com hgb是什么意思hcv7jop9ns4r.cn 8月3日是什么日子dayuxmw.com 西洋菜俗称叫什么hcv7jop5ns4r.cn 胸推什么意思hcv8jop0ns4r.cn
百度