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

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

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

if(delay==1)

 

//программа ждет установки флага delay.

{

 

 

//при его установке

PORTC=data;

 

//на PORTC отправляется команда ЖКИ

for(i=1;i<=100;i++) {;}

//делается небольшая задержка времени

PORTC|=0x40;

 

//выставляется бит «Е» ЖКИ

for(i=1;i<=100;i++) {;}

//делается небольшая задержка времени

PORTC&=0xBF;

 

//бит «Е» очищается

for(i=1;i<=100;i++) {;}

//делается небольшая задержка времени

PORTC=0x00;

 

//очищаются все остальные входы ЖКИ

start_delay=0;

 

//очищается флаг начала отчета

delay=0;

 

//очищается флаг delay

}

 

 

 

}

 

 

 

}

 

 

 

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

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=0x0C;

 

 

data_ts();

 

 

data=0x00;

//отправляется команда «Установка режима»

21

data_ts(); data=0x06; data_ts();

//после окончания инициализации в ЖКИ последовательно отправляется //массив с кодами адресов памяти DDRAM и CGRAM, при этом на экране //появляется необходимая надпись

for(i3=0;i3<60;i3++) {data=mass[i3];data_ts();}

stop_init=1;

//устанавливается флаг окончания инициализации

}

 

}

 

}

 

//------------------------------------------------------------------

 

$ .

1. + ,

$ :

#include <iom32v.h> #include <macros.h>

2. , & $ :

unsigned char data=0,start_delay=0,gain=0;

unsigned char i,i1,i2,i3,delay=0;

 

 

 

 

 

unsigned char stop_init=0;

 

 

 

 

 

 

 

unsigned char mass[60]={0x08, 0x04, 0x24, 0x2F, 0x24,

0x2F,

0x24,

0x2F,

0x08,

0x09,

0x24,

0x28,

0x2A,

0x28,

0x2A,

0x28,

0x09,

0x02,

0x22,

0x22,

0x2A,

0x29,

0x2A,

0x2B,

0x25,

0x24,

0x24,

0x25,

0x25,

0x28,

0x22,

0x2D,

0x2A,

0x28,

0x25,

0x20,

0x24,

0x2F,

0x2A,

0x2A,

0x2A, 0x25, 0x22,

0x22};

 

 

 

 

 

 

 

data – ,

start_delay – '$ %

gain – %

i, i1, i2,i3 – "

delay – '$ ! %

stop_init – '$ 9 *

mass[60] – DDRAM +GRAM,

«((( ,)) «2 0- -) (;*»».

3. ; / :

void port_init(void)

{

PORTA = 0xFF; DDRA = 0x00; PORTB = 0xFF; DDRB = 0x00; PORTC = 0x00; DDRC = 0xFF; PORTD = 0xFF; DDRD = 0x00;

22

}

& ) , ) , ) D ,

$# . ) +

'.

4. ; " 00.

void timer0_init(void)

{

TCCR0 = 0x00;

TCNT0 = 0x00; OCR0 = 0x7D; TCCR0 = 0x00;

}

0 " $ % CTC, $

clk/64 (OCR0 = 0x7D), "

" 1 .

6 " $ TCCR0 & 0x0B,

0000 1011. : " '$" # % CTC,

%$ $ $ " TCNT0

", " $ OCR0,

$ $ TCNT0 ".

5. $ " 00

$ %.

#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP void timer0_comp_isr(void)

{

CLI();

i1+=1; if(i1>=i2)

{

delay=1;

i1=0;

TCCR0=0x00;

TCNT0=0x00;

}

SEI();

}

) , 1 ,

". $ , , " i1

5, % 5 . i1 #, "

' '$ %

(delay=1).

6. ; 9 *.

void data_ts(void)

