Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка (МПС)

.pdf
Скачиваний:
15
Добавлен:
04.06.2015
Размер:
1.2 Mб
Скачать

//Инициализация необходимых устройств микроконтроллера:

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