这两天失业在家里,无聊间浏览各网站,其实想想自己的程序写的实在很乱,其实也很少写程序 的
看到一篇文章是关于程序架构的文章:“浅谈单片机应用程序架构(原创)”里面关于程序的架构思想很好,
很实用,博客的主人刘俊先生愿意将这些编程的思想与大家分享,分享构建程序的思想,值得大家学习
今天下午运用了刘俊先生的思想,做了两个LED灯轮流闪烁的思想,让两个LED灯轮流闪烁,与大家分享
也是“从业十年,手把手教你。。。。。”此文作者的思想差不多!与大家一起分享程序,和大家一起进步
在此谢谢刘俊先生的开源思想!
/*****************************
*PROJECT:LED轮流闪烁
*根据操作系统思想使用时间片轮询法实现LED轮流闪烁
*DATE:2015-7-21
*
*/
#include <reg52.h>
#define uChar unsigned char
#define uInt unsigned int
//CONFIG
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
void LedOn(void);
void LedOff(void);
void InitSys(void);//系统初始化
//1.定义一个结构体
typedef struct _TASK_COMPONENTS
{
uChar Run; //程序运行标志 0-不运行 1-运行
uInt Timer; //计时器
uInt ItvTimer; //任务运行间隔时间
void (*TaskHook)(void); //要运行的任务函数
}TASK_COMPONENTS;
typedef enum _TASK_LIST
{
TAST_LED_ON,
TAST_LED_OFF,
TASKS_MAX // import
}TASK_LIST;
static TASK_COMPONENTS TaskComps[] =
{
{0,250,250,LedOn}, // LED on
{0,250,250,LedOff}, //LED OFF
};
/********************************************
*FunctionName :TaskReMarks()
*Description :任务标志处理
*EntryParameter :None
*RetrunValue :None
*********************************************/
void TaskReMarks(void) //此函数在中断中调用
{
uChar i = 0;
for(i = 0;i < TASKS_MAX; i++)
{
if(TaskComps[ i].Timer)
{
TaskComps[ i].Timer--;
if(TaskComps[ i].Timer == 0)
{
TaskComps[ i].Timer = TaskComps[ i].ItvTimer;
TaskComps[ i].Run = 1; //任务可以运行
}
}
}
}
//3.程序处理
/**************************
FunctionName :TaskProcess()
*Description :任务标志处理
*EntryParameter :None
*RetrunValue :None
***************************/
void TaskProcess(void)
{
uChar i = 0;
for(i = 0;i < TASKS_MAX;i++)
{
if(TaskComps[ i].Run)
{
TaskComps[ i].TaskHook();
TaskComps[ i].Run = 0;
}
}
}
void main()
{
InitSys();
while(1)
{
TaskProcess();
}
}
void InitSys(void)//系统初始化
{
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0X01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void InterruptTimer0(void) interrupt 1
{
TH0 = 0xFC; //定时2MS
TL0 = 0x67;
TaskReMarks();
}
/********************************************
*FunctionName :void LedOn(void)
*Description :LED开启与关闭
*EntryParameter :None
*RetrunValue :None
*********************************************/
void LedOn(void)
{
LED1 = 0;
LED2 = 1;
}
/********************************************
*FunctionName :void LedOff()
*Description :LED开启与关闭
*EntryParameter :None
*RetrunValue :None
*********************************************/
void LedOff(void)
{
LED1 = 1;
LED2 = 0;
}
|