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

📄 ex1.c

📁 keil下单片机C8051F020的源程序
💻 C
字号:
#include <includes.h>
#include <cygnalcon.h>
#include "intrins.h"



void TaskA(void*) reentrant;
void TaskB(void*) reentrant;
void TaskC(void*) reentrant;
void TaskD(void*) reentrant;

OS_STK TaskStartStkA[MaxStkSize];//注意:在ASM文件中设置?STACK空间为40H即64。
OS_STK TaskStartStkB[MaxStkSize];
OS_STK TaskStartStkC[MaxStkSize];
OS_STK TaskStartStkD[MaxStkSize];

INT8U xdata LED[6]={0,0,0,0,0,0};

void ch451_write(unsigned int command);
void delay1ms(unsigned char x) reentrant;
void delay1us(unsigned char y) reentrant;

sbit CLK   = P3^0;
sbit DIN   = P3^1;
sbit LOAD  = P3^2;
sbit DOUT  = P3^3;

sbit KEY0  = P2^0;
sbit KEY1  = P2^1;
sbit KEY2  = P2^2;

sbit OSWTM = P3^4;//osw translate master
sbit OSWTS = P3^5;//osw translate Protect
sbit OSWRM = P3^6;//osw receive master
sbit OSWRS = P3^7;//osw receive Protect
#define SwitchToMasterT		OSWTM=1;OSWTS=0;//OSW_T  打到主线路 东   东主
#define SwitchToMasterR		OSWRM=1;OSWRS=0;//OSW_R  打到主线路 西   西主
#define SwitchToProtectT	OSWTM=0;OSWTS=1;//OSW_T  打到备线路 东	 东旁  
#define SwitchToProtectR	OSWRM=0;OSWRS=1;//OSW_R  打到备线路 西   西旁

/*************************************************************************
            数码管函数 define
*************************************************************************/
#define CH451_RESET     0x0201             //复位
#define CH451_LEFTMOV   0x0300             //设置移动方式-作移
#define CH451_LEFTCYC   0x0301             //设置移动方式-左循
#define CH451_RIGHTMOV  0x0302             //设置移动方式-右移
#define CH451_RIGHTCYC  0x0303             //设置移动方式-右循 
#define CH451_SYSOFF    0x0400             //关显示、键盘、看门狗
#define CH451_SYSON1    0x0401             //开显示
#define CH451_SYSON2    0x0403             //开显示、键盘
#define CH451_SYSON3    0x0407             //开显示、键盘、看门狗功能
#define CH451_DSP       0x0500             //设置默认显示方式
#define CH451_BCD       0x0580             //设置BCD译码方式
#define CH451_TWINKLE   0x0600             //设置闪烁控制
#define CH451_DIG0      0x0800             //数码管位0显示
#define CH451_DIG1      0x0900             //数码管位1显示 
#define CH451_DIG2      0x0a00             //数码管位2显示
#define CH451_DIG3      0x0b00             //数码管位3显示
#define CH451_DIG4      0x0c00             //数码管位4显示
#define CH451_DIG5      0x0d00             //数码管位5显示 
#define CH451_DIG6      0x0e00             //数码管位6显示 
#define CH451_DIG7      0x0f00             //数码管位7显示

void main(void)
{				
	config();

    OSInit(); 
    
    ch451_write(CH451_RESET);    //复位
  	ch451_write(CH451_SYSON1);	 //开显示
 	ch451_write(CH451_DSP);		 //设置默认显示方式
  	ch451_write(CH451_BCD);		 //设置BCD译码方式
    
    OSTaskCreate(TaskA, (void *)0, TaskStartStkA,2);
    OSTaskCreate(TaskB, (void *)0, TaskStartStkB,3);
    OSTaskCreate(TaskC, (void *)0, TaskStartStkC,4);
	OSTaskCreate(TaskD, (void *)0, TaskStartStkD,5);     
	InitTimer0();
    OSStart();
	
}


void TaskA(void *pdat) reentrant
	{

    	pdat=pdat;

   	 	for(;;){
				INT8U sz=0;
				INT8U d[10]={63,6,91,79,102,109,124,7,127,103};
				//for( sz=0;sz<10;sz++)
				//	{
					//	P3=d[sz];
					   LED[0]=LED[0]+1;
					   if(LED[0]>=10)LED[0]=0;
					   ch451_write(CH451_DIG0+LED[0]);
			//	       ch451_write(CH451_DIG1+LED[1]);
			//	       ch451_write(CH451_DIG2+LED[2]);
			 		   if(OSWTM==0)
					   {
					   delay1ms(200);
					   delay1ms(200);
					   delay1ms(200);
					   delay1ms(200);
					   delay1ms(200);
					   SwitchToMasterT
					   SwitchToMasterR
					   }											
					   OSTimeDly(2*OS_TICKS_PER_SEC); 

				//	}
	 	
    			}    
	}

void TaskB(void *pdat) reentrant
	{
    	pdat=pdat; 
    	
    	for(;;){

				//P1=~P1;
					   LED[1]=LED[1]+1; 
					   if(LED[1]>=10)LED[1]=0;
				//	   ch451_write(CH451_DIG0+LED[0]);
				       ch451_write(CH451_DIG1+LED[1]);
				//     ch451_write(CH451_DIG2+LED[2]);
				       if(OSWTM==1)
					   {
					   delay1ms(200);
					   delay1ms(200);
					   delay1ms(200);
					   delay1ms(200);
					   delay1ms(200);
					   SwitchToProtectT
					   SwitchToProtectR
					   }  
    			       OSTimeDly(2*OS_TICKS_PER_SEC); 
 
    			}    
	}

void TaskC(void *pdat) reentrant
	{
    	pdat=pdat; 

    	for(;;){

				LED[2]=LED[2]+1;
			    if(LED[2]>=10)LED[2]=0;
				ch451_write(CH451_DIG2+LED[2]);
        		OSTimeDly(2*OS_TICKS_PER_SEC);    
    			}    
	}

void TaskD(void *pdat) reentrant
	{	

		INT8U sx;
		INT8U e[10]={103,127,7,124,109,102,79,91,6,63};

   		pdat=pdat;
   
 		for(;;){
			
				for( sx=0;sx<10;sx++)
					{
						P2=e[sx];
						OSTimeDly(3*OS_TICKS_PER_SEC);
					}
			 			
    			}
   
	}

void ch451_write(unsigned int command)
{
   unsigned char i;
   LOAD=0; //命令开始 
   delay1us(10);
   for(i=0;i<12;i++ )
   { //送入12位数据,低位在前
      DIN=command&0x01; 
      CLK=0;
      command>>=1;
      CLK=1; //上升沿有效
   delay1us(2);
   }
   LOAD=1; //加载数据
}

void delay1ms(unsigned char x) reentrant
{
	unsigned char xdata delayk;
	unsigned int xdata delayi;
	for(delayk=0;delayk<x;delayk++)
	for(delayi=0;delayi<335;delayi++)//1ms
	{
		 delayi++;
		 delayi--;
	}
}

void delay1us(unsigned char y) reentrant
{
    unsigned int xdata delayj;
	for(delayj=0;delayj<y;delayj++){
//		delayj++;delayj--;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -