在温控过程中,为了能更好地了解控制器的工作状态,可以为其添加一个波形显示功能,见图1所示。
其使用的显示屏为2.2寸的TFT屏,显示分辨率为320*240像素点,以SPI接口的方式工作。图1 波形显示型微控器
该显示屏与开发板的连接关系为:
SCL---PB12
SDA---PB13
RST---PB14
DC ---PB15
CS ---PB9
BL ---VDD
其引脚输出高低电平的语句定义为:
#define LCD_SCK_High() GPIO_WriteBit(GPIOB, GPIO_PIN_12, 1u) //CLK
#define LCD_SCK_Low() GPIO_WriteBit(GPIOB, GPIO_PIN_12, 0u)
#define LCD_SDI_High() GPIO_WriteBit(GPIOB, GPIO_PIN_13, 1u) //DIN
#define LCD_SDI_Low() GPIO_WriteBit(GPIOB, GPIO_PIN_13, 0u)
#define LCD_REST_High() GPIO_WriteBit(GPIOB, GPIO_PIN_14, 1u) //RES
#define LCD_REST_Low() GPIO_WriteBit(GPIOB, GPIO_PIN_14, 0u)
#define LCD_DC_High() GPIO_WriteBit(GPIOB, GPIO_PIN_9, 1u) //DC
#define LCD_DC_Low() GPIO_WriteBit(GPIOB, GPIO_PIN_9, 0u)
#define LCD_CS_High() GPIO_WriteBit(GPIOB, GPIO_PIN_15, 1u) //CS
#define LCD_CS_Low() GPIO_WriteBit(GPIOB, GPIO_PIN_15, 0u)
相应的引脚功能配置函数为:
void tft_app(void){ gpio_init.Pins = GPIO_PIN_9|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; gpio_init.PinMode = GPIO_PinMode_Out_PushPull; gpio_init.Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio_init); GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_15); }
复制代码该显示屏的初始化函数为:
void tft_Init(void){ LCD_REST_Low(); app_delay(40); LCD_REST_High(); app_delay(40); LCD_CS_Low(); LCD_WR_REG(0xCB); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x34); LCD_WR_DATA8(0x02); LCD_WR_REG(0xCF); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0XC1); LCD_WR_DATA8(0X30); LCD_WR_REG(0xE8); LCD_WR_DATA8(0x85); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x78); LCD_WR_REG(0xEA); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); LCD_WR_REG(0xED); LCD_WR_DATA8(0x64); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0X12); LCD_WR_DATA8(0X81); LCD_WR_REG(0xF7); LCD_WR_DATA8(0x20); LCD_WR_REG(0xC0); LCD_WR_DATA8(0x23); LCD_WR_REG(0xC1); LCD_WR_DATA8(0x10); LCD_WR_REG(0xC5); LCD_WR_DATA8(0x3e); LCD_WR_DATA8(0x28); LCD_WR_REG(0xC7); LCD_WR_DATA8(0x86); LCD_WR_REG(0x36); LCD_WR_DATA8(0x48); LCD_WR_REG(0x3A); LCD_WR_DATA8(0x55); LCD_WR_REG(0xB1); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x18); LCD_WR_REG(0xB6); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x82); LCD_WR_DATA8(0x27); LCD_WR_REG(0xF2); LCD_WR_DATA8(0x00); LCD_WR_REG(0x26); LCD_WR_DATA8(0x01); LCD_WR_REG(0xE0); LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x31); LCD_WR_DATA8(0x2B); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x0E); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x4E); LCD_WR_DATA8(0xF1); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x10); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x0E); LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x00); LCD_WR_REG(0XE1); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x0E); LCD_WR_DATA8(0x14); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x31); LCD_WR_DATA8(0xC1); LCD_WR_DATA8(0x48); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x31); LCD_WR_DATA8(0x36); LCD_WR_DATA8(0x0F); LCD_WR_REG(0x11); app_delay(200); LCD_WR_REG(0x29); LCD_WR_REG(0x2c); }
复制代码为了实现波形的绘制,其绘制直线的函数为:
void LCD_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2){ unsigned int 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++ ) { LCD_DrawPoint(uRow,uCol); xerr+=delta_x ; yerr+=delta_y ; if(xerr>distance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } }
复制代码为了进行参数设置和工作状态指示,还用到了板载的LED和KEY,其电路见图2所示。
图2 LED与KEY电路
其中,黄色的LD3用于指示热能释放状态,蓝色的LD2用于指示加热状态。
为此,LED灯的引脚配置函数为:
void Init_led(void){ gpio_init.Pins = GPIO_PIN_11; gpio_init.PinMode = GPIO_PinMode_Out_PushPull; gpio_init.Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio_init); GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_15); gpio_init.Pins = GPIO_PIN_0; gpio_init.PinMode = GPIO_PinMode_Out_PushPull; gpio_init.Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &gpio_init); GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_0); GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u); GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u); }
复制代码实现整体设计功能的主程序为:
int main(void){ uint32_t i,f,m; float u,p,V; BOARD_Init(); tft_app(); tft_Init(); LCD_Clear(YELLOW); app_delay(200); BACK_COLOR=YELLOW; POINT_COLOR=RED; LCD_ShowString(80,30,"EVB-L0136 & NTC"); show_tb(60,20,0); POINT_COLOR=RED; LCD_ShowString(50,80,"ADC: mV"); LCD_ShowString(50,100,"Temp: C"); LCD_ShowString(150,80,"time: "); LCD_ShowString(150,100,"Max: C"); POINT_COLOR=RED; LCD_DrawLine(20, 300, 230, 300); LCD_DrawLine(20, 300, 20, 100); LCD_DrawLine(16, 270, 20, 270); LCD_DrawLine(16, 240, 20, 240); LCD_DrawLine(16, 210, 20, 210); LCD_DrawLine(16, 180, 20, 180); LCD_DrawLine(16, 150, 20, 150); f=1; Init_key(); Init_led(); POINT_COLOR=BLUE; i=0; while (f) { if(GPIO_ReadInDataBit(GPIOB, GPIO_PIN_2)==1) i=i-1; // K1 if(GPIO_ReadInDataBit(GPIOD, GPIO_PIN_5)==0) i=(i+1)%3300; // K2 if(GPIO_ReadInDataBit(GPIOA, GPIO_PIN_8)==0) i=(i*10)%3300; // K3 if(GPIO_ReadInDataBit(GPIOB, GPIO_PIN_5)==0) f=0; // K4 LCD_ShowNum(180,100,i,3); app_delay(20); } m=i; app_adc_init(); p=0; i=0; V=0; while (1) { u=(unsigned)(app_adc_run_conv() & 0xFFF); u=3300*u/4095; LCD_ShowNum(82,80,u,4); LCD_ShowNum(190,80,i,3); ... if((u<=1644)&&(u>1268)) V=10+(1644-u)/37; if((u<=1268)&&(u>947)) V=20+(1268-u)/32; if((u<=947)&&(u>692)) V=30+(947-u)/25; ... LCD_ShowNum(90,100,V,3); LCD_DrawLine(20+i*4, 300-(p*3), 24+i*4,300-(V*3)); p=V; i=i+1; if(i>48) { LCD_Fill(21,120,219,299,YELLOW); i=0; p=0; } if(V<m) { GPIO_WriteBit(GPIOB, GPIO_PIN_11, 0u); GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u); app_delay(200); } else { GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u); GPIO_WriteBit(GPIOC, GPIO_PIN_0, 0u); } app_delay(200); } }
复制代码经程序的编译下载,其运行效果如图3和图4所示。
其中图3是控制器处于室温状态,用于其低于设定值20度,故蓝色指示灯被点亮。
图4则是微控器处于室温后的热能释放状态,故黄色指示灯被点亮。
图3 室温状态检测
图4 热释放状态