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


#include <SI_C8051F960_Register_Enums.h>

#define LED_DISPLAY_PORT   P3
#define DATABUS_PORT       P6

sbit  D_FLIP_FLOP_CLK = P3^6;

unsigned char code seg_codes[10] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};

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

unsigned char pozycja = 0xFE;
unsigned char index   = 0;

unsigned char last_active_r = 0xFF;
unsigned char last_active_c = 0xFF;
unsigned char keyboard_counter = 0;

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  filter_X    = 0;
unsigned int   filter_n    = 1;
unsigned int   avg_voltage = 0;

bit            adc_ready = 0;
unsigned char  adc_raw   = 0;

unsigned int power2(unsigned char exp)
{
unsigned int result = 1;
unsigned char i;
if (exp > 7) exp = 7;
for (i = 0; i < exp; i++) result <<= 1;
return result;
}

void update_display(void)
{
unsigned int v = avg_voltage;
unsigned char d0, d1, d2;

```
if (v > 250) v = 250;

d0 = (unsigned char)(v / 100);
d1 = (unsigned char)((v % 100) / 10);
d2 = (unsigned char)(v % 10);

led_display[0] = seg_codes[filter_X];
led_display[1] = 0x00;
led_display[2] = seg_codes[d0] | 0x80;
led_display[3] = seg_codes[d1];
led_display[4] = seg_codes[d2];
led_display[5] = 0x00;
```

}

void SiLabs_Startup(void)
{
SFRPAGE = LEGACY_PAGE;
PCA0MD &= ~0x40;
PCA0MD  = 0x00;
}

void PORT_Init(void)
{
SFRPAGE = LEGACY_PAGE;
P0MDIN  = 0xFC;
P0SKIP  = 0x03;
P1MDIN  = 0xDF;
P1SKIP  = 0x20;
SFRPAGE = CONFIG_PAGE;
XBR2    = 0x40;
}

void Timer3_Init(void)
{
SFRPAGE  = LEGACY_PAGE;
TMR3CN   = 0x04;
TMR3RLL  = 0x00;
TMR3RLH  = 0xFF;
EIE1    |= 0x80;
SFRPAGE  = CONFIG_PAGE;
}

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

void Timer2_Init(void)
{
SFRPAGE  = LEGACY_PAGE;
TMR2CN   = 0x00;
CKCON   &= ~0x30;
TMR2RLL  = 0x3F;
TMR2RLH  = 0xB0;
TMR2L    = 0x3F;
TMR2H    = 0xB0;
IE      |= 0x20;
TMR2CN  |= 0x04;
SFRPAGE  = CONFIG_PAGE;
}

void ADC0_Init(void)
{
SFRPAGE = LEGACY_PAGE;
ADC0MX  = 0x0D;
REF0CN  = 0x20;
ADC0CF  = 0xF9;
ADC0CN  = 0x82;
ADC0AC  = 0x20;
EIE1   |= 0x08;
SFRPAGE = CONFIG_PAGE;
}

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

int main(void)
{
PORT_Init();
Timer3_Init();
Timer0_Init();
Timer2_Init();
ADC0_Init();

```
LED_DISPLAY_PORT = pozycja;

SFRPAGE = CONFIG_PAGE;
P4 = ~(1 << 4) | 0x0F;

IE_EA = 1;

update_display();

while (1)
{
    if (adc_ready)
    {
        unsigned long v100;
        adc_ready = 0;

        v100 = (unsigned long)adc_raw * 250UL / 255UL;

        {
            unsigned long tmp;
            unsigned int  n = filter_n;

            if (n <= 1)
            {
                avg_voltage = (unsigned int)v100;
            }
            else
            {
                tmp = (unsigned long)avg_voltage * (n - 1) + v100;
                avg_voltage = (unsigned int)(tmp / n);
            }
        }

        update_display();
    }
}
```

}

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 <= 7)
            {
                filter_X    = val;
                filter_n    = power2(filter_X);
                avg_voltage = 0;
                led_display[0] = seg_codes[filter_X];
            }
        }
    }

    last_active_r = active_r;
    last_active_c = active_c;
}

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

}

SI_INTERRUPT(TIMER2_ISR, TIMER2_IRQn)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = LEGACY_PAGE;
TF2H = 0;
SFRPAGE = old_SFRPAGE;
}

SI_INTERRUPT(ADC0_ISR, ADC0_IRQn)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = LEGACY_PAGE;
AD0INT  = 0;
adc_raw = ADC0H;
adc_ready = 1;
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;
```

}