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


//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <SI_C8051F960_Register_Enums.h>

#define LED_DISPLAY_PORT  P3
#define DATABUS_PORT      P6

// Bool types in SFR memory space
sbit  D_FLIP_FLOP_CLK = P3^6;     // U4 clk input

// Global variables definitions
unsigned char DisplayPortValue = 0xFE;
unsigned char current_digit = 0;
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 code key_values[4][4] = {
    {7, 8, 9, 15}, 
    {4, 5, 6, 14}, 
    {1, 2, 3, 13}, 
    {0, 10, 11, 12}  
};



unsigned char led_display[6] = {0x00, 0x00, 0x00, 0x00,0x00,0x00};

unsigned char pozycja = 0xFE;
unsigned char index = 0;
unsigned char keyboard_counter = 0;
unsigned char temp_val = 0xFF;


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;      // Switch SFRPAGE
    PCA0MD &= ~0x40;            // Disable watchdog timer
    PCA0MD  = 0x00;             // Disable watchdog timer
    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;
}

//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
int main (void)
{
   PORT_Init();
   Timer3_Init();
   Timer0_Init();

   LED_DISPLAY_PORT = DisplayPortValue;


   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) {

            led_display[0] = key_codes[active_r][active_c];
        }


    }



    P4 = ~(1 << (keyboard_counter + 4)) | 0x0F;

    SFRPAGE = old_SFRPAGE;
    return;
}

SI_INTERRUPT(TIMER3_ISR, TIMER3_IRQn)
{
    unsigned char old_SFRPAGE;

    old_SFRPAGE = SFRPAGE;
    SFRPAGE = LEGACY_PAGE;
    TMR3CN &= 0x7F;                        // Clear interrupt flag
    SFRPAGE   = CONFIG_PAGE;               // Switch SFRPAGE to CONFIG PAGE

        LatchDataBusValue(0x00);
        LED_DISPLAY_PORT = pozycja;

       LatchDataBusValue(led_display[index]);
       index ++;
       pozycja = pozycja << 1;
       pozycja |= 1;
       if (index > 4) {
           pozycja = 0xFE;
           index = 0;
       }

    SFRPAGE = old_SFRPAGE;                 // Restore SFR
    return;
}