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