Загрузка данных
#include <SI_C8051F960_Register_Enums.h>
#define LED_DISPLAY_PORT P3
#define DATABUS_PORT P6
sbit D_FLIP_FLOP_CLK = P3^6;
unsigned char led_display[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char digit_count = 0;
unsigned int current_number = 0;
unsigned int saved_number = 0;
unsigned char last_active_r = 0xFF;
unsigned char last_active_c = 0xFF;
unsigned char pozycja = 0xFE;
unsigned char index = 0;
unsigned char keyboard_counter = 0;
unsigned char temp_val = 0xFF;
unsigned char code key_values[4][4] = {
{7, 8, 9, 15},
{4, 5, 6, 14},
{1, 2, 3, 13},
{0, 10, 11, 12}
};
unsigned char code key_codes[4][4] = {
{0x07, 0x7F, 0x6F, 0x71},
{0x66, 0x6D, 0x7D, 0x79},
{0x06, 0x5B, 0x4F, 0x5E},
{0x3F, 0x77, 0x7C, 0x39}
};
void SiLabs_Startup (void)
{
SFRPAGE = LEGACY_PAGE;
PCA0MD &= ~0x40;
PCA0MD = 0x00;
return;
}
void PORT_Init (void)
{
SFRPAGE = CONFIG_PAGE;
XBR2 = 0x40;
return;
}
void Timer3_Init(void)
{
SFRPAGE = LEGACY_PAGE;
TMR3CN = 0x04;
TMR3RLL = 0x00;
TMR3RLH = 0xFF;
EIE1 |= 0x80;
SFRPAGE = CONFIG_PAGE;
return;
}
void Timer0_Init(void)
{
SFRPAGE = LEGACY_PAGE;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = (char)((65535-5000)>>8);
TL0 = (char)((65535-5000)>>0);
TCON |= 0x10;
IE |= 0x02;
SFRPAGE = CONFIG_PAGE;
return;
}
void LatchDataBusValue(unsigned char DataBusValue)
{
unsigned char old_SFRPAGE = SFRPAGE;
char i = 0;
SFRPAGE = CONFIG_PAGE;
DATABUS_PORT = DataBusValue;
D_FLIP_FLOP_CLK = 0;
for (i = 0; i < 2; i++);
D_FLIP_FLOP_CLK = 1;
SFRPAGE = old_SFRPAGE;
return;
}
int main (void)
{
PORT_Init();
Timer3_Init();
Timer0_Init();
LED_DISPLAY_PORT = pozycja;
SFRPAGE = CONFIG_PAGE;
P4 = ~(1 << 4) | 0x0F;
IE_EA = 1;
while (1) {}
}
SI_INTERRUPT(TIMER0_ISR, TIMER0_IRQn)
{
char old_SFRPAGE = SFRPAGE;
static unsigned char matrix_state[4] = {0x0F, 0x0F, 0x0F, 0x0F};
SFRPAGE = LEGACY_PAGE;
TH0 = (char)((65535-5000)>>8);
TL0 = (char)((65535-5000)>>0);
SFRPAGE = CONFIG_PAGE;
matrix_state[keyboard_counter] = P4 & 0x0F;
keyboard_counter++;
if (keyboard_counter >= 4)
{
unsigned char active_r = 0xFF;
unsigned char active_c = 0xFF;
char r;
keyboard_counter = 0;
for (r = 0; r < 4; r++) {
if ((matrix_state[r] & 0x01) == 0) { active_r = r; active_c = 0; break; }
if ((matrix_state[r] & 0x02) == 0) { active_r = r; active_c = 1; break; }
if ((matrix_state[r] & 0x04) == 0) { active_r = r; active_c = 2; break; }
if ((matrix_state[r] & 0x08) == 0) { active_r = r; active_c = 3; break; }
}
if (active_r != 0xFF) {
if (active_r != last_active_r || active_c != last_active_c) {
unsigned char val = key_values[active_r][active_c];
if (val <= 9) {
if (digit_count >= 4) {
digit_count = 0;
current_number = 0;
led_display[0] = 0x00;
led_display[1] = 0x00;
led_display[2] = 0x00;
led_display[3] = 0x00;
led_display[4] = 0x00;
led_display[5] = 0x00;
}
led_display[digit_count] = key_codes[active_r][active_c];
current_number = current_number * 10 + val;
digit_count++;
}
else if (val == 13) {
saved_number = current_number;
led_display[5] = 0x08;
digit_count = 4;
}
}
}
last_active_r = active_r;
last_active_c = active_c;
}
P4 = ~(1 << (keyboard_counter + 4)) | 0x0F;
SFRPAGE = old_SFRPAGE;
}
SI_INTERRUPT(TIMER3_ISR, TIMER3_IRQn)
{
unsigned char old_SFRPAGE = SFRPAGE;
SFRPAGE = LEGACY_PAGE;
TMR3CN &= 0x7F;
SFRPAGE = CONFIG_PAGE;
LatchDataBusValue(0x00);
LED_DISPLAY_PORT = pozycja;
LatchDataBusValue(led_display[index]);
index++;
pozycja = pozycja << 1;
pozycja |= 1;
if (index > 5) {
pozycja = 0xFE;
index = 0;
}
SFRPAGE = old_SFRPAGE;
}