[RISC-V MCU 创新应用比赛]

CH32F103驱动LCD

[复制链接]
3807|2
手机看帖
扫描二维码
随时随地手机跟帖
gaochy1126|  楼主 | 2021-8-17 22:18 | 显示全部楼层 |阅读模式
#申请原创#
近期申请了RISC-V MCU CH32V103 评估板,准备试试CH32V103 。因为STM32F103C8T6的价格基本上是翻倍了,平时做一些东西感觉成本太高了,同样性能的CH32V103 相对来说,价格就便宜了很多。看到了首届 RISC-V MCU 创新应用,有机会申请这个板子。
来看一下这个板子确实非常的不错,外设资源很多,板子还可以使用arduino的外围设备。
附上一张官网的图片吧。板子还自由下载和调试工具,分开就是一个非常棒的下载器。
123.jpg

以前经常使用keil的开发环境,也没有用过eclipse开发过相关的产品,这个MounRiver Studio不是很熟悉。感谢版主分享的教程了。
这个帖子里面做的就是驱动DHT11,读取温湿度数据,并显示在SPI接口的LCD上。
附上开发板的相关的原理图。
123.jpg

温湿度程序就在版主的帖子里面,这个就没有必要过多的去写了,因为经常使用STM32,觉得DHT11还是应该使用宏定义,这样修改起来容易一些,不至于后期忘了修改那个IO口。附上个人写个的书写方式。
#define DHT11_PORT GPIOB
#define DHT11_PIN  GPIO_Pin_10
#define RCC_Periph_DHT11_PORT RCC_APB2Periph_GPIOB
这个在网上购买一个ST7735R驱动的SPI液晶显示。
123.png

分辨率是80*160,价格比iic的oled差不多的。而且是多彩显示,性能还是不错的,也不需要向oled那样开辟一块空间来保存。直接就是16位真彩色显示。
用的模拟spi,先看看定义的IO引脚。
#define LCD_SCL_Pin GPIO_Pin_12
#define LCD_SCL_GPIO_Port GPIOB
#define LCD_SDA_Pin GPIO_Pin_13
#define LCD_SDA_GPIO_Port GPIOB
#define LCD_RST_Pin GPIO_Pin_14
#define LCD_RST_GPIO_Port GPIOB
#define LCD_RS_Pin GPIO_Pin_15
#define LCD_RS_GPIO_Port GPIOB
#define LCD_CS_Pin GPIO_Pin_0
#define LCD_CS_GPIO_Port GPIOB
#define LCD_BL_Pin GPIO_Pin_1
#define LCD_BL_GPIO_Port GPIOB
因为不需要LCD内部的数据,所以只需要配置为输出即可。对引脚的操作,也是全部采用的寄存器的操作方式。
#define        LCD_SCL_SET          LCD_SCL_GPIO_Port->BSHR=LCD_SCL_Pin
#define        LCD_SDA_SET          LCD_SDA_GPIO_Port->BSHR=LCD_SDA_Pin
#define        LCD_CS_SET          LCD_CS_GPIO_Port->BSHR=LCD_CS_Pin
#define        LCD_RS_SET          LCD_RS_GPIO_Port->BSHR=LCD_RS_Pin
#define        LCD_BL_SET          LCD_BL_GPIO_Port->BSHR=LCD_BL_Pin
#define        LCD_RST_SET          LCD_RST_GPIO_Port->BSHR=LCD_RST_Pin
//液晶控制口置0操作语句宏定义
#define        LCD_SCL_CLR          LCD_SCL_GPIO_Port->BCR=LCD_SCL_Pin
#define        LCD_SDA_CLR          LCD_SDA_GPIO_Port->BCR=LCD_SDA_Pin
#define        LCD_CS_CLR          LCD_CS_GPIO_Port->BCR=LCD_CS_Pin
#define        LCD_RST_CLR          LCD_RST_GPIO_Port->BCR=LCD_RST_Pin
#define        LCD_RS_CLR          LCD_RS_GPIO_Port->BCR=LCD_RS_Pin
#define        LCD_BL_CLR          LCD_BL_GPIO_Port->BCR=LCD_BL_Pin
因为包含了DC引脚,所以在写入数据和命令的时候需要注意。SPI写入数据就很简单了。

void  Bus_WriteData(uint8_t dt){
    unsigned char i=0;
    for(i=8; i>0; i--){
        if(dt&0x80)LCD_SDA_SET;
        else LCD_SDA_CLR;
        LCD_SCL_CLR;
        LCD_SCL_SET;
        dt<<=1;}}


这个配置LCD的代码放在这里了。如果需要颜色取反,这需要控制Lcd_WriteIndex(0x21);修改为Lcd_WriteIndex(0x20);
 Lcd_WriteIndex(0x11);//Sleep exit
    Delay_Ms (120);
    Lcd_WriteIndex(0x21);
    Lcd_WriteIndex(0xB1);
    Lcd_WriteData(0x05);
    Lcd_WriteData(0x3A);
    Lcd_WriteData(0x3A);
    Lcd_WriteIndex(0xB2);
    Lcd_WriteData(0x05);
    Lcd_WriteData(0x3A);
    Lcd_WriteData(0x3A);
    Lcd_WriteIndex(0xB3);
    Lcd_WriteData(0x05);
    Lcd_WriteData(0x3A);
    Lcd_WriteData(0x3A);
    Lcd_WriteData(0x05);
    Lcd_WriteData(0x3A);
    Lcd_WriteData(0x3A);
Lcd_WriteIndex(0xB4);
    Lcd_WriteData(0x03);
    Lcd_WriteIndex(0xC0);
    Lcd_WriteData(0x62);
    Lcd_WriteData(0x02);
    Lcd_WriteData(0x04);
    Lcd_WriteIndex(0xC1);
    Lcd_WriteData(0xC0);
    Lcd_WriteIndex(0xC2);
    Lcd_WriteData(0x0D);
    Lcd_WriteData(0x00);
    Lcd_WriteIndex(0xC3);
    Lcd_WriteData(0x8D);
    Lcd_WriteData(0x6A);
    Lcd_WriteIndex(0xC4);
    Lcd_WriteData(0x8D);
    Lcd_WriteData(0xEE);
    Lcd_WriteIndex(0xC5);  /*VCOM*/
    Lcd_WriteData(0x0E);
    Lcd_WriteIndex(0xE0);
    Lcd_WriteData(0x10);
    Lcd_WriteData(0x0E);
    Lcd_WriteData(0x02);
    Lcd_WriteData(0x03);
    Lcd_WriteData(0x0E);
    Lcd_WriteData(0x07);
    Lcd_WriteData(0x02);
    Lcd_WriteData(0x07);
    Lcd_WriteData(0x0A);
    Lcd_WriteData(0x12);
    Lcd_WriteData(0x27);
    Lcd_WriteData(0x37);
    Lcd_WriteData(0x00);
    Lcd_WriteData(0x0D);
    Lcd_WriteData(0x0E);
    Lcd_WriteData(0x10);

    Lcd_WriteIndex(0xE1);
    Lcd_WriteData(0x10);
    Lcd_WriteData(0x0E);
    Lcd_WriteData(0x03);
    Lcd_WriteData(0x03);
    Lcd_WriteData(0x0F);
    Lcd_WriteData(0x06);
    Lcd_WriteData(0x02);
    Lcd_WriteData(0x08);
    Lcd_WriteData(0x0A);
    Lcd_WriteData(0x13);
    Lcd_WriteData(0x26);
    Lcd_WriteData(0x36);
    Lcd_WriteData(0x00);
    Lcd_WriteData(0x0D);
    Lcd_WriteData(0x0E);
    Lcd_WriteData(0x10);
    Lcd_WriteIndex(0x3A);
    Lcd_WriteData(0x05);
    Lcd_WriteIndex(0x36);
    Lcd_WriteData(0x68);//C0/00/A0/60或者C8/68/A8/08,其中C A 0 6分别代表四个方向
    Lcd_WriteIndex(0x29);


然后就是怎么绘制一个点了,然后就是点动成线,线动成面了。
void DrawPoint(uint16_t x,uint16_t y,uint16_t Data){
    SetRegion(x,y,x+1,y+1);
    WriteData_16Bit(Data);}
做一个简单的样子,如图所示。
读取的温湿度数据,放在字符串里面显示即可
sprintf(s_temp,"温度:%d,湿度:%d   ",temperature,humidity);

123.png


这个就是取字模的软件。网上可以下载到。
123.jpg


还使用了一个火焰传感器用来检测火焰,并在LCD上做了一个动画。利用外部中断,检测火焰的时候,会有一个低电平触发,直接触发触发动画。如果40s内还检测到火焰,显示时间会继续延时40s。
123.jpg

火焰传感器图片

pic.gif

显示动画效果

使用特权

评论回复

相关帖子

OS0001| | 2021-8-18 16:20 | 显示全部楼层
了解更多智能硬件相关产品~请戳:【华为开发者联盟生态市场智能硬件专区https://developer.huawei.com/consumer/cn/market/prod-list?categoryIdL1=7e857be8d4b24a7e97ddf5d941b38ca1&ha_source=mkt-thirdforum】

使用特权

评论回复
robincotton| | 2022-11-5 10:34 | 显示全部楼层
CH32F103对lcd的刷新速度是多少

使用特权

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

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1025

主题

11271

帖子

24

粉丝