Đè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);
unsigned 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);
void 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;
}
void SCH_Init(void)
{
unsigned char Index;
for(Index=0;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
{
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;
}
}
else
{
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
{
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;
}
void SCH_Dispatch_Tasks(void)
{
unsigned char Index;
for(Index=0;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;
int i;
DO2=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;
int 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;
}
void 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];
__delay_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;
}
}