{
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
unsignedcharx;
/* Установитьчастоту */
UBRROH = (unsigned char) (baudrate»8) ;
UBRROL = (unsigned char) baudrate;
/* Включитьприемник UART */ UCSRB = { (1 « RXCIE) | (1«RXEH) ) ;
У/Форматприемаданных: 8 битданных, 1 стоп-бит, проверканачетность UCSRC = (1«URSEL) I (3«UCSZO) | (1«UPM1) ;
/* Обнулитьбуфферприемника */ х = 0;
USARTJbcTail = х; USART_RxHead = х;
)
/* Процедурачтенияизприемника */ BYTEUSART_Receive( void }
{
unsignedchartmptail;
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; /* Сохранитьполученныеданныевбуффере */ }
// Процедураинициализациитаймера
voidJnitTimer(void)
{
disable_interrupt();
TCCRO = 5;// timerO counts elk/1024
TIMSK |= M « TOIEO); //Enable TimerO Interrupt TCWTO = TmrO_Reload; TmrOFlag = 0;
enable_interrupt(};
}
/* Обработчикпрерыванияоттаймера */ 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;
}