打印
[PIC®/AVR®/dsPIC®产品]

PIC计数器 #define TMR0_RELOAD (0-3)

[复制链接]
999|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hyx728920|  楼主 | 2014-10-13 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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; // 复杂的控制流程都应该在主程序中实现
   }
}

沙发
yklstudent| | 2014-10-13 19:13 | 只看该作者
昏,是0-3,不是0~3
这两者的区别看不懂???

使用特权

评论回复
板凳
hyx728920|  楼主 | 2014-10-13 19:24 | 只看该作者
yklstudent 发表于 2014-10-13 19:13
昏,是0-3,不是0~3
这两者的区别看不懂???

书上这么写的 我是按原话摘录的~~~:'(   -3补码就是0xfd了~~~~!!!!!!

使用特权

评论回复
地板
hyx728920|  楼主 | 2014-10-13 19:25 | 只看该作者
yklstudent 发表于 2014-10-13 19:13
昏,是0-3,不是0~3
这两者的区别看不懂???

买的这本书 错误好多 有没有什么好书推荐呢~嘿嘿

使用特权

评论回复
5
yklstudent| | 2014-10-13 19:29 | 只看该作者
对不起,都是官网看的手册
没发给你推荐什么书

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