📄 ucos.c
字号:
#include "includes.h"
#define TASK_STK_SIZE 256 /* Size of each task's stacks (# of WORDs) */
#define N_TASKS 3 /* Number of identical tasks */
extern void StartTimer(void);
OS_EVENT *AckMbox;
OS_EVENT *TxMbox;
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TaskStartStk[TASK_STK_SIZE];
void TaskStart(void *data);
void Task1(void *data); /* Function prototypes of tasks */
void Task2(void *data); /* Function prototypes of Startup task */
short counter1, counter2, counter3;
/*-------------------------------------*/
void Wr_c_l(char com);
void Wr_c_r(char com);
void Wr_d_l(char data);
void Wr_d_r(char data);
void Init_Lcd();
void Cls_Lcd();
void lcd_dsp(char lorr,char page_cnt,char line,char numx[]);
char temp,clr_page_cnt,clr_byte_cnt,page_cnt,colm_cnt;
int timercnt;
int btimer500ms, btimer1ms;
ioport unsigned port0;
ioport unsigned port1;
ioport unsigned port2;//发光二极管d1
ioport unsigned port3;//发光二极管d2
ioport unsigned port4;
ioport unsigned port5;
ioport unsigned port6;//键盘行列线
ioport unsigned port7;
ioport unsigned port8;
ioport unsigned port9;//lcd reset
ioport unsigned porta;//lcd di
ioport unsigned portb;//lcd cs1
ioport unsigned portc;//lcd cs2
ioport unsigned porte;//发光二极管d3
ioport unsigned portf;//发光二极管d4
char num0[] ={0,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00};//"0"=00H
char num1[] ={0,0x00,0x42,0x7F,0x40,0x00,0x00,0x00};//"1"=01H
char num2[] ={0,0x42,0x61,0x51,0x49,0x46,0x00,0x00};//"2"=02H
char num3[] ={0,0x21,0x41,0x45,0x4B,0x31,0x00,0x00};//"3"=03H
char num4[] ={0,0x18,0x14,0x12,0x7F,0x10,0x00,0x00};//"4"=04H
char num5[] ={0,0x27,0x45,0x45,0x45,0x39,0x00,0x00};//"5"=05H
char num6[] ={0,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00};//"6"=06H
char num7[] ={0,0x01,0x01,0x79,0x05,0x03,0x00,0x00};//"7"=07H
char num8[] ={0,0x36,0x49,0x49,0x49,0x36,0x00,0x00};//"8"=08H
char num9[] ={0,0x06,0x49,0x49,0x29,0x1E,0x00,0x00};//"9"=09H
main()
{
INIT_C54();
counter1= counter2 = counter3 = 0;
OSInit();
OSTaskCreate(TaskStart, (void *)&counter1, (void *)&TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
}
void TaskStart(void *data)
{
UBYTE x;
UBYTE y;
UBYTE err;
OS_ENTER_CRITICAL();
StartTimer(); /* install the C549 Timer */
OS_EXIT_CRITICAL();
OSTaskCreate(Task1, (void *)&counter2, (void *)&TaskStk[0][TASK_STK_SIZE - 1], 1);
OSTaskCreate(Task2, (void *)&counter3, (void *)&TaskStk[1][TASK_STK_SIZE - 1], 2);
AckMbox = OSMboxCreate((void *)0); /* Create 2 message mailboxes */
TxMbox = OSMboxCreate((void *)0);
temp = port9 ; //reset lcd
delay2();
port9 = temp ; //enable lcd
Init_Lcd(); //initialize lcd
Cls_Lcd();
for (;;) {
(*(int *)data)++;
err++;
OSTimeDly(100); /* Delay 1 clock tick */
}
}
void Task1 (void *data)
{
UBYTE err;
char txmsg;
char task1cnt=0;
txmsg = 'A';
for (;;) {
/* while (txmsg <= 'Z')
{
OSMboxPost(TxMbox, (void *)&txmsg);
OSMboxPend(AckMbox, 0, &err);
txmsg++;
}
txmsg = 'A';
(*(int *)data)++;
err++;
*/
task1cnt = (task1cnt+1)%5;
if (task1cnt==0)
lcd_dsp(0,4,1,num0);
if (task1cnt==1)
lcd_dsp(0,4,1,num1);
if (task1cnt==2)
lcd_dsp(0,4,1,num2);
if (task1cnt==3)
lcd_dsp(0,4,1,num3);
if (task1cnt==4)
lcd_dsp(0,4,1,num4);
OSTimeDly(1000);
}
}
void Task2(void *data)
{
//char *rxmsg;
//UBYTE err;
char task1cnt=0;
for (;;) {
/*rxmsg = (char *)OSMboxPend(TxMbox, 0, &err);
OSTimeDly(5);
OSMboxPost(AckMbox, (void *)1);
(*(int *)data)++;
*/
task1cnt = (task1cnt+1)%5;
if (task1cnt==0)
lcd_dsp(1,4,1,num0);
if (task1cnt==1)
lcd_dsp(1,4,1,num1);
if (task1cnt==2)
lcd_dsp(1,4,1,num2);
if (task1cnt==3)
lcd_dsp(1,4,1,num3);
if (task1cnt==4)
lcd_dsp(1,4,1,num4);
OSTimeDly(2000);
}
}
void lcd_dsp(char lorr,char page_cnt,char line,char numx[]){
char clr_byte_cnt;
page_cnt = (page_cnt - 1) | 0xb8;
line = (line-1)*8 + 0x40 ;
if (lorr==0){
Wr_c_l(page_cnt);
Wr_c_l(line);
for(clr_byte_cnt=1;clr_byte_cnt<=8;clr_byte_cnt++){
Wr_d_l(numx[clr_byte_cnt-1]);
}
}
else{
Wr_c_r(page_cnt);
Wr_c_r(line);
for(clr_byte_cnt=1;clr_byte_cnt<=8;clr_byte_cnt++){
Wr_d_r(numx[clr_byte_cnt-1]);
}
}
}
void Wr_c_r(char com){ //写指令
char temp;
temp = portb ; //clr cs1
portc = temp ; //clr cs2
porta = 0x0 ; //di = 0
temp = port8 & 0x80; //读状态字
delay1();
while (temp == 0x80){
temp = port8 & 0x80;
delay1();
}
port8 = com ;
delay1();
}
void Wr_c_l(char com){
char temp;
portb = temp ; //clr cs1
temp = portc ;
porta = 0x0 ; //di = 0
temp = port8 & 0x80; //读状态字
delay1();
while (temp == 0x80){
temp = port8 & 0x80;
delay1();
}
port8 = com ;
delay1();
}
void Wr_d_r(char data){ //写数据
char temp;
temp = portb; //clr cs1
portc = temp ; //clr cs2
porta = 0x0 ; //di = 0
temp = port8 & 0x80; //读状态字
delay1();
while (temp == 0x80){
temp = port8 & 0x80;
delay1();
}
porta = 0x1 ;
port8 = data ;
delay1();
}
void Wr_d_l(char data){
char temp;
portb = temp ; //clr cs1
temp = portc ; //clr cs2
porta = 0x0 ; //di = 0
temp = port8 & 0x80; //读状态字
delay1();
while (temp == 0x80){
temp = port8 & 0x80;
delay1();
}
porta = 0x1 ;
port8 = data ;
delay1();
}
void Init_Lcd(){
Wr_c_l(0xc0);
Wr_c_r(0xc0);
Wr_c_l(0x3f);
Wr_c_r(0x3f);
}
void Cls_Lcd(){
for(clr_page_cnt=1;clr_page_cnt<=8;clr_page_cnt++){
page_cnt = (clr_page_cnt - 1) | 0xb8;
Wr_c_l(page_cnt);
Wr_c_r(page_cnt);
Wr_c_l(0x40);
Wr_c_r(0x40);
for (clr_byte_cnt=1;clr_byte_cnt<=64;clr_byte_cnt++){
Wr_d_l(0x0);
Wr_d_r(0x0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -