📄 ext2.c
字号:
/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
**
** V1.20.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: ext1.c
**创 建 人: 陈明计
**最后修改日期: 2003年8月3日
**描 述: ext1源代码。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: V0.50
** 日 期: 2002年2月22日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.11.0
** 日 期: 2003年12月2日
** 描 述: 删除TaskD代码
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.12.0
** 日 期: 2003年12月2日
** 描 述: 无变化
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.20.0
** 日 期: 2003年8月3日
** 描 述: 根据新版本要求修改
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: Crossmind http://www.ednchina.com/Blog/crossmind/
** 日 期: 2008-3-22
** 描 述: Protues 7.2 + EDNCHINA 51仿真板
** 功能描述:
** EX2: 创建3个任务,分别向LCD随机位置写入字符"A","B","C"
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#define BIT0 1
#define BIT1 2
#define BIT2 4
#define BIT3 8
#define BIT4 16
#define BIT5 32
#define BIT6 64
#define BIT7 128
void TaskA(void);
void TaskB(void);
void TaskC(void);
/******************************************************
** 函数名称: LCD LM016L 驱动函数
P0 LCD BUS
P10 RS
P11 RW
P12 E
******************************************************/
sbit LcdEn = P1^2;
sbit LcdRw = P1^1;
sbit LcdRs = P1^0;
#define DBPort P0
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
//设置显示模式
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
//设置输入模式
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
//内部等待函数
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//将字符输出到液晶显示
void PrintXY(unsigned char x, unsigned char y,unsigned char *str)
{
GotoXY(x,y);
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
void main(void)
{
OSInit();
//系统节拍中断使用定时器2,中断频率为100Hz,晶振12MHz
TMOD = (TMOD & 0XF0) | 0X01;
TH0 = (65536 - (12000000 / 12) / 100) / 256;
TL0 = (65536 - (12000000 / 12) / 100) % 256;
TR0 = 1;
ET0 = 1;
//创建3个任务,分别闪烁三个LED
LCD_Initial();
OSTaskCreate(TaskA, NULL, 0);
OSTaskCreate(TaskB, NULL, 1);
OSTaskCreate(TaskC, NULL, 2);
while(1)
{
PCON = PCON | 0x01; /* CPU进入休眠状态 */
}
}
void TaskA(void)
{
unsigned char x,y;
while (1)
{
x = (unsigned char)rand(); //用随机数发生函数产生随机位置X,Y
if(x>128)
y=1;
else
y=0;
x = x%16;
PrintXY(x,y,"A"); //打印字符A
OSWait(K_TMO,OS_TICKS_PER_SEC/5);
}
}
void TaskB(void)
{
unsigned char x, y;
while (1)
{
x = (unsigned char)rand();
if(x>128)
y=1;
else
y=0;
x = x%16;
PrintXY(x,y,"B"); //打印字符B
OSWait(K_TMO,OS_TICKS_PER_SEC/3);
}
}
void TaskC(void)
{
unsigned char x,y;
while (1)
{
x = (unsigned char)rand();
if(x>128)
y=1;
else
y=0;
x = x%16;
PrintXY(x,y,"C"); ////打印字符C
OSWait(K_TMO,OS_TICKS_PER_SEC/2);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -