1

这只是我第二次在这里提出问题。上次非常有帮助,所以我想我会重新访问,因为我被困在另一个 C 项目上!

我只是补充一点,我或多或少是 C 的总 n00b,但知道几乎足以在最少的帮助下尝试这个(直到现在!)而且我不是要求有人为我做这件事,只是为了几个指向正确方向的指针(没有双关语)。

我已经在这个主题上进行了相当多的谷歌搜索,但我正在尽力不只是从一些在线资源中复制和粘贴代码,因为我想从中学习,所以我正在尝试自己开发代码.

然后我要做的是:我已经为自己构建了一个 PIC 开发板,其中两个共阴极 7 段显示器连接到 '877A 的 PORTD。我已将 RB0 和 RB1 连接到打开 7 段的晶体管,并用简单的代码测试了所有内容,它工作正常,因此电路完全没有问题。我设法创建了一个从 0-9 计数的程序,这是非常基本的,我现在决定尝试多路复用并从 0-99 计数。我已经编写了一些代码并将其发布在下面,我想请人向我指出我做错了什么。到目前为止,我的个位数是 0-9,但十位数字似乎停留在 0。

我有一种感觉,我遗漏了一些东西,但我不知道是什么。我可能也有点过于复杂了。

我正在尝试制作一个用作温度传感器的程序,该程序使用热敏电阻分压器电路输入到 PIC 的 ADC(这是我的实际项目)并在多路复用显示器上显示该值实际上不是项目的一部分(我们只应该使用在“2”和“5”和“C”之间交替的一位数字“25C”等),但我想更进一步,所以我我试图开发这个改进版本。

无论如何,这已经够我胡说八道了,我将代码粘贴进去,希望有人能提供帮助。

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config CP = OFF, DEBUG = OFF, PWRTE = OFF
#pragma config CPD = OFF, LVP = OFF
#pragma config BOREN = OFF, WRT = OFF
#pragma config WDTE = OFF, FOSC = HS

#define _XTAL_FREQ 8000000

void segments (int digits);

int main(int argc, char** argv) {
    TRISD = 0x00;      //creates an output
    TRISB = 0x00;
    PORTD = 0x00;      //sends zeros to all bits of port D
    PORTB = 0x00;
    int i,j,num,tens,units,digits;
    do {
        for (i=0;i<100;i++)
        {
            units=i%10;     //extract units digit
            num=i-units;    //takes units away leaving multiple of 10
            tens=num%10;    //extract tens digit
            for(j=0;j<20;j++)    //should display each ten and unit for 200ms
            {
                RB0=1;          //switch on units segment
                RB1=0;
                digits=units;
                segments(digits);
                __delay_ms (5);
                RB0=0;
                RB1=1;
                digits=tens;
                segments(digits);
                __delay_ms (5);
            }
        }
        }while (1);         //do while runs forever 
    return (EXIT_SUCCESS);
}

void segments (int digits)
{
    switch (digits)
            {
                case 0:
                PORTD=0x3F;       //zero
                break;
                case 1:
                PORTD=0x06;       //one
                break;
                case 2:
                PORTD=0x5B;       //two
                break;
                case 3:
                PORTD=0x4F;       //three
                break;
                case 4:
                PORTD=0x66;       //four
                break;
                case 5:
                PORTD=0x6D;       //five
                break;
                case 6:
                PORTD=0x7D;       //six
                break;
                case 7:
                PORTD=0x07;       //seven
                break;
                case 8:
                PORTD=0x7F;       //eight
                break;
                case 9:
                PORTD=0x6F;       //nine
                break;
            }
}

如果我忘记添加任何内容,请告诉我。非常感谢您的帮助!

4

1 回答 1

0

您应该使用tens = num / 10;而不是%.

例如,如果i在计算单位时是 52 y,则从除以 10 中提取剩余部分,即为 2。然后从 52 中减去 2 得到 50,并在计算十位时做同样的事情,这肯定会给你 0。

于 2013-06-01T18:10:50.970 回答