Курсовая работа: Проектирование удаленного устройства индикации
fldefine
SET_TEXT_AREA_COMMAHD0x41
#define SET_GR№HIC_HOME_ADDRESS_CO№1AND
0x42
#define SET_GRAPHIC_AREA_CCMMAND0x43
// Константы установки режима
^define OR_MODE0x80
tfdefine EXOR_MODE0x81
^define ANDJMODE0x83
#define TEXT_ATTRIBUTE_MODE0x84
^define INTERNAL_CG_ROM_MODE
0x80
tfdefine EXTERNAL_CG_RAM__MODE
0x88
// Константы режима дисплея
#define DISPLAY_OFF0x90
^define
CURSOR_ON_BLIHK_OFF0x92
^define CURSOR_ON_BLINK_OK0x93
#define TEXT_ON_GRAPHIC_OFF0x94
#define
TEXT__OFF_GRAPHIC_ON0x98
^define TEXT_ON_GRAPHIC_OnOX9C
// Размер курсора
#define ONE_LINE OxAO
tfdefine TWO_LINE OxAl
^define THREE_LINEOxA2
ttdefine FOUR_LINE ОхАЗ
^define FIVE_LINE OxA4
^define SIX_LINE OxA5
^define SEVEN_LINEOxA6
^define EIGHT_LINEOxA7
// Автоматическое чтение/данных
tfdefine
SET_DATA_AUTO_WRITE_COMMAND OxBO
^define
SET_DATA_AUTO_READ_COMMAND OxBl
^define
AUTO_RESET_COMMANDOxB2
//
#define SCREEN_PEEK_CCMMANDOxEO
#define SCREEN_COPY_CC»1MANDOxE8
// Установка/сброс Оитов
tfdefine SET_BIT OxFO
^define RESET_BIT OxF8
^define BIT_0 OxFO
#define BIT_1 OxFl
ttdefine BIT_2 OxF2
^define BIT_3 OxF3
idefine BIT_4 OxF4
#define BIT_5 OxFS
^define BIT_6 OxF6
^define BIT_7OxF7
Файл главкой программы kurs.c;
/* Includes */ ^include
<iom!28.h> ^include <ina90.h>
Sinclude
"my_header.h"
^define
USART_RX_BUFFER_SI2E 128
itdefine TmrOReload 4
static unsigned char
TmrOFlag;
Static unsigned char
USART_RxBuf[USART_RX_BUFFER_SIZE];
static volatile
unsigned char USART_RxHead; static volatile unsigned char USART_RxTail;
static BYTE OutString[128];
// Процедуры инициализации устройств
void InitAVR(void);
void USART_Init(
unsigned int baudrate );
void InitLCD(void);
void InitTimer(void);
void
InitPortARead(void);
void
InitPortAWrite(void)?
void InitPortCWrite(void);
// Процедуры для работы с УСАПП и LCD
unsigned char
USART_Receive( void );
void Data«rite<BYTE Data);
void CommandWrite(BYTE
Command);
void ReadStatus(void);
void ReadStatus2(void);
void SendCoimand{BYTE
Command);
void
SendlByteCommand(BYTE Data, BYTE Command);
void
Send2ByteCommand(WORD Data, BYTE Command);
void
SetCursorPointer(WORD Position)
void
SetAddressPointer(WORD Address)
void
ByteWriteToRam(WORD AddressPointer, BYTE Data)
void AutoWrite(BYTE
Data);
void mainf void )
f
BYTE HumBytes = 0;
InitAVR();
_SEI(); /* Разрешить прерывания */
while (!)
{
if(TmrOFlag) // Произошло срабатывание таймера
{
BYTE rec = 0;
while(DatalnReceiveBuffer()
!= 0) // Пока буффер не пуст
{
rec = USART_Receive(); // Приняли байт из буффера
OutString[NumBytes] = Rebuild(rec); // Записали его в строку NumBytes-n-;// Увеличить счетчик принятых байт
if (rec == OxOD)// Конец строки - ?
f
/* Выводим строку на LCD в режиме AutoWrite*/
AutoWriteModefO, —NumBytes)
for(int i = 0; i <=
NumBytes; i++) OutStringU] = 0;
NumBytes = 0; }
\
TmrOFlag = 0;
} )
}
/* Процедура инициализации USART */
void USART_Init( unsigned int baudrate ) t
unsigned char x;
/* Установить частоту */
UBRROH = (unsigned
char) (baudrate»8) ;
UBRROL = (unsigned
char) baudrate;
/* Включить приемник UART */
UCSRB =
{
unsigned char tmptail;
while ( USART_RxHead == USART_RxTail ) /* Ждем поступления данных */ ;
tmptail = USART_RxTail + 1; /* Рассчет индекса буффера */ USART_RxTail = tmptail;/* Сохранить новели индекс */
return
USART_RxBuf[tmptail]; /* Вернуть данные */
>
unsigned char
DatalnReceiveBuffer( void )
{
return ( USART_RxHead
!= USART_RxTail ); /* Возвращает О если буффер пуст */
}
/* Обработчик прерывания от приемника */ #pragma
vector=USART_RXC_vect _interrupt void USART_RX_interrupt( void ) {
unsigned char data;
unsigned char tmphead;
/* Прочесть полученные данные */
data = UDR;
/* Рассчет нового индекса */
tmphead = ( USARTJRxHead + 1 };
USART_RxHead = tmphead; /* Сохранить новый индекс V
if ( tmphead ==
USART_RxTail ) (
/* Ошибка! Буффер приемника переполнен */
}
USART_RxBuf[tmphead] = data; /* Сохранить полученные данные в буффере */ }
// Процедура инициализации таймера
void JnitTimer(void)
;
}
/* Обработчик прерывания от таймера */ tfpragma
vector=TIMERO_OVF_vect
interrupt void
TIMERO_OVF_interrupt(void)
(
TCNTO=TmrO_Reload;
TmrOFlag =1; }
void
InitPortARead(void) {
DDRA = 0;
PORTA = Oxff; }
void
InitPortAWrite(void) {
DDRA = Oxff; }
void
InitPortCWrite(void) I
DDRC = Oxff;
PORTC = 0x30; }
void InitLCD(void) {
int tmp = 0;
Send2ByteComraand(tm.p,
ET_TEXT_HOME_ADDRESS_COMMAND);
tmp = 0x14;
Send2ByteCommand(tmp,
SET_TEXT_AREA_COMMAND);
tmp = 0x80;
CoromandWrite(INTERNAL_CG_ROM_MODE);
CommandWrite{TEXT_ON_GRAPHIC_OFF);
I
void InitAVR(void)
I
InitPortAWriteO ;
InitPortCWriteO ;
InitLCDO;
InitTimer();
USART_Init( 47 };//Установить частоту 9,600 используя 1.3728MHz кристалл
}
// Процедуры для работы с LCD-дисплеем void DataWrite(BYTE Data)
t
PINC =
DATA_WRITE_COMMAND;
PIНА ~ Data; }
void CommandWrite(BYTE
Command)
f
PINC =
CCMMRND_WRITE_COMMAND;
Р1ЫА = Command; J
void ReadStatus(void) {
BYTE tempFlag = 0; BYTE
stat; InitPortAReadO ; while(tempFlag != 1) (
PINC =
READ_STATUS_COMMAND;
Stat = PIMH.;
if((stat & 0x03) ==
0x03) tempFlag = 1; }
InitPortAWriteO }
void ReadStatusS(void)
{
BYTE tempFlag = 0; BYTE
stat; InitPortAReadO; while(tempFlag != 1) {
PINC =
READ_STATUS_COMMAND;
stat = PINA;
if((stat b 0x08) ==
0x08) tempFlag = 1; }
InitPortAWriteO }
void SendCommandfBYTE
Command)
i
ReadStatus{);
WriteCommand(Command); }
void
SendlByteCommandfBYTE Data, BYTE Command) {
ReadStatus();
DataWrite(Data);
ReadStatus{);
CommandWrite(Command);
}
void
Send2ByteCommand{WORD Data, BYTE Command) {
ReadStatus();
DataWrite((BYTE)Data);
ReadStatus();
DataHrite((BYTE)(Data » 8));
ReadStatus ();
CommandWrite(Command);
}
// Position: младший байт - координата X (от OOh до 4Fh)
//старший байт - координата Y (от OOh до IFh)
void
SetCursorPointer(WORD Position)
{
Send2ByteComnand(Positon,
SET_CURSOR_COMMAND);
>
// Address: младший байт
//старший байт
void
SetAddressPointer(WORD Address)
{
Serid2BytesCommand[Address,
S£T_ADDRESS_COMMAND);
}
void
ByteWriteToRamfWORD AddressPointer, BYTE Data)
(
SetAddressPointer(AddressPointer);
ReadStatus();
DataWrite (Data) ,-
ReadStatus();
DataWrite(DATAJWRITEjLNC_ADP);
}
void AutoWrite(BYTE
Data) (
ReadStatus2();
PINA = Data;
}
// Массив символов OutString должен быть объявлен как
// глобальный массив типа BYTE
WORD AutoWriteModefWORD
Address, BYTE NumBytes)
I
SetAddressPointer(Address);
SendCommand(SET_DATA_AUTO_WRITE_COMMRND);
for(int i = 0; i <
NumBytes; i++) {
AutoWrite(OutString[i]);
Address++; }
SendCommand
(AUTO_RESET_CCMMAND) ; return Address;
}




|