#申请原创#
近期申请了RISC-V MCU CH32V103 评估板,准备试试CH32V103 。因为STM32F103C8T6的价格基本上是翻倍了,平时做一些东西感觉成本太高了,同样性能的CH32V103 相对来说,价格就便宜了很多。看到了首届 RISC-V MCU 创新应用,有机会申请这个板子。
来看一下这个板子确实非常的不错,外设资源很多,板子还可以使用arduino的外围设备。
附上一张官网的图片吧。板子还自由下载和调试工具,分开就是一个非常棒的下载器。
以前经常使用keil的开发环境,也没有用过eclipse开发过相关的产品,这个MounRiver Studio不是很熟悉。感谢版主分享的教程了。
这个帖子里面做的就是驱动DHT11,读取温湿度数据,并显示在SPI接口的LCD上。
附上开发板的相关的原理图。
温湿度程序就在版主的帖子里面,这个就没有必要过多的去写了,因为经常使用STM32,觉得DHT11还是应该使用宏定义,这样修改起来容易一些,不至于后期忘了修改那个IO口。附上个人写个的书写方式。
#define DHT11_PORT GPIOB
#define DHT11_PIN GPIO_Pin_10
#define RCC_Periph_DHT11_PORT RCC_APB2Periph_GPIOB
这个在网上购买一个ST7735R驱动的SPI液晶显示。
分辨率是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);
这个就是取字模的软件。网上可以下载到。
还使用了一个火焰传感器用来检测火焰,并在LCD上做了一个动画。利用外部中断,检测火焰的时候,会有一个低电平触发,直接触发触发动画。如果40s内还检测到火焰,显示时间会继续延时40s。
火焰传感器图片
显示动画效果
|