这两天点了下液晶屏,手上只有1块2.8寸的屏接口和板子是一致的,加上屏调试方便多了。驱动程序可以用cube选择sram配置成lcd模式自动生成,或者直接拿例程里面的lcd.c用,cube生成的代码不改参数的话信号频率很低,刷屏很慢。
板子的USB转UART连接电脑端软件的时候总是发生MCU复位,必须在调试前先连好打开软件建立连接才行,有些不太方便。现在把printf的出口改到LCD上,虽然窗口小了点,不过也足够用了。
主要就是改造fputc函数,我的屏是320*240的,横向显示。下面看代码:
#include "osObjects.h"
#include "pincfg.h"
#include "lcd.h"
#include "dataproc.h"
#include "rtctime.h"
uint16_t PutsCnt = 0;
#define FONT_SIZE 16 //字体高度
#define ROW_SIZE 14 //屏幕字符总行数
#define PUT_START_LINE 6 //显示区域起始行
#define LINE_SIZE 40 //每行字符个数
OBJ_EXT OS_MUTEX MutexObjLcd;
/*****************************************************************************//*!
*
* @brief lcd task.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void LcdCtrTask(void *argument)
{
OS_ERR os_err;
CPU_TS cpu_ts;
u8 lcd_id;
OSMutexCreate (&MutexObjLcd, "MUTEX_IIC", &os_err);
LCD_Init();
LCD_Display_Dir(1);
LCD_Scan_Dir(0);
sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
LCD_Clear(LIGHTBLUE);
for(;;){
OSTimeDly (500, OS_OPT_TIME_DLY, &os_err);
POINT_COLOR=RED;
BACK_COLOR=LIGHTBLUE;
OSMutexPend (&MutexObjLcd, 500, OS_OPT_PEND_BLOCKING, &cpu_ts, &os_err);
LCD_ShowString(10,8,300,24,24,"What a lovely day !");
LCD_ShowString(10,36,300,24,24,"Hellow, where are you ?");
LCD_ShowString(10,60,240,16,16,lcd_id);
TimeToAscii(&TimeCur,lcd_buff);
LCD_ShowString(10,80,240,12,12,lcd_buff);
OSMutexPost (&MutexObjLcd, OS_OPT_POST_NONE, &os_err);
}
}
/*****************************************************************************//*!
*
* @brief remap printf to lcd.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
int fputc(int ch, FILE *f)
{
OS_ERR os_err;
CPU_TS cpu_ts;
OSMutexPend (&MutexObjLcd, 500, OS_OPT_PEND_BLOCKING, &cpu_ts, &os_err);
if(PutsCnt >= ((ROW_SIZE - PUT_START_LINE) * LINE_SIZE))
{
//清屏
LCD_Fill(0, PUT_START_LINE * 16, 319, 239, LIGHTBLUE);
PutsCnt = 0;
}
if((ch>0x19) && (ch < 0x80))
{
LCD_ShowChar((PutsCnt%LINE_SIZE)*FONT_SIZE/2,(PutsCnt/LINE_SIZE)*FONT_SIZE + PUT_START_LINE*FONT_SIZE,ch,FONT_SIZE,0);
PutsCnt++;
}
else if('\n' == (uint8_t)ch)
{
PutsCnt -= PutsCnt % LINE_SIZE;
PutsCnt+=LINE_SIZE;
}
else
{
}
OSMutexPost (&MutexObjLcd, OS_OPT_POST_NONE, &os_err);
return ch;
}
上面的代码作为一个UCOS任务运行,没有OS的话,删除掉互斥锁就可以了。
这两天点了下液晶屏,手上只有1块2.8寸的屏接口和板子是一致的,加上屏调试方便多了。驱动程序可以用cube选择sram配置成lcd模式自动生成,或者直接拿例程里面的lcd.c用,cube生成的代码不改参数的话信号频率很低,刷屏很慢。
板子的USB转UART连接电脑端软件的时候总是发生MCU复位,必须在调试前先连好打开软件建立连接才行,有些不太方便。现在把printf的出口改到LCD上,虽然窗口小了点,不过也足够用了。
主要就是改造fputc函数,我的屏是320*240的,横向显示。下面看代码:
#include "osObjects.h"
#include "pincfg.h"
#include "lcd.h"
#include "dataproc.h"
#include "rtctime.h"
uint16_t PutsCnt = 0;
#define FONT_SIZE 16 //字体高度
#define ROW_SIZE 14 //屏幕字符总行数
#define PUT_START_LINE 6 //显示区域起始行
#define LINE_SIZE 40 //每行字符个数
OBJ_EXT OS_MUTEX MutexObjLcd;
/*****************************************************************************//*!
*
* @brief lcd task.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void LcdCtrTask(void *argument)
{
OS_ERR os_err;
CPU_TS cpu_ts;
u8 lcd_id;
OSMutexCreate (&MutexObjLcd, "MUTEX_IIC", &os_err);
LCD_Init();
LCD_Display_Dir(1);
LCD_Scan_Dir(0);
sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
LCD_Clear(LIGHTBLUE);
for(;;){
OSTimeDly (500, OS_OPT_TIME_DLY, &os_err);
POINT_COLOR=RED;
BACK_COLOR=LIGHTBLUE;
OSMutexPend (&MutexObjLcd, 500, OS_OPT_PEND_BLOCKING, &cpu_ts, &os_err);
LCD_ShowString(10,8,300,24,24,"What a lovely day !");
LCD_ShowString(10,36,300,24,24,"Hellow, where are you ?");
LCD_ShowString(10,60,240,16,16,lcd_id);
TimeToAscii(&TimeCur,lcd_buff);
LCD_ShowString(10,80,240,12,12,lcd_buff);
OSMutexPost (&MutexObjLcd, OS_OPT_POST_NONE, &os_err);
}
}
/*****************************************************************************//*!
*
* @brief remap printf to lcd.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
int fputc(int ch, FILE *f)
{
OS_ERR os_err;
CPU_TS cpu_ts;
OSMutexPend (&MutexObjLcd, 500, OS_OPT_PEND_BLOCKING, &cpu_ts, &os_err);
if(PutsCnt >= ((ROW_SIZE - PUT_START_LINE) * LINE_SIZE))
{
//清屏
LCD_Fill(0, PUT_START_LINE * 16, 319, 239, LIGHTBLUE);
PutsCnt = 0;
}
if((ch>0x19) && (ch < 0x80))
{
LCD_ShowChar((PutsCnt%LINE_SIZE)*FONT_SIZE/2,(PutsCnt/LINE_SIZE)*FONT_SIZE + PUT_START_LINE*FONT_SIZE,ch,FONT_SIZE,0);
PutsCnt++;
}
else if('\n' == (uint8_t)ch)
{
PutsCnt -= PutsCnt % LINE_SIZE;
PutsCnt+=LINE_SIZE;
}
else
{
}
OSMutexPost (&MutexObjLcd, OS_OPT_POST_NONE, &os_err);
return ch;
}
上面的代码作为一个UCOS任务运行,没有OS的话,删除掉互斥锁就可以了。