Мултиплексирани 7 сегмента с помощта на PIC16F877A с помощта на C

това е едва вторият път, когато задавам въпрос тук. Последният път беше доста полезен, така че реших да го прегледам отново, тъй като съм заседнал на друг C проект!

Само ще добавя, че повече или по-малко съм пълен n00b в C, но знам почти достатъчно, за да опитам това с минимална помощ (досега!) и не искам някой да направи това вместо мен, само за няколко указатели (без каламбур) в правилната посока.

Направих доста гугъл по тази тема, но се опитвам да не копирам и поставям код от някакъв онлайн източник, тъй като искам да се науча от този, така че се опитвам да разработя кода сам .

Какво се опитвам да направя тогава: Създадох си PIC развойна платка с два 7 сегментни дисплея с общ катод, свързани към PORTD на '877A. Свързах RB0 и RB1 към транзисторите, които включват 7-сегмента, и тествах всичко с прост код и работи добре, така че веригата няма никакви проблеми. Успях да създам програма, която брои от 0-9, което беше много елементарно и сега реших да опитам мултиплексиране и броене от 0-99. Написах някакъв код и го публикувах по-долу и бих искал да помоля някой любезно да ми посочи какво правя грешно с него. Досега имам цифрата на единиците, която брои 0-9, но цифрата на десетиците изглежда остава на 0.

Имам чувството, че пропускам нещо, но не знам какво. Вероятно също малко го усложнявам.

Опитвам се да проправя път към създаването на програма, която действа като температурен сензор, използвайки входа на термисторна потенциална делителна верига към ADC на PIC (което е действителният ми проект) и показва стойността на мултиплексиран дисплей, който всъщност не е част от проекта (трябва да използваме само една цифра, която се редува между „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;
            }
}

Ако съм забравил да добавя нещо, моля, уведомете ме. Благодаря много предварително за всяка помощ!


person Chris Lyttle    schedule 01.05.2013    source източник


Отговори (1)


Трябва да използвате tens = num / 10; вместо %.

Например, ако i е 52, докато изчислявате единици y, извлечете остатъка от деленето на 10, което е 2. След това изваждате 2 от 52, за да получите 50, и правите същото при изчисляване на десетици, което със сигурност ще ви даде 0.

person hussein banjak    schedule 01.06.2013