Смекни!
smekni.com

Проектирование удаленного устройства индикации (стр. 3 из 3)

{

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; }

&bsol;

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;

}