【问题标题】:How to count up in binary on a board of 8 LEDs - PIC如何在 8 个 LED 板上以二进制计数 - PIC
【发布时间】:2018-12-12 18:15:07
【问题描述】:

我有这个程序,我想修改它,以便 LED 以 1Hz (1s) 的速率以二进制计数。

#include <xc.h>           

void main(void) { 
    TRISD  = 0x00;          
    PORTD  = 0x00; 
    INTCON = 0xA0;          
    OPTION_REGbits.T0CS = 0;     
    OPTION_REGbits.PSA  = 0;     
    OPTION_REGbits.PS = 7;          
    while(1);           
} 

void interrupt myISR(void) { 
    if(TMR0IF) { 
        PORTD++; 
        INTCONbits.TMR0IF = 0;  
    }
}

我知道我必须修改myISR 函数,以便PORTD 在一定数量的溢出后递增,并且需要一个合适的预加载值,但就二进制计数而言,有哪些可能的方法来去做这件事?

【问题讨论】:

  • 你没有显示中断是如何被调用的,但通常是一个具有所需周期的定时器响应。如果 1Hz 对定时器来说太慢,请使用变量在中断中计数,当时间到时,重置计数并增加端口值。尽管在一般意义上增加端口值并不明智,因为端口可能是只写的,或者因为读取端口可能会影响其行为。最好(再次通常)为 LED 模式使用变量。
  • ...至于“以二进制计数”,递增变量或寄存器正是这样做的,尽管 LED 可能具有逆逻辑。
  • @T Sijad,您的问题需要以更好的方式提出。请参阅:How to create a Minimal, Complete, and Verifiable example。涉及 Microchip 控制器的问题还需要指定您寻求答案的器件的完整部件号以及系统振荡器的频率。您可以使用超过 50 种类型的控制器。发布的代码包含一些线索,PIC16F877A 是我最好的猜测。
  • 感谢两位的回答。另外,@ Dan1138,你是对的,我以后应该更具体,但你的猜测是正确的。我正在使用那个确切的图片。
  • @T Sijad,此时您应该编辑自己的问题以改进内容。至少在开头添加 cmets,说明文件名、目标控制器、IDE 版本、编译器版本。对所需行为的描述非常有帮助。您的问题范围很窄,可以发布所有代码,包括如何设置配置字以及如何初始化系统时钟(内部振荡器或外部晶体,是否使用 PLL,等等......)

标签: c binary pic led


【解决方案1】:

如果您的 Timer 0 中断例如每 100 毫秒出现一次,则此示例可能会有所帮助:

void interrupt myISR(void) {
    static uint8_t counter = 0;

    if(TMR0IF) 
    { 
        INTCONbits.TMR0IF = 0;  
        TMR0 = RELOAD_VALUE_100MS
        counter++;
        if (counter >= 10)
        {
            counter = 0;
            PORTD++; 
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多