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

это всего лишь второй раз, когда я задаю вопрос здесь. В прошлый раз было очень полезно, поэтому я подумал, что вернусь, так как я застрял в другом проекте C!

Я просто добавлю, что я более или менее полный ноль в C, но знаю почти достаточно, чтобы попытаться это сделать с минимальной помощью (до сих пор!), И я не прошу кого-то сделать это для меня, только для нескольких указатели (без каламбура) в правильном направлении.

Я немного погуглил по этой теме, но я изо всех сил стараюсь не просто копировать и вставлять код из какого-то онлайн-источника, поскольку я хочу учиться на этом, поэтому я пытаюсь разработать код самостоятельно. .

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

У меня такое чувство, что я что-то упускаю, но не знаю что. Я, наверное, тоже немного усложняю.

Я пытаюсь работать над созданием программы, которая действует как датчик температуры, используя вход схемы термисторного делителя потенциала для АЦП 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