Методичка (МПС)
.pdf//Инициализация необходимых устройств микроконтроллера:
void init_devices(void) |
|
||
{ |
|
|
|
CLI(); |
|
//запрет всех прерываний на время инициализации |
|
port_init(); |
//вызов функции инициализации портов |
||
timer0_init(); |
//вызов функции инициализации таймера Т0 |
||
MCUCR |
= 0x00; |
|
|
GICR |
= 0x00; |
//запрет внешних прерываний |
|
TIMSK = 0x02; |
//прерывание по совпадению таймера Т0 активно |
||
SEI(); |
|
//разрешение всех прерывыний |
|
} |
|
|
|
//Главная функция программы: |
|||
void main(void) |
|
|
|
{ |
|
|
|
init_devices(); |
|
//вызов функции инициализации устройств |
|
while(1) |
|
|
|
{ |
|
|
|
if(stop_init==0) |
|
//если инициализация ЖКИ не пройдена |
|
{ |
|
|
|
gain=1; |
|
//задается пауза 50 мс |
|
data=0x02; |
|
//и отправляются биты DB7…DB4 команды |
|
data_ts(); |
|
//«Установка протокола» ЖКИ |
|
gain=2; |
|
//задается задержка 5 мс |
|
data=0x02; |
|
//и отправляется команда «Установка протокола» |
|
data_ts(); |
|
|
|
data=0x08; |
|
|
|
data_ts(); |
|
|
|
gain=3; |
|
//задается задержка 1 мс |
|
data=0x00; |
|
//и отправляется команда «Управление дисплеем» |
|
data_ts(); |
|
|
|
data=0x0F; |
|
|
|
data_ts(); |
|
|
|
data=0x00; |
|
//Отправляется команда «Установка режима» |
|
data_ts(); |
|
|
|
data=0x06; |
|
|
|
data_ts(); |
|
|
|
stop_init=1; |
|
//устанавливается флаг окончания инициализации |
|
} |
|
|
|
else |
|
|
//если инициализация ЖКИ пройдена |
{ |
|
|
|
switch(PORTD&0x0F) |
//реализуется «Бегущий ноль» |
||
{ |
|
|
|
case 0x0E: |
|
//«0» на первой строке клавиатуры |
switch(PINA&0x1F)
{
case 0x1E:key_L=0x23;key_H=0x21;flag=1; case 0x1D:key_L=0x23;key_H=0x22;flag=1; case 0x1B:key_L=0x23;key_H=0x23;flag=1;
break;//код «1» break;//код «2» break;//код «3»
31
case 0x17:key_L=0x24;key_H=0x21;flag=1; |
break;//код «А» |
case 0x0F:key_L=0x23;key_H=0x2C;flag=1; |
break;//код «←» |
default:flag=0; |
break; |
} |
|
|
sum+=flag; |
//инкремент флага sum |
|
PORTD=0x0D; |
//переход «0» на вторую строку |
|
break; |
|
|
case 0x0D: |
//«0» на второй строке клавиатуры |
|
switch(PINA&0x1F) |
|
|
{ |
|
|
case 0x1E:key_L=0x23;key_H=0x24;flag=1; |
break;//код «4» |
|
case 0x1D:key_L=0x23;key_H=0x25;flag=1; |
break;//код «5» |
|
case 0x1B:key_L=0x23;key_H=0x26;flag=1; |
break;//код «6» |
|
case 0x17:key_L=0x24;key_H=0x22;flag=1; |
break;//код «В» |
|
case 0x0F:key_L=0x24;key_H=0x25;flag=1; |
break;//код «Е» |
|
default:flag=0; |
|
break; |
} |
|
|
sum+=flag; |
//инкремент флага sum |
|
PORTD=0x0B; |
//переход «0» на третью строку |
|
break; |
|
|
case 0x0B: |
//«0» на третьей строке клавиатуры |
|
switch(PINA&0x1F) |
|
|
{ |
|
|
case 0x1E:key_L=0x23;key_H=0x27;flag=1; |
break;//код «7» |
|
case 0x1D:key_L=0x23;key_H=0x28;flag=1; |
break;//код «8» |
|
case 0x1B:key_L=0x23;key_H=0x29;flag=1; |
break;//код «9» |
|
case 0x17:key_L=0x24;key_H=0x23;flag=1; |
break;//код «С» |
|
case 0x0F:key_L=0x24;key_H=0x26;flag=1; |
break;//код «F» |
|
default:flag=0; |
|
break; |
} |
|
|
sum+=flag; |
//инкремент флага sum |
|
PORTD=0x07; |
//переход «0» на четвертую строку |
|
break; |
|
|
case 0x07: |
//«0» на четвертой строке клавиатуры |
|
switch(PINA&0x1F) |
|
|
{ |
|
|
case 0x1E:key_L=0x22;key_H=0x2B;flag=1; |
break;//код «+» |
|
case 0x1D:key_L=0x23;key_H=0x20;flag=1; |
break;//код «0» |
|
case 0x1B:key_L=0x22;key_H=0x2D;flag=1; |
break;//код «-» |
|
case 0x17:key_L=0x24;key_H=0x24;flag=1; |
break;//код «D» |
|
case 0x0F:key_L=0x27;key_H=0x2E;flag=1; |
break;//код «→» |
|
default: flag=0; |
|
break; |
} |
|
|
sum+=flag; |
//инкремент флага sum |
|
if(sum==0) |
//если за цикл «бегущего нуля» |
|
{ |
//не было нажато кнопки, то |
|
gain=1; |
//устанавливается пауза 5 мс |
|
data=0x00; |
//посылается команда «Очистка дисплея» |
|
data_ts(); |
//ЖКИ |
|
data=0x01; |
|
|
data_ts(); |
|
|
gain=2; |
//устанавливается пауза 1 мс |
|
data=0x00; |
//посылается команда «Управление |
|
data_ts(); |
//дисплеем» ЖКИ |
|
32
data=0x0F; |
|
data_ts(); |
|
gain=3; |
//задержка 1 мс |
flag1=0; |
//снимается флаг защиты от повторной |
} |
//отправки данных на ЖКИ |
else |
//если любая клавиша ЖКИ была нажата, |
{ |
|
if(flag1==0) |
//и если флаг защиты flag1 сброшен, то |
{ |
|
data=key_L; |
//на ЖКИ отправляется код символа, |
data_ts(); |
//нажатого на клавиатуре |
data=key_H; |
|
data_ts(); |
|
flag1=1; |
//и устанавливается флага защиты flag1 |
} |
|
} |
|
PORTD=0x0E; |
//переход «0» на первую строку |
sum=0; |
//в конце цикла «бегущего огня» |
break; |
//обнуляется флаг нажатия кнопки sum. |
} |
|
} |
|
} |
|
} |
|
//-------------------------------------------------------------------- |
|
$ .
1. + ,
$ :
#include <iom32v.h> #include <macros.h>
2. , & $ :
unsigned char data=0,start_delay=0,gain=0; unsigned char i,i1,i2,delay=0;
unsigned char stop_init=0; unsigned char key_L=0,key_H=0; unsigned char flag=0,flag1=0; unsigned char sum=0,sum1=0;
data – , ; start_delay – '$ % ; gain – % ;
i, i1, i2 – "; delay – '$ ! % ; stop_init – '$ 9 *;
key_L, key_H – 9 *; flag – '$ ' % " ;
flag1 – '$ # " 9 * ; sum – '$ ' % « $#$ $ » " .
3. ; / :
33
void port_init(void)
{
PORTA = 0xFF; DDRA = 0x00; PORTB = 0xFF; DDRB = 0x00; PORTC = 0x00; DDRC = 0xFF; PORTD = 0x0E; DDRD = 0x0F;
}
) +, " 9 *,
'. ! " D ,
PD1, PD2, PD3 $ $" «1» -
& « $#$ ».
4.; " 00 $ $
, ' 9 * , % '
' " " 51 &
%.
5.1 ' $ void main(void).
' ' ' " "
init_devices().
6 $ while(1) '
9 *. - " , 9 *,
$ '$ :
gain=1;
data=0x02; data_ts(); gain=2; data=0x02; data_ts(); data=0x08; data_ts(); gain=3; data=0x00; data_ts(); data=0x0F; data_ts(); data=0x00; data_ts(); data=0x06; data_ts(); stop_init=1;
) 9 *
« $# » " . &
D, & % & & $ $
«0» (switch(PORTD&0x0F)).
34
) % " D
PA0…PA4 ( & ). - % -
, CGRAM 9 *, # "
(key_L, key_H) '$ % (flag).
, % , '$ % " (flag)
:
switch(PORTD&0x0F)
{
case 0x0E: switch(PINA&0x1F)
{
case 0x1E:key_L=0x23;key_H=0x21;flag=1; break; case 0x1D:key_L=0x23;key_H=0x22;flag=1; break; case 0x1B:key_L=0x23;key_H=0x23;flag=1; break; case 0x17:key_L=0x24;key_H=0x21;flag=1; break; case 0x0F:key_L=0x23;key_H=0x2C;flag=1; break; default:flag=0; break;
}
sum+=flag;
PORTD=0x0D; break;
case 0x0D: switch(PINA&0x1F)
{
case 0x1E:key_L=0x23;key_H=0x24;flag=1; break; case 0x1D:key_L=0x23;key_H=0x25;flag=1; break; case 0x1B:key_L=0x23;key_H=0x26;flag=1; break; case 0x17:key_L=0x24;key_H=0x22;flag=1; break; case 0x0F:key_L=0x24;key_H=0x25;flag=1; break; default:flag=0; break;
}
sum+=flag;
PORTD=0x0B; break;
case 0x0B: switch(PINA&0x1F)
{
case 0x1E:key_L=0x23;key_H=0x27;flag=1; break; case 0x1D:key_L=0x23;key_H=0x28;flag=1; break; case 0x1B:key_L=0x23;key_H=0x29;flag=1; break; case 0x17:key_L=0x24;key_H=0x23;flag=1; break; case 0x0F:key_L=0x24;key_H=0x26;flag=1; break; default:flag=0; break;
}
sum+=flag;
PORTD=0x07; break;
case 0x07: switch(PINA&0x1F)
{
case 0x1E:key_L=0x22;key_H=0x2B;flag=1; break; case 0x1D:key_L=0x23;key_H=0x20;flag=1; break; case 0x1B:key_L=0x22;key_H=0x2D;flag=1; break; case 0x17:key_L=0x24;key_H=0x24;flag=1; break;
35
case 0x0F:key_L=0x27;key_H=0x2E;flag=1; break; default: flag=0; break;
}
sum+=flag;
PORTD=0x0E; break;
}
«/$#$ » ( $ $" «0»
PORTD3), '$ sum %
« $#$ ». - %, '$ sum
.
, sum=0, & % ,
:
gain=1;
data=0x00; data_ts(); data=0x01; data_ts(); gain=2; data=0x00; data_ts(); data=0x0F; data_ts(); flag1=0; gain=3;
- «/$#$ » % - ,
9 * '$ # flag1 "
$ 9 *, " & :
if(flag1==0)
{
data=key_L; data_ts(); data=key_H; data_ts(); flag1=1;
}
) $ «/$#$ »
'$ % : sum=0.
36
+ ' - 3. ' ' )
5 )
/ " '
* & " !$ $ $ %
, & &
.
# ) '
1.* & " " " !$ $ $ .
2.( & «3$" $&».
3.* & $ % $
.
4.* & $ % $
.
5.* & " % !$ $ $ .
# '
& ) ! ) " – ", #
$ , " &, $
" # ' " $ %.
6 !$ $ $ " ,
" $ & & ",
&.
# !$ $ $ 4- '$ !$ $ $ ( . 1).
|
|
|
|
K1 |
**+ ' |
|
|
W1 |
|
|
|
|
|
|
' ' |
|
|
|
. |
|
K1 |
|
# |
W2 |
|
K2 |
K4 W4 |
K2 |
|
|
|
|||
', '-$.# |
K3 |
|
||
|
|
|
||
|
K4 |
|
|
|
|
|
|
|
W3 |
K3
. 1. ; & !$ $
37
: " $
# $ K1-K4, #
% $ .
) # « » !$ $ $
. 2 . &
1→2→3→4 ( . 2 ). ) # «,» & &
: 1→4→3→2 ( . 2 ). 0
", % "
& .
K1 |
|
|
K1 |
W1 |
|
|
W1 |
. |
|
|
. |
W2 |
|
|
W2 |
K4 W4 |
K2 |
K4 W4 |
K2 |
W3 |
|
|
W3 |
K3 |
|
|
K3 |
K1 |
|
|
K1 |
W1 |
|
|
W1 |
. |
|
|
. |
W2 |
|
|
W2 |
K4 W4 |
K2 |
K4 W4 |
K2 |
W3 |
|
|
W3 |
K3 |
|
|
K3 |
1 |
1 |
|
2 |
|
3 |
|
4 |
|
) |
)
1 |
1 |
|
4 |
|
3 |
|
2 |
|
) |
. 2. ) & & !$ $ $
38
!$ 90 . $ . 6 $ $ # % & &! !$ 2
, $ & % " ( . 3):
–W1;
–W1 W2;
–W2;
–W2 W3;
–W3;
–W3 W4;
–W4;
–W4 W1.
W1 |
|
W1+W2 |
|
|
K1 |
|
K1 |
|
W1 |
|
W1 |
|
. |
|
. |
|
W2 |
|
W2 |
K4 W4 |
K2 |
K4 W4 |
K2 |
|
W3 |
|
W3 |
|
K3 |
|
K3 |
W2 |
|
W2+W3 |
|
|
K1 |
|
K1 |
|
W1 |
|
W1 |
|
. |
|
. |
|
W2 |
|
W2 |
K4 W4 |
K2 |
K4 W4 |
K2 |
|
W3 |
|
W3 |
|
K3 |
|
K3 |
|
|
) |
|
|
K1 |
|
K1 |
|
|
|
t |
|
K2 |
|
t |
|
|
|
|
|
|
K3 |
t |
|
|
|
|
|
|
K4 |
t |
|
|
|
|
|
|
) |
|
. 3. ) & & 36
39
0 " $
. 6$ $ !$"
% .
!$ $ $ , &$
, . 1.
0. 1. 0 !$ $ $
# |
$ |
, % , |
12 |
0 ', |
0,5 |
!$ 1 |
200 |
+ ', ( |
13 |
* & ', 1 |
7,5 |
# " , $ |
800 |
|
6 |
, $ 2 |
11 |
, $ |
0,12 |
6, |
20 |
" "
!$ $ , "
" $ . ! " " «3$"
$&» . 4.
|
|
|
! |
|
||
|
+ |
|
|
|||
|
|
|
|
|
A2 |
|
|
DD1 |
VT1 |
|
A2 |
|
|
|
|
|
|
V |
|
|
|
|
|
VD1 |
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
2 |
2 |
|
|
|
|
|
||
|
|
VT2 |
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
VD2 |
|
|
|
B1 |
|
|
|
|
A2 |
Y |
|
|
|
|
|
|
|
|
|
VT3 |
|
A2 |
|
|
|
|
|
|
) * |
||
|
|
|
VD3 |
|
||
A1 |
|
|
|
|
+% %, 0 |
|
|
|
|
|
|
|
|
|
|
VT4 |
|
2 |
|
|
|
|
|
VD4 |
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
α, / %1 |
|
|
|
|
,- # |
|
||
|
|
|
|
|
n |
|
|
" |
|
1 |
|
|
# ( |
|
|
|||||
|
# |
|
½ |
! |
0 |
1 |
|
|
|
|
|
||
|
|
|
|
|
|
.%/ |
|
“ - ” |
|
|
|
||
. 4. ! " «3$" $&» |
40