27,374
社区成员
发帖
与我相关
我的任务
分享
//-----------------------------------------------------------------------------
// TITLE :8PB513B TMR0 INT program
// PATTERN :0
// REVISION :1.00.000
// AUTHOR :Hu_cy
// COMPANY :Feeling-tech
// DATE :2015/05/27
// CHIP :8PB513B
// CONFIG :Fosc:IRC1M, OSCO:IOB4, WDT:Disable, OSCD:2T, IOB3OD:Enable, Other: don't care
//-----------------------------------------------------------------------------
//--------------Program Credit History-----------------------------------------
//2015/05/28 Transfer to C lange
//-----------------------------------------------------------------------------
// Pin define
// 1 IOA0 Output low
// 2 IOB7 Output low
// 3 IOB6 Output low
// 4 VDD Power
// 5 IOB5/OSCI TMR0 interrupt toggle output pin (toggle width is 1mS)
// 6 IOB4/OSCO Output low
// 7 IOB3/RSTB Output low
// 8 IOB2/T0CKI Output low
// 9 IOB1 Output low
// 10 IOB0/INT Output low
// 11 VSS Output low
// 12 IOA3 Output low
// 13 IOA2 Output low
// 14 IOA1 Output low
//--------------Include files Segment------------------------------------------
#include <8PB53B.h>
//--------------Function define segment----------------------------------------
//--------------Global or Other define segment---------------------------------
int step = 0; // 步数
int delay = 0; // 延时
//--------------Vaule segment--------------------------------------------------
// 定时计算方法,时钟1M,时钟分率2(在刻录参数中设置),定时分率2(在软件中设置)
// 计数值7(软件中设置,计算得6,可能考虑设置定时需要一定时间加1,实际计数是减1,
// 在这个数的基础上,每个计数周期加1,到256时产生中断并重新计数,设为7时计数249)
// 1M / 2 / 2 / (256-6) = 1000
#define EQ_1mS_value 0x07 //Timer 1mS delay value
//--------------Program segment------------------------------------------------
void main(void)
{
//PORTA=0x00;
PORTB=0x00;
//IOSTA=0x00;
IOSTB=0x00; //Configure Port A & B to output
PCON=0x1F; //Disable WDT, LVDT & External INT
CLRWDT(); //Recommended clear watchdog first!!(If Watchdog enabled)
OPTION=0x00; //Configure Prescal to Timer & ratio= 1:2
TMR0=EQ_1mS_value; //Set TIMER0 1mS value to count
INTEN=0x81; //Enable TMR0 & Global interrupt
while(1); //Wait timer interrupt
}
void interrupt HW_isr(void) @ HWINT_BASE
{
if(INTFLAGbits.T0IF != 1)
{
INTFLAG=0x00; //error, undefine interrupt, clean all flags
return;
}
TMR0=EQ_1mS_value;
//PORTB^=0x20; //Make interrupt toggle on IOB5 pin
INTFLAG=0xFE; //Clear T0IF Flag(Not recommed INTFLAGbits.T0IF=0;)
++delay;
switch(step)
{
// 因为IOB3和IOB4只有低电位和开路状态,没有高电位状态,所以外围电路设计成
// 低电平有效,8PB513B只有6位输出,0B00111110表示第1位有效。
case 0:
PORTB = 0B00111110; // 第1步,第1位置位
if(delay < 1000) // 延时1000ms
return;
break;
case 1:
PORTB = 0B00111101; // 第2步,第2位置位
if(delay < 2500) // 延时500ms
return;
break;
case 2:
PORTB = 0B00111011; // 第3步,第3位置位
if(delay < 1000) // 延时1000ms
return;
break;
case 3:
PORTB = 0B00110111; // 第4步,第4位置位
if(delay < 500) // 延时500ms
return;
break;
case 4:
PORTB = 0B00101111; // 第5步,第5位置位
if(delay < 1000) // 延时1000ms
return;
break;
default:
PORTB = 0B00011111; // 最后一步,第6位置位
if(delay < 500) // 延时500ms
return;
step = -1; // 置为-1,下面再加1变为0,执行第一步
break;
}
delay = 0;
step++;
}