本帖最后由 hyx728920 于 2014-10-13 18:32 编辑
本人初学PIC,要求用PIC16F877A实现功能:
当按键三次按下,PORTD口输出的数值加1.
RA4/T0CK1接按键开关,常态高电平,按下为低电平;
D口接8个LED.
参考书上原话:要想让TMR0计三个脉冲后产生中断时间,TMR0值应该为(0~3),因为TMR0是加计数器,每一个有效信号加1,当从0xff再加1时才会引发中断。所以TMR0值应为(0~3).
为嘛TMR0的值应该为0~3,不应该是0xfd吗?
然后程序开头用个宏定义:#define TMR0_RELOAD (0-3) 这个怎么理解?????? 主要是这个宏定义不理解!!!!!!
程序中说TMR0初始值为0,怎么可能呢?可是运行的时候通过watch窗口查看TMR0初始值为0xfd啊?????
程序如下:
// 每按3次K1使变量加一
#include <pic.h>
#define TMR0_RELOAD (0-3) // 因为此值会多次用到,为了方便统一修改所以用宏定义实现
__CONFIG(DEBUG_ON & LVP_OFF & WDTE_OFF & FOSC_XT);
unsigned char g_Counter=0;
void interrupt ISR(void)
{
if(T0IE && T0IF)
{
T0IF=0;// 清空标志位,使CPU能正确响应下次中断
TMR0=TMR0_RELOAD; // 每次三击事件的预设值
g_Counter++; // 中断中只做逻辑和简单运算。
}
}
main()
{
T0CS=1; // 选择T0CKI/RA4信号为时钟源
PSA=1; // 预分频器给TIMER0用 这里应该是WDT吧~~~!!!!
TMR0=TMR0_RELOAD; //初值为0, 中断244.14次为1秒。 初始值怎么是0呢??????????
T0IF=0;
T0IE=1;
GIE=1;
TRISD=0;
while(1) // 主循环必须是死循环
{
PORTD=g_Counter; // 复杂的控制流程都应该在主程序中实现
}
}
|