标题:
(开源)基于KST51单片机开发板的数码管与LED小灯同时显示
[打印本页]
作者:
海阔天空2015
时间:
2015-7-24 17:50
标题:
(开源)基于KST51单片机开发板的数码管与LED小灯同时显示
还是上次那个程序小改而成!还同时参考了作者的书
说实话,要是自己编的话还不如作者自己的程序好
自己只是在作者的基础上进行小修小补,但个人觉得这是程序积累的好方法,从不知从何入手到有点头绪
还参考了一些程序架构的思想,还是不错,个人很有成就感!
这个开发板的难度与其它的开发板的区别主要是集成度很高,对实际开发很有参考的价值
引脚复用的情况很多,这就得在编程上面下心思!
自认为想要达到作者的水平还有很多的路要走!!!
其中的最后一个函数是自已弄的,其实自己到现在用指针还是有点不知怎么用
单片机开发板电路图:
http://www.51hei.com/f/ks51.pdf
/*****************************
*PROJECT:LED与数码管同时显示
*方式:数码管1S时间加一的同时LED以0.2秒的时间进行闪烁
*根据操作系统思想使用时间片轮询法实现LED轮流闪烁
*DATE:2015-7-22
*操作平台:KST51
*LED与数码管共用一个IO口P0,对软件编程的要求更高
LED与数码管位选与段选同时由P0与P1口时行控制,选择使用了138与245芯片时行驱动!
这也是难点所在!
*/
#include <reg52.h>
#define uChar unsigned char
#define uInt unsigned int
//CONFIG
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
uChar InDex = 0;
uChar code LedChar[] = {
0xc0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0X86, 0X8E
};
/*uChar LedBuff[7] = {
0XFF,0XFF,0XFF, 0XFF ,0xFF,0XFF, 0XFF
};*/
struct sLedBuff { //LED显示缓冲区结构
unsigned char number[6];
unsigned char alone;
};
void LedScan(void);
void LedOn(void);
void LedOff(void);
void LedRefush(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_SCAN,
TAST_LED_ON,
TAST_LED_OFF,
TAST_LED_REFUSH,
TASKS_MAX // import
}TASK_LIST;
static TASK_COMPONENTS TaskComps[] =
{
{0,2,2,LedScan}, //LEDSCAN
{0,100,100,LedOn}, // LED on
{0,100,100,LedOff}, //LED OFF
{0,1000,1000,LedRefush},
};
struct sLedBuff ledBuff;
/********************************************
*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;
TMOD = 0X01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
EA = 1;
// LED1 = 1;
// LED2 = 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)
{
ledBuff.alone = 0xFE;
}
/********************************************
*FunctionName :void LedOff()
*Description :LED开启与关闭
*EntryParameter :None
*RetrunValue :None
*********************************************/
void LedOff(void)
{
ledBuff.alone = 0xFF;
}
/********************************************
*FunctionName :void LedScan()
*Description :数码管扫描程序
*EntryParameter :None
*RetrunValue :None
*********************************************/
void LedScan(void)
{
static uChar i = 0;
P0 = 0xFF;
P1 = (P1 & 0XF8) | i;
P0 = *((uChar data *) &ledBuff +i);
if(i < sizeof(ledBuff) - 1)
i++;
else
i = 0;
}
/********************************************
*FunctionName :void LedRefush()
*Description :数码管更新程序
*EntryParameter :None
*RetrunValue :None
*********************************************/
void LedRefush(void)
{
static uChar i;
static uChar j;
for(j = InDex + 1; j < (sizeof(ledBuff.number)); j++)
{
//没有必要显示的数码管不显示
ledBuff.number[j] = 0xFF;
}
ledBuff.number[InDex] = (*(&LedChar +i));//其实不知怎么用的但改了一下就好了
if(i < 9) //判断是否大于9,如果大于九,则将其归零!
i++; //如果是i<10则还要再加一次,达不到加九归0的效梗←
else
i =0;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1