11.2: Призначення
- Page ID
- 30530
Ця вправа передбачає чималу кількість проводки і нетривіальний обсяг коду. Є багато речей, які можуть піти не так, якщо просто зануритися і спробувати зробити все і відразу. Наприклад, якщо відрізок або ціла цифра не світиться, як дізнатися, чи проблема в апаратному забезпеченні або в програмному забезпеченні? Налагодження обох одночасно не є незначним завданням. Краще переконатися, що шматки коду працюють, як очікувалося, спочатку, а потім будувати на цьому. Наприклад, ви можете просто кодувати шматок, який світить один дисплей, а потім розгорнути до мультиплексованого дисплея. Розглянемо приблизно так:
// Port B.0:2 for 7 segment mux
#define DIGIT1 0x01
#define DIGIT10 0x02
#define DIGIT100 0x04
#define DIGIT111 0x07
#define FSRMASK 0x08
unsigned char numeral[]={
//ABCDEFG,dp
0b00000011, // 0
0b10011111, // 1
0b00100101, // 2
0b00001101, // 3
0b10011001,
0b01001001,
0b01000001,
0b00011111,
0b00000001,
0b00011001, // 9
0b11111111, // blank
0b01100001, // E
0b01110011, // r
0b00001001, // g
0b00111001 // o
};
#define LETTER_BLANK 10
#define LETTER_E 11
#define LETTER_R 12
#define LETTER_G 13
#define LETTER_O 14
#define MSG_ERR -2
void loop()
{
// try a bunch of different things...
DisplayValue(123);
DisplayValue(456);
DisplayValue(12);
DisplayValue(3);
DisplayValue(100);
DisplayValue(-2);
DisplayValue(50);
}
void DisplayValue( int v )
{
unsigned char i, h, t, u; // hundreds, tens, units
if( (v <= MSG_ERR) || (v > 999) ) // error code
{
h = LETTER_E;
t = u = LETTER_R;
}
else
{
u = v%10;
v = v/10;
t = v%10;
h = v/10;
}
// display the value for approx 1 sec (66x15msec)
for( i=0; i<66; i++ )
{
// clear all displays then activate the desired digit
PORTB |= DIGIT111;
PORTD = numeral[h];
PORTB &= ~DIGIT100;
delay(5);
PORTB |= DIGIT111;
PORTD = numeral[t];
PORTB &= ~DIGIT10;
delay(5);
PORTB |= DIGIT111;
PORTD = numeral[u];
PORTB &= ~DIGIT1;
delay(5);
}
// clear display
PORTB |= DIGIT111;
}
Після того, як у вас схема працює, спробуйте це по-справжньому! Увімкніть свій код і заповнену схему. Крім того, прокоментуйте, які зміни коду та обладнання знадобляться (якщо такі є), якщо замість загального анода використовувалися загальні катодні дисплеї.