{

switch(gain)

{

case 1: i2=50; break;

23

case 2: i2=5; break; case 3: i2=1; break;

}

TCCR0=0x0B; start_delay=1; while(start_delay==1)

{

if(delay==1)

{

PORTC=data; for(i=1;i<=100;i++) {;} PORTC|=0x40; for(i=1;i<=100;i++) {;} PORTC&=0xBF; for(i=1;i<=100;i++) {;} PORTC=0x00; start_delay=0;

delay=0;

}

}

}

) ' %,

" gain:

switch(gain)

{

case 1: i2=50; break;

case 2: i2=5;

break;

case 3: i2=1;

break;

}

 

) $ " 00 (TCCR0=0x0B) '$

% (start_delay=1). ) '$ start_delay , '$ delay , $ % &! % '$ delay.$ '$ , ) + ' "

$ (PORTC=data), % " «-» (PORTC|=0x40), 9 *. ) $

% PORTC # '$ start_delay delay.

7. ; ' " " .

void init_devices(void)

{

CLI(); port_init(); timer0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x02;

SEI();

}

* " ' & ' ",

!. 0 % # ! (MCUCR = 0x00;

24

GICR = 0x00) " 00

(TIMSK = 0x02).

8. 1 '.

void main(void)

{

init_devices(); while(1)

{

if(stop_init==0)

{

gain=1;

data=0x02; data_ts();

gain=2;

data=0x02; data_ts(); data=0x08; data_ts();

gain=3;

data=0x00; data_ts(); data=0x0C; data_ts();

data=0x00; data_ts(); data=0x06; data_ts();

for(i3=0;i3<60;i3++) {data=mass[i3];data_ts();} stop_init=1;

}

}

}

* " ' void main(void) $ . + ' " init_devices(),

" $ .

& $ .

2 3 4

6 7 ' 9 *

' «2 »:

data=0x00; data_ts(); data=0x0C; data_ts();

«2 » ( . 2.1.1) # " :

25

RS

RW

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

0

0

0

0

0

0

1

D

C

B

) «D» ", «+» , « »

$ . " &,

& . ) :

RS

RW

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

0

0

0

0

0

0

1

1

0

0

) & ' " # – ",

:

) 51 (0x00)

RS

RW

DB7

DB6

DB5

DB4

0

0

0

0

0

0

 

 

) 52 (0x0C)

 

 

RS

RW

DB3

DB2

DB1

DB0

0

0

1

1

0

0

: ' & 9 *,

& " 9 * .

mass[60] &

DDRAM ( % ) CGRAM ( $ ).

0, 2 $ ,

$ " : 0x08, 0x04

" «2 DDRAM».

+ # 6 & «(»

: 0x24, 0x2F, 0x24, 0x2F, 0x24, 0x2F, % . «(»

0100 1111 $ ( . 2.1.2). :

RS, #

, .

6 $ 9-" " : 0x08, 0x09

& «,))»: 0x24, 0x28, 0x2A, 0x28, 0x2A, 0x28.

6 & "! #

.

26

+ ' -2. ' ! !

/ " '

, & & & " "

$& % .

# ) '

1.( & " .

2.& % " $ "

9 * & ;

3., & $ , &

.

# '

&

' " # &. , $

& ' & '.

-' .

% & & . )

&! % " % &

& " ' " , ' &

. ( % , 20,

20 ' , $ .

& & .

- & , ,

( . 2.1.1). ) %

% # " , %

& $ .

"' 1

"' 2

"' 3

"' 4

$ 1

$ 2

$ 3

$ 4

$ 5

2.1.1. ) "

27

6 & & « $#$ ». :

, $ $"

«1», $ !

%, #$ $" «1» ( . 2.1.2). ) $ %

$ $ $ «0».

"' 1

“0”

 

"' 2

“1”

 

"' 3

“1”

 

"' 4

“1”

 

“1”

 

$ 5

“1”

$ 4

“1”

$ 3

“1”

$ 2

“1”

$ 1

“1”

 

%()%

()%

. 2.2.2. «/$#$ » "

) , % $ $ ,

$ %

% $ $ . - %,

