使用C使用PIC16F877A复用7段

时间:2013-05-01 22:32:03

标签: pic mplab multiplexing

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

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

我已经在谷歌搜索了这个主题,但我正在努力不要只是复制和粘贴来自某些在线资源的代码,因为我想从这个中学习,所以我正在努力开发我自己编码。

我正在尝试做什么: 我自己制作了一块PIC开发板,其中两个共用的阴极7段显示器连接到'877A的PORTD。我已经将RB0和RB1连接到开启7个segs的晶体管,并用简单的代码测试了一切,它工作正常,因此电路完全没有问题。我已经设法创建一个从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;
            }
}

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

1 个答案:

答案 0 :(得分:0)

您应该使用tens = num / 10;代替%

例如,如果在计算单位iy为52,则将除数除以10提取,其为2.然后从52中减去2得到50,并执行相同操作在计算十,这肯定会给你0。