piątek, 24 marca 2017

Zegar na wyświetlaczu 7 segmentowym


Projekt został wykonany na mikrokontrolerze PIC i rejestrze szeregowym używanym do sterowania katodami zegara. Schemat zegara jest widoczny poniżej.


Płytkę wykonywałem i projektowałem jak najszybciej i bez zbędnych, dodatkowych elementów takich jak papier kredowy :) wystarczy gazeta. Płytka wyszła beznadziejna ale działała a to najważniejsze.




Program do mikrokontrolera pisałęm w MPLABie, też jak najszybciej i na odwał. Głównie zależało mi na tym aby działał. Do konfiguracji mikrokontrolera użyłem Microchip Code Configurator.

Miałem dorzucić jeszcze zmianę jasności zależnie od oświetlenia zewnętrznego ale wyświetlacz jest wystarczająco ciemny przez nieco za duże oporniki w stosunku do jego jakości ;)

#include "mcc_generated_files/mcc.h"
unsigned int s = 0;
unsigned int m = 0;
unsigned int h = 0;
char check_flag = 1;


char digits[10];
char number[4];

void checkTime(){
    if(check_flag == 1){
    if(s > 59){ s = 0; m++; }
    if(m > 59){ m = 0; h++; }
    if(h > 23){ h = 0; m = 0; s = 0;}
    }
}
void timer_int(){
   
    s++;
    checkTime();
   
   
}
void numbersToDisplay(unsigned int value, unsigned int value2){
   
  char digit = value % 10;
  number[3] = digits[digit];
  value /= 10;
  digit = value % 10;
  number[2] = digits[digit];
  value /= 10;
 
 
  digit = value2 % 10;
  number[1] = digits[digit];
  value2 /= 10;
 
  digit = value2 % 10;
  number[0] = digits[digit];
  value2 /= 10;
 
}

void multiplex(unsigned int times){
  for(int i = 0;i < times;i++){
        ANODE4_SetHigh();
        ANODE3_SetHigh();
        ANODE2_SetHigh();
        ANODE1_SetHigh();
   
       
ANODE1_SetLow();      
LATCH_SetLow();
SPI_Exchange8bit(number[0] & 0b11111110);
LATCH_SetHigh();
__delay_ms(3);
ANODE1_SetHigh();
     

ANODE2_SetLow();      
LATCH_SetLow();
SPI_Exchange8bit(number[1]);
LATCH_SetHigh();
__delay_ms(3);
ANODE2_SetHigh();
 

ANODE3_SetLow();      
LATCH_SetLow();
SPI_Exchange8bit(number[2] );
LATCH_SetHigh();
__delay_ms(3);
ANODE3_SetHigh();
   

ANODE4_SetLow();      
LATCH_SetLow();
SPI_Exchange8bit(number[3]);
LATCH_SetHigh();
__delay_ms(3);
ANODE4_SetHigh();
   
  }
 
}
void driveLEDs(unsigned int periods_number){
        checkTime();
        numbersToDisplay(m,h);
        if(s % 2 == 1) number[2] &= 0b11111110;
        multiplex(periods_number);
   
}
void debug1(unsigned int periods_number){
        //checkTime();
        numbersToDisplay(0,88);
        if(s % 2 == 1) number[2] &= 0b11111110;
        multiplex(periods_number);
   
}
void buttons(){
   
    if(BUTTON1_GetValue() == 0){
        check_flag = 0;
       driveLEDs(5);
        m++;
        if(m > 59) m = 0;
        s = 0;
        driveLEDs(50);
       
       
       
            while(BUTTON1_GetValue() == 0){
           
                m++;
                if(m > 59) m = 0;
                driveLEDs(10);
                 s = 0;
        }
    }
   
    if(BUTTON2_GetValue() == 0){
       check_flag = 0;
       driveLEDs(10);
        h++;
        if(h > 23) h = 0;
        driveLEDs(50);
       
       
       
    }
    check_flag = 1;
}
void lightSensor(){
   
    ADC1_StartConversion(LDR);
    while(ADC1_IsConversionDone() == 0) driveLEDs(1);
    if(ADC1_GetConversionResult() < 716)
    EPWM1_LoadDutyValue(ADC1_GetConversionResult());
}
void main(void)
{
digits[0] = 0b10000001;
digits[1] = 0b11110011;
digits[2] = 0b01001001;
digits[3] = 0b01100001;
digits[4] = 0b00110011;
digits[5] = 0b00100101;
digits[6] = 0b00000101;
digits[7] = 0b11110001;
digits[8] = 0b00000001;
digits[9] = 0b00100001;
SYSTEM_Initialize();
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
TMR1_SetInterruptHandler(&timer_int);
TRISC5 = 0;
LATC5 = 0;
//EPWM1_Initialize();
LATC5 = 0;
for(int i = 0;i < 4;i++) number[i] = 0x00;
multiplex(200);
for(int i = 0;i < 4;i++) number[i] = 0xFF;
multiplex(30);
LATC5 = 0;
    while (1)
    {
        //debug1(1);
      driveLEDs(20);
     buttons();
     //lightSensor();
      // EPWM1_LoadDutyValue(100);
     
    }
}










Brak komentarzy:

Prześlij komentarz