📄 timer.c
字号:
#include <string.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
void Timer0Done(void);
void Timer1Done(void);
void Timer2Done(void);
void Timer3Done(void);
void Timer4Done(void);
void Timer5Done(void);
unsigned char leddata;
unsigned char * ledbuffer = (unsigned char *)led_Address;
/****************************************
* PWM Timer TOUT0/1/2/3/4 test *
****************************************/
void Test_Timer(void)
{
int save_E,save_PE;
save_E=rPCONE;
save_PE=rPUPE;
rPCONE=0xa6a8; //Tout0/1/2/3/4, RxD0, TxD0
rPUPE |=0xf8;
Uart_Printf("[Timer 0,1,2,3,4,5 Test]\n");
Uart_Printf("Check PWM Output\n");
Uart_Printf("MCLK=%dHz TIMER CLK=%dHz\n",MCLK,MCLK/4);
Uart_Printf("TCNTBn=1000(PWM frequency=%dHz)\n",MCLK/4000);
Uart_Printf("To exit PWM test mode, Press any key!!!\n");
// T0/1/2/3/4
rTCFG0=0x1010101; // Prescaler0/1/2=1, Deadzone=1
rTCFG1=0x0; // Interrupt, Devider=1/2
// Timer clock = (MCLK/1)/2
rTCNTB0=1000;
rTCNTB1=1000;
rTCNTB2=1000; // Total cont=1000
rTCNTB3=1000;
rTCNTB4=1000;
rTCMPB0=1000-700;
rTCMPB1=1000-700;
rTCMPB2=1000-700; // L_count:700, H_count:300
rTCMPB3=1000-700;
rTCMPB4=1000-700;
rTCON=0xaaaa0a; //auto reload, inverter off, manual update, dead zone off
rTCON=0x999909; //start PWM operation
Uart_Getch();
rTCON=0x0; //Stop timer
rPCONE=save_E;
rPUPE=save_PE;
}
unsigned char variable0,variable1,variable2,variable3,variable4,variable5;
/****************************************
* PWM Timer Interrupt0/1/2/3/4/5 test *
****************************************/
void Test_TimerInt(void)
{
variable0=0;
variable1=0;
variable2=0;
variable3=0;
variable4=0;
variable5=0;
rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
pISR_TIMER0=(int)Timer0Done;
pISR_TIMER1=(int)Timer1Done;
pISR_TIMER2=(int)Timer2Done;
pISR_TIMER3=(int)Timer3Done;
pISR_TIMER4=(int)Timer4Done;
pISR_TIMER5=(int)Timer5Done;
Uart_Printf("[Timer0/1/2/3/4/5 Interrupt Test]\n");
Uart_Printf("[8-SEG flash at different speed\n");
*ledbuffer=0xff;
rTCFG0=0xfafafa; //dead zone=0,pre2=0xfa,pre1=0xfa,pre0=0xfa
rTCFG1=0x112344; //all interrupt,mux5=1/4,mux4=1/4,mux3=1/8,mux2=1/16,mux1=1/32,mux0=1/32
rTCNTB0=0x9c40; //(1/(40MHz/250/32))*0xffff=8s
rTCNTB1=0x7530; //(1/(40MHz/250/32))*0xffff=6s
rTCNTB2=0x9c40; //(1/(40MHz/250/16 ))*0xffff=4s
rTCNTB3=0x9c40; //(1/(40MHz/250/8 ))*0xffff=2s
rTCNTB4=0x9c40; //(1/(40MHz/250/4 ))*0xffff=1s
rTCNTB5=0x9c40; //(1/(40MHz/250/4 ))*0xffff=1s
rTCON=0x2222202; //update T5/T4/T3/T2/T1/T0
rTCON=0x5999909; //T5/T4/T3/T2/T1=auto reload,T0=one shot,all_start
while(!Uart_GetKey());
rTCON=0x0; //all_stop
rINTMSK=(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
}
void Timer0Done(void)
{
rI_ISPC=BIT_TIMER0; //clear pending_bit
if(variable0==0)
{
variable0=1;
leddata&=0x7f;
*ledbuffer=leddata;}
else
{
variable0=0;
leddata|=0x80;
*ledbuffer=leddata;}
}
void Timer1Done(void)
{
rI_ISPC=BIT_TIMER1; //clear pending_bit
if(variable1==0)
{
variable1=1;
leddata&=0xbe;
*ledbuffer=leddata;}
else
{
variable1=0;
leddata|=0x41;
*ledbuffer=leddata;}
}
void Timer2Done(void)
{
rI_ISPC=BIT_TIMER2; //clear pending_bit
if(variable2==0)
{
variable2=1;
leddata&=0xfd;
*ledbuffer=leddata;}
else
{
variable2=0;
leddata|=0x2;
*ledbuffer=leddata;}
}
void Timer3Done(void)
{
rI_ISPC=BIT_TIMER3; //clear pending_bit
if(variable3==0)
{
variable3=1;
leddata&=0xdb;
*ledbuffer=leddata;}
else
{
variable3=0;
leddata|=0x24;
*ledbuffer=leddata;}
}
void Timer4Done(void)
{
rI_ISPC=BIT_TIMER4; //clear pending_bit
if(variable4==0)
{
variable4=1;
leddata&=0xf7;
*ledbuffer=leddata;}
else
{
variable4=0;
leddata|=0x8;
*ledbuffer=leddata;}
}
void Timer5Done(void)
{
rI_ISPC=BIT_TIMER5; //clear pending_bit
if(variable5==0)
{
variable5=1;
leddata&=0xef;
*ledbuffer=leddata;}
else
{
variable5=0;
leddata|=0x10;
*ledbuffer=leddata;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -