⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos.c

📁 该代码采用c5400dsp的汇编语言和c语言实现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 + -