Загрузка данных


#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;                 
}