Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 112 → Rev 113

/Classwork/ECE4534 - Embedded Systems/PIC 26J11/led_driver.c
0,0 → 1,159
#include "maindefs.h"
#include "led_driver.h"
#include "delays.h"
#include <spi.h>
 
unsigned int led_last_value;
 
#ifdef _SPI2_V1
/* Output Pins:
* RA0 - LED Display Latch Enable (PPS)
* RA1 - LED Display CLK (PPS)
* RA2 - LED Display DIN (PPS)
* RA3 - LED Display Output Enable (PPS)
*/
#endif
 
#ifdef _SPI2_V2
/* Output Pins:
* RA0 - LED Display CLK (PPS)
* RA1 - LED Display DIN (PPS)
* RA2 - LED Display Latch Enable (PPS)
* RA3 - LED Display Output Enable (PPS)
*/
#endif
 
void led_driver_init() {
#ifdef _SPI2_V1
TRISAbits.TRISA0 = 0; // LE
TRISAbits.TRISA1 = 0; // CLK
TRISAbits.TRISA2 = 0; // DAT
TRISAbits.TRISA3 = 0; // OE
LATAbits.LATA0 = 0; // LE
LATAbits.LATA1 = 0; // CLK
LATAbits.LATA2 = 0; // DAT
LATAbits.LATA3 = 0; // OE
#endif
 
#ifdef _SPI2_V2
RPOR0 = 10; // CLK
RPOR1 = 9; // DATA
OpenSPI2(SPI_FOSC_4, MODE_00, SMPMID);
#endif
 
led_last_value = 0;
led_driver_data(0);
led_driver_data(0);
}
 
#ifdef _SPI2_V1
void led_driver_clock() {
LATAbits.LATA1 = 0x1; // Simple clock output toggle
Nop();
LATAbits.LATA1 = 0x0;
Nop();
}
#endif
 
void led_driver_data(char val) {
#ifdef _SPI2_V1
int i;
LATAbits.LATA0 = 0x0; // Set latch low to pause display
for (i = 0; i < 8; i++) {
LATAbits.LATA2 = val & 0x1; // Shift out bits
led_driver_clock();
val >>= 1;
}
LATAbits.LATA0 = 0x1; // Set latch high to resume display
#endif
 
#ifdef _SPI2_V2
LATAbits.LATA0 = 0x0;
WriteSPI2(val);
LATAbits.LATA0 = 0x1;
#endif
}
 
void led_driver_num(unsigned char data) {
unsigned char tmp = 0;
led_last_value = 0;
// Determine right character (1s digit)
tmp = data % 10;
switch (tmp) {
case 0:
led_last_value |= 0x0D70;
break;
case 1:
led_last_value |= 0x0140;
break;
case 2:
led_last_value |= 0x0E60;
break;
case 3:
led_last_value |= 0x0760;
break;
case 4:
led_last_value |= 0x0350;
break;
case 5:
led_last_value |= 0x0730;
break;
case 6:
led_last_value |= 0x0F30;
break;
case 7:
led_last_value |= 0x0170;
break;
case 8:
led_last_value |= 0x0F70;
break;
case 9:
led_last_value |= 0x0770;
break;
}
 
// Determine left character (10s digit)
tmp = data / 10;
switch (tmp) {
case 0:
led_last_value |= 0xE00D;
break;
case 1:
led_last_value |= 0x2008;
break;
case 2:
led_last_value |= 0xC00E;
break;
case 3:
led_last_value |= 0x600E;
break;
case 4:
led_last_value |= 0x200B;
break;
case 5:
led_last_value |= 0x6007;
break;
case 6:
led_last_value |= 0xE007;
break;
case 7:
led_last_value |= 0x200D;
break;
case 8:
led_last_value |= 0xE00F;
break;
case 9:
led_last_value |= 0x600F;
break;
}
 
led_driver_data(led_last_value & 0x00FF);
led_driver_data((led_last_value & 0xFF00) >> 8);
}
 
void led_driver_show_last() {
led_driver_data(led_last_value & 0x00FF);
led_driver_data((led_last_value & 0xFF00) >> 8);
}