Загрузка данных
#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;
```
}