unsigned int Delay; unsigned int Period; char RunMe; }sTask; sTask SCH_Tasks[MAX_TASKS]; char SCH_Delete_Taskconst unsigned char Index; void SCH_Initvoid; void interrupt SCH_Updatevoid;
Trang 1Đèn Giao Thông
/*
* File: newmain.c
* Author:
*
* Created on April 13, 2015,
*/
//den giao thong tai nga tu:
//dung pic16f877a thach anh 4MH
//led 7 doan anot
//thoi gian den do 15s, den xanh 12s, den vang 3s
#include <htc.h>
CONFIG(WDTDIS&PWRTEN&UNPROTECT&BORDIS&LVPDIS);
#define _XTAL_FREQ 4000000
int chuc_dec,donvi_dec,chuc_hex,donvi_hex,dem,count=16000; int chuc_dec1,donvi_dec1,chuc_hex1,donvi_hex1,dem1,count1=16000;
#define MAX_TASKS 7
#define DO1 RC0
#define XANH1 RC1
#define VANG1 RC2
#define DO2 RC3
#define XANH2 RC4
#define VANG2 RC5
typedef struct _sTask
{
void (*pTask)(void);
Trang 2unsigned int Delay;
unsigned int Period;
char RunMe;
}sTask;
sTask SCH_Tasks[MAX_TASKS];
char SCH_Delete_Task(const unsigned char Index); void SCH_Init(void);
void interrupt SCH_Update(void);
char SCH_Add_Task(void (*pFn)(void),
unsigned int delay,
unsigned int period);
void SCH_Dispatch_Tasks(void);
void SCH_Start(void);
//
void init_port();
void tach_so(int dem,int dem1);
void dec_to_hex();
void quetled_7doan();
//
void Task_T1(void);
void Task_T2(void);
void Task_T3(void);
void Task_T4(void);
void Task_T5(void);
Trang 3void main(void)
{
init_port();
TRISC = 0;
SCH_Init();
SCH_Add_Task(Task_T1,0,30000);
SCH_Add_Task(Task_T2,12000,30000);
SCH_Add_Task(Task_T3,15000,30000);
SCH_Add_Task(Task_T4,27000,30000);
SCH_Add_Task(Task_T5,0,10);
SCH_Start();
while(1)
{
SCH_Dispatch_Tasks();
}
}
char SCH_Delete_Task(const unsigned char Index) {
if(SCH_Tasks[Index].pTask==0) return -1; SCH_Tasks[Index].pTask = 0;
SCH_Tasks[Index].Delay = 0;
SCH_Tasks[Index].Period = 0;
SCH_Tasks[Index].RunMe = 0;
return 0;
}
Trang 4void SCH_Init(void)
{
unsigned char Index;
for(Index=0;Index<MAX_TASKS;Index++)
{
SCH_Delete_Task(Index);
}
OPTION = 0x02; //Prescaler 1:8
TMR0 = 256-125;
T0IF = 0;
}
void interrupt SCH_Update(void)
{
unsigned char Index;
TMR0 = 256-125;
T0IF = 0;
for(Index=0;Index<MAX_TASKS;Index++)
{
if(SCH_Tasks[Index].pTask!=0)
{
if(SCH_Tasks[Index].Delay==0)
{
SCH_Tasks[Index].RunMe = 1;
if(SCH_Tasks[Index].Period>0)
{
SCH_Tasks[Index].Delay = SCH_Tasks[Index].Period; }
Trang 5else
{
SCH_Tasks[Index].Delay ;
}
}
}
count ;
count1 ;
}
char SCH_Add_Task(void (*pFn)(void),
unsigned int delay,
unsigned int period)
{
int Index = 0;
while((SCH_Tasks[Index].pTask!=0)&&(Index<MAX_TASKS)) {
Index++;
}
if(Index==MAX_TASKS)
{
return -1;
}
SCH_Tasks[Index].pTask = pFn;
SCH_Tasks[Index].Delay = delay;
SCH_Tasks[Index].Period = period;
SCH_Tasks[Index].RunMe = 0;
return Index;
}
Trang 6void SCH_Dispatch_Tasks(void)
{
unsigned char Index;
for(Index=0;Index<MAX_TASKS;Index++)
{
if(SCH_Tasks[Index].pTask!=0 && SCH_Tasks[Index].RunMe>0) {
SCH_Tasks[Index].pTask();
SCH_Tasks[Index].RunMe = 0;
}
if(SCH_Tasks[Index].Period == 0)
{
SCH_Delete_Task(Index);
}
}
}
void SCH_Start(void)
{
T0IE = 1;
GIE = 1;
}
void Task_T1(void)
{
count=16000;
count1=13000;
Trang 7DO2=0;
XANH2=1; VANG1=0; DO1 = 1; }
void Task_T2(void) {
count1=4000; int i;
XANH2=0; VANG2=1; DO1 = 1;
}
void Task_T3(void) { count1=16000; count=13000; int i;
DO1=0;
XANH1=1; VANG2=0; DO2=1;
}
void Task_T4(void) {
count=4000;
Trang 8int i;
VANG1=1;
XANH1=0;
DO2 = 1;
}
void Task_T5(void)
{
dem=count/1000;;
dem1=count1/1000;
tach_so(dem,dem1);
dec_to_hex();
quetled_7doan();
}
void init_port()
{
TRISB=0X00;
PORTB=0X00;
TRISD=0X00;
PORTD=0X00;
}
void tach_so(int dem,int dem1) {
chuc_dec=dem/10;
donvi_dec=dem%10;
chuc_dec1=dem1/10;
donvi_dec1=dem1%10;
Trang 9void dec_to_hex()
{
int i;
const unsigned char a[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; i=chuc_dec;
chuc_hex=a[i];
i=donvi_dec;
donvi_hex=a[i];
i=chuc_dec1;
chuc_hex1=a[i];
i=donvi_dec1;
donvi_hex1=a[i];
}
void quetled_7doan()
{
unsigned char a[4];
int mabandau,i;
a[3]=chuc_hex;
a[2]=donvi_hex;
a[1]=chuc_hex1;
a[0]=donvi_hex1;
mabandau = 0b00000001;
for (i=0;i<=3;i++)
{
PORTB = mabandau;
PORTD = a[i];
Trang 10delay_ms(1);
PORTB = 0X00; //SAU KHI DELAY DE MAT NHIN THAY ROI XOA DE TAT,
//NEU KO XOA THI TIEP TUC CHUONG TRINH SE QUET QUA 7SEG KHAC NHUNG // CHUA DUA MANG VAO NEN LED 7SG THU 2 SE CO KI TU GIONG LED 7SEG THU1 mabandau = mabandau<<1;
}
}