Методичка (МПС)
.pdfif(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