Page117
E:\Nu_LB_Nuc140\book\small_RTOS\Small_RTOS1.12.1\small_rtos\LCD1602
参考代码:
基本函数
/* 分配信号量 */
#define LCD1602_SEM 0
#define OSLcd1602Clr(y) \
{ \
OSSemPend(LCD1602_SEM, 0); \
Lcd1602Clr(y); \
OSSemPost(LCD1602_SEM); \
}
在lcd指定位置显示一个字符串,此函数可以自动换行。
#define OSLcd1602DispStr(x, y, Data) \
{ \
OSSemPend(LCD1602_SEM, 0); \
Lcd1602DispStr((x), (y), (Data)); \
OSSemPost(LCD1602_SEM); \
}
多任务中从lcd指定地址处写多个字节数据
#define OSLcd1602LoadC(addr, dstr, no) \
{ \
OSSemPend(LCD1602_SEM, 0); \
LCMLoadC((addr), (dstr), (no)); \
OSSemPost(LCD1602_SEM); \
}
任务A 在液晶第一行闪动字符串“Small RTOS”
void LcdDisplay1(void)
{
OSSemCreate(LCD1602_SEM, 1);
while (1)
{
OSLcd1602Clr(1); // 第一行清屏
OSWait(K_TMO, OS_TICKS_PER_SEC / 2); // 延时0.5S
OSLcd1602DispStr(4, 1, "Small RTOS"); // 第一行显示" Hello,World! "
OSWait(K_TMO, (OS_TICKS_PER_SEC + 1) / 2); // 延时0.5S
}
}
任务B 在液晶第二行 依次 显示三个字符串
char xdata LogoStr[] = " Hello,World! Guang Zhou ZLG Chenmingji Down it from www.zlgmcu.com";
void LcdDisplay2(void)
{
uint8 *cp;
cp = LogoStr;
while(1)
{
OSLcd1602Clr(2); // 第二行清屏
OSLcd1602DispStr(1, 2, cp); // 显示字符串
OSWait(K_TMO, OS_TICKS_PER_SEC / 4); // 延时0.25S
cp++;
if (*cp == '\0')
{
cp = LogoStr;
}
}
}
(稍后补充)