$ $" «1». - % %, ,

$ " ,

$ $ $ «0» 2 1 %

$ $ $ «0».

 

 

 

 

1

2

3

A

 

4

5

6

B

E

7

8

9

C

F

 

0

 

D

 

. 2.2.3. , &

28

& , % # ',

& ( . 2.2.3). ( % 4 5 ,

& «2 " / » ,

' / .

" $ , # "

% " % "

«2 " / » ( 9 * 51).

#. * & % " , #

, & % " 9 *.

//--------------------------------------------------------------------

 

 

/*

 

 

PC0...

PC3 - DB4...

DB7

PC4

- RW

 

PC5

- RS

 

PC6

- E

 

PD0...

PD3 – строки клавиатуры

PA0...

PA4 – столбцы клавиатуры

*/

 

 

//Подключение стандартных библиотек, в том числе библиотеки //микроконтроллера Atmega32:

#include <iom32v.h> #include <macros.h>

//Объявление переменных, используемых в программе:

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;

//Функция инициализации портов ввода/вывода

void port_init(void)

{

 

 

PORTA

= 0xFF;

//Порт А инициализируется на ввод. Подтягивающие

DDRA

= 0x00;

//резисторы включены

PORTB

= 0xFF;

 

DDRB

= 0x00;

 

PORTC

= 0x00;

 

DDRC

= 0xFF;

//Порт С инициализируется на вывод

PORTD

= 0x0E;

//На выводах PD1…PD3 задается сигнал логической «1»

DDRD

= 0x0F;

//Биты PD0…PD3 порта D инициализируются на вывод

}

 

 

//Функция инициализации таймера T0:

29

void timer0_init(void)

{

TCCR0 = 0x00;

TCNT0

= 0x00;

OCR0

=

0x7D;

TCCR0 =

0x00;//Таймер остановлен и готов к работе с выдержкой 1 мс

}

 

//при записи в TCCR0=0x0B

//Обработка прерывания по совпадению таймера Т0:

#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP void timer0_comp_isr(void)

{

 

 

CLI();

//запрет всех прерываний

i1+=1;

//инкремент счетчика прерываний таймера Т0 i1

if(i1>=i2)

//когда i1 равен уставке i2

{

 

 

delay=1;

//устанавливается флаг delay

i1=0;

//обнуляется счетчик i1

TCCR0=0x00;

//останавливается таймер Т0

TCNT0=0x00;

//и очищается его счетный регистр

}

 

 

SEI();

//разрешение всех прерываний

}

 

 

//Функция отправки данных на жидкокристаллический индикатор:

void data_ts(void)

 

{

 

 

switch(gain)

 

//опрос задания на задержку

{

 

 

case 1: i2=50; break;

//если gain=1, то задержка 50 мс

case 2: i2=5;

break;

//если gain=2, то задержка 5 мс

case 3: i2=1;

break;

//если gain=3, то задержка 1 мс

}

 

 

TCCR0=0x0B;

 

//запуск таймера Т0 для отсчета задержки

start_delay=1;

 

//установка флага начала отсчета

while(start_delay==1)

//пока идет задержка,

{

 

 

if(delay==1)

 

//программа ждет установки флага delay

{

 

//при его установке

PORTC=data;

 

//на PORTC отправляется команда ЖКИ,

for(i=1;i<=100;i++) {;}

//делается небольшая задержка времени,

PORTC|=0x40;

 

//выставляется бит «Е» ЖКИ,

for(i=1;i<=100;i++) {;}

//делается небольшая задержка времени,

PORTC&=0xBF;

 

//бит «Е» очищается,

for(i=1;i<=100;i++) {;}

//делается небольшая задержка времени,

PORTC=0x00;

 

//очищаются все остальные входы ЖКИ.

start_delay=0;

 

//Очищается флаг начала отсчета,

delay=0;

 

//очищается флаг delay.

}

 

 

}

 

 

}

 

 

30