[RISC-V MCU 创新应用比赛] CH32F103驱动LCD

[复制链接]
4558|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口。附上个人写个的书写方式。
  1. #define DHT11_PORT GPIOB
  2. #define DHT11_PIN  GPIO_Pin_10
  3. #define RCC_Periph_DHT11_PORT RCC_APB2Periph_GPIOB
这个在网上购买一个ST7735R驱动的SPI液晶显示。
123.png

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

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


这个配置LCD的代码放在这里了。如果需要颜色取反,这需要控制Lcd_WriteIndex(0x21);修改为Lcd_WriteIndex(0x20);
  1. Lcd_WriteIndex(0x11);//Sleep exit
  2.     Delay_Ms (120);
  3.     Lcd_WriteIndex(0x21);
  4.     Lcd_WriteIndex(0xB1);
  5.     Lcd_WriteData(0x05);
  6.     Lcd_WriteData(0x3A);
  7.     Lcd_WriteData(0x3A);
  8.     Lcd_WriteIndex(0xB2);
  9.     Lcd_WriteData(0x05);
  10.     Lcd_WriteData(0x3A);
  11.     Lcd_WriteData(0x3A);
  12.     Lcd_WriteIndex(0xB3);
  13.     Lcd_WriteData(0x05);
  14.     Lcd_WriteData(0x3A);
  15.     Lcd_WriteData(0x3A);
  16.     Lcd_WriteData(0x05);
  17.     Lcd_WriteData(0x3A);
  18.     Lcd_WriteData(0x3A);
  19. Lcd_WriteIndex(0xB4);
  20.     Lcd_WriteData(0x03);
  21.     Lcd_WriteIndex(0xC0);
  22.     Lcd_WriteData(0x62);
  23.     Lcd_WriteData(0x02);
  24.     Lcd_WriteData(0x04);
  25.     Lcd_WriteIndex(0xC1);
  26.     Lcd_WriteData(0xC0);
  27.     Lcd_WriteIndex(0xC2);
  28.     Lcd_WriteData(0x0D);
  29.     Lcd_WriteData(0x00);
  30.     Lcd_WriteIndex(0xC3);
  31.     Lcd_WriteData(0x8D);
  32.     Lcd_WriteData(0x6A);
  33.     Lcd_WriteIndex(0xC4);
  34.     Lcd_WriteData(0x8D);
  35.     Lcd_WriteData(0xEE);
  36.     Lcd_WriteIndex(0xC5);  /*VCOM*/
  37.     Lcd_WriteData(0x0E);
  38.     Lcd_WriteIndex(0xE0);
  39.     Lcd_WriteData(0x10);
  40.     Lcd_WriteData(0x0E);
  41.     Lcd_WriteData(0x02);
  42.     Lcd_WriteData(0x03);
  43.     Lcd_WriteData(0x0E);
  44.     Lcd_WriteData(0x07);
  45.     Lcd_WriteData(0x02);
  46.     Lcd_WriteData(0x07);
  47.     Lcd_WriteData(0x0A);
  48.     Lcd_WriteData(0x12);
  49.     Lcd_WriteData(0x27);
  50.     Lcd_WriteData(0x37);
  51.     Lcd_WriteData(0x00);
  52.     Lcd_WriteData(0x0D);
  53.     Lcd_WriteData(0x0E);
  54.     Lcd_WriteData(0x10);

  55.     Lcd_WriteIndex(0xE1);
  56.     Lcd_WriteData(0x10);
  57.     Lcd_WriteData(0x0E);
  58.     Lcd_WriteData(0x03);
  59.     Lcd_WriteData(0x03);
  60.     Lcd_WriteData(0x0F);
  61.     Lcd_WriteData(0x06);
  62.     Lcd_WriteData(0x02);
  63.     Lcd_WriteData(0x08);
  64.     Lcd_WriteData(0x0A);
  65.     Lcd_WriteData(0x13);
  66.     Lcd_WriteData(0x26);
  67.     Lcd_WriteData(0x36);
  68.     Lcd_WriteData(0x00);
  69.     Lcd_WriteData(0x0D);
  70.     Lcd_WriteData(0x0E);
  71.     Lcd_WriteData(0x10);
  72.     Lcd_WriteIndex(0x3A);
  73.     Lcd_WriteData(0x05);
  74.     Lcd_WriteIndex(0x36);
  75.     Lcd_WriteData(0x68);//C0/00/A0/60或者C8/68/A8/08,其中C A 0 6分别代表四个方向
  76.     Lcd_WriteIndex(0x29);


然后就是怎么绘制一个点了,然后就是点动成线,线动成面了。
  1. void DrawPoint(uint16_t x,uint16_t y,uint16_t Data){
  2.     SetRegion(x,y,x+1,y+1);
  3.     WriteData_16Bit(Data);}
做一个简单的样子,如图所示。
读取的温湿度数据,放在字符串里面显示即可
  1. 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的刷新速度是多少
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1205

主题

11937

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部