【正点原子阿波罗STM32F429IGT开发板试用体验】+ LCD打印

  • apleilx
  • LV5工程师
  • |      2017-11-20 09:32:57
  • 浏览量 991
  • 回复:0
这两天点了下液晶屏,手上只有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的话,删除掉互斥锁就可以了。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子