2013-05-01 2 views
1

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

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

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

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

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

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

Если я забыл добавить что-либо, пожалуйста, сообщите мне. Большое спасибо за любую помощь!

ответ

0

Вы должны использовать tens = num/10; вместо %.

Например, если i равно 52 при вычислении единиц y, извлеките оставшееся из деления на 10, которое равно 2. Затем вы вычитаете 2 из 52, чтобы получить 50, и выполните то же самое при вычислении десятков, что, безусловно, будет дать вам 0.