亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lab3.c

?? C++ source code for serial comunication with LCD using ATMEGA16 microcontroler.
?? C
字號:
/************************************************************************ *********
 * Proiectarea cu Microprocesoare
 * Laborator 3
 * Programarea in C sub AVR, Interfatare LCD alfanumeric, Comunicatie seriala RS232
 *********************************************************************************/

#include <stdio.h>
#include <avr\io.h>
#include <avr\interrupt.h>

/************************************************************************ 
 * DEFINE-uri pentru parametrizarea modulului LCD
 ************************************************************************/
#define LcdDATA_DDR		DDRA			// Portul pe care conectam firele de date la LCD-ul
#define LcdDATA_PORT	PORTA
#define LcdDATA_PIN		PINA

#define LcdCMD_DDR		DDRA			// Portul pe care conectam firele de comenzi la LCD
#define LcdCMD_PORT		PORTA
#define LcdCMD_PIN		PINA

#define LcdD4			PA0				// Pin-ul pentru firul de date D4 de pe LCD
#define LcdD5			PA1				// Pin-ul pentru firul de date D5 de pe LCD
#define LcdD6			PA2				// Pin-ul pentru firul de date D6 de pe LCD
#define LcdD7			PA3				// Pin-ul pentru firul de date D7 de pe LCD

#define LcdRS			PA4				// Pinul pentru selectare operatie (LCD)
#define LcdRW			PA5				// Pinul pentru Read/ Write (LCD)
#define LcdE			PA6				// Pinul de Enable (LCD)

#define LCD_INSTR_4wire 		0x28 	// 4 fire date, font 5x8
#define LCD_INSTR_display 		0x0C 	// Display On, Cursor On, Blinking On ( 1 Display Cursor Blink )
#define LCD_INSTR_clearDisplay 	0x01 	// Clear Display
#define LCD_INSTR_returnHome 	0x02 	// Return Cursor and LCD to Home Position
#define LCD_INSTR_nextLine 		0xC0 	// Return Cursor and LCD to Home Position


/************************************************************************ 
 * REDIRECTARE stdin, stdout pentru receptie, transmisie seriala
 ************************************************************************/
int uart_putchar(char c, FILE *unused);
int uart_getchar(FILE* f);
FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
FILE mystdin =  FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ);


/************************************************************************ 
 * API LCD.. implementare este in partea de jos a fisierului
 ************************************************************************/
void LCD_init();											// Initializare modul LCD.. trebuie apelata inainte de a se face orice operatie cu LCD-ul
void LCD_writeInstruction(unsigned char _instruction);	// Trimite o instructiune catre lcd (vezi datasheet)
void LCD_writeData(unsigned char _data);					// Trimite date catre LCD pentru afisare
void LCD_write(unsigned char _byte);						// trimite un bute catre LCD la modul general (nu conteaza daca e instructiune sau date)
void LCD_waitNotBusy();									// Asteptam pana cand lcd-ul devine disponibil pt o noua comanda
void LCD_print(char* _msg);								// Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere)
void LCD_print2(char* _msg1, char* _msg2);				// Afisare pe 2 lini pe LCD
void LCD_printDecimal2u(unsigned int _n);					// Afisare numar in baza 10 pe LCD
void LCD_printHexa(unsigned int _n);						// Afisare numar in baza 16 pe LCD
void LCD_waitInstructions(unsigned char _instructions);	// Asteapta un numar de cicli de tact.. loop


/************************************************************************ 
 * Vectorul de intreruperi... exemplu pt labroatorul 2, intreruperi
 ************************************************************************/
// Exemplu de functie ce se apeleaza la interval de 1 secunda, intrerupere generata de timerul 1 (vezi laboratorul 2) 
SIGNAL(SIG_OUTPUT_COMPARE1A)
{	
	// Cod ce se apeleaza 1 data pe secunda
	// Exemplu de implemenare in C pentru laboratorul nr 2 (ASM)
}

void initUsart();
void initTimer1();	

/************************************************************************ 
 * PROGRAMUL PRINCIPAL
 ************************************************************************/
int main(void)
{
	// Mesajul ce este citit pe seriala si afisat pe LCD
	char message[33];		

	// Initializare
	
	initUsart();
	initTimer1();									
	
	stdin = &mystdin;
	stdout = &mystdout;

	// Activare sistem de intreruperi
	sei(); 

	// Functie pentru initializarea LCD-ului si afisarea mesajului WELCOME
	LCD_init();
	LCD_writeInstruction(LCD_INSTR_clearDisplay);
	LCD_print("WELCOME");
	
	// Asteptam dupa un mesaj si apoi il afisam pe LCD, dupa care reluam ciclul
	for(;;)
	{
		printf("\nEnter message: ");
		scanf("%s",message);
		LCD_writeInstruction(LCD_INSTR_clearDisplay);
		LCD_print(message);
	}
    return 0;
}


void initUsart() // Initializare modul USART pt comunicatie la 9600bps, 8 biti de date, la 16MHz		
{
	//TODO
}
void initTimer1() // Initializare timer 1 compare match A pentru a avea un timer la nivel de 1 secunda, 16MHz
{
	OCR1A = 15624;
	TCCR1A = 0;
	TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);
	TIMSK |= _BV(OCIE1A);
}

/************************************************************************ 
 * IMPLEMENTARE FUNCTII TRANSMISIE/RECEPTIE SERIALA, pentru mapare stdin, stdout
 ************************************************************************/
// Functie ce trateaza trimiterea unui caracter pe seriala
int uart_putchar(char c, FILE *unused)      
{
	//TODO
}

// Functie ce trateaza primirea unui caracter pe seriala
int uart_getchar(FILE* f)
{
	//TODO
}




/************************************************************************ 
 * IMPLEMENTARE API LCD.. implementare este in partea de jos a fisierului
 ************************************************************************/

void LCD_init()
{
	LcdDATA_DDR |=  (1<<LcdD4)|(1<<LcdD5)|(1<<LcdD6)|(1<<LcdD7);	// setam pinii de date ca pini de iesire
	LcdCMD_DDR  |=  (1<<LcdRS)|(1<<LcdRW)|(1<<LcdE);				// setam pinii de comenzi ca pini de iesire

	LCD_waitNotBusy();
	
	LcdCMD_PORT   &= ~(1<<LcdRS);									// Setam linia RS pe low
	LcdCMD_PORT   &= ~(1<<LcdRW);									// Setam linia RW pe low (acum suntem in modul de trimis instructiuni)
	LcdDATA_PORT  &= ~(1<<LcdD4)&~(1<<LcdD6)&~(1<<LcdD7); 		// Specificam ca vrem 4 fire de date, prima comanda (LcdD5 activ, restul nu)
	LcdDATA_PORT  |=  (1<<LcdD5);									// setam pinii de comenzi ca pini de iesire
	
	LcdCMD_PORT |=  (1<<LcdE);					// Setam linia E(nable) pe high; aceasta ii specifica LCD-ului sa preia datele
	LCD_waitInstructions(6);					// Asteptam o perioada de timp T
	LcdCMD_PORT &= ~(1<<LcdE );				// Setam linia E(nable) pe low; transferul s-a terminat

	LCD_writeInstruction(LCD_INSTR_4wire); 		// Incarcam comanda: 4 bit data, 2 lines, 5x8 font
	LCD_writeInstruction(LCD_INSTR_display); 	// Display On, Cursor On, Blinking On
	LCD_writeInstruction(0x06);					// Increment, no shift
	LCD_writeInstruction(0x01);					// Clear Display
}

void LCD_writeInstruction(unsigned char _instruction)
{
	//TODO			
	// asteptam ca LCD-ul sa fie liber sa primeasca comenzile
	// setam pinul RS pe low.. low=instructiuni, high=date
	// setam pinul RW pe low (suntem in modul de comenzi acum)
	// apelam procedura ce trimite byte-ul pe firele de date
}


void LCD_writeData(unsigned char _data)
{
	//TODO
	// asteptam ca LCD-ul sa fie liber sa primeasca comenzile
	// setam pinul RS pe high
	// setam pinu RW pe low (suntem in modul de date acum)
	// apelam procedura ce trimite byte-ul pe firele de date
}

void LCD_write(unsigned char _byte)
{
	unsigned char _byte2;
	
	_byte2 = _byte>>4;

	LcdDATA_PORT &= ~(1<<LcdD4);
	if ( bit_is_set( _byte2, 0 ) )
		LcdDATA_PORT |= (1<<LcdD4);
		
	LcdDATA_PORT &= ~(1<<LcdD5);
	if ( bit_is_set( _byte2, 1 ) )
		LcdDATA_PORT |= (1<<LcdD5);

	LcdDATA_PORT &= ~(1<<LcdD6);
	if ( bit_is_set( _byte2, 2 ) )
		LcdDATA_PORT |= (1<<LcdD6);

	LcdDATA_PORT &= ~(1<<LcdD7);
	if ( bit_is_set( _byte2, 3 ) )
		LcdDATA_PORT |= (1<<LcdD7);

	LcdCMD_PORT |= (1<<LcdE);						// Setam Pinul E pe high
	LCD_waitInstructions(6);						// Asteptam o perioada de timp T
	LcdCMD_PORT &= ~(1<<LcdE);						// Setam Pinul E pe low

	LCD_waitInstructions(6);						// Asteptam o perioada de timp T
	
	LcdDATA_PORT &= ~(1<<LcdD4);
	if ( bit_is_set( _byte, 0 ) )
		LcdDATA_PORT |= (1<<LcdD4);
	
	LcdDATA_PORT &= ~(1<<LcdD5);
	if ( bit_is_set( _byte, 1 ) )
		LcdDATA_PORT |= (1<<LcdD5);

	LcdDATA_PORT &= ~(1<<LcdD6);
	if ( bit_is_set( _byte, 2 ) )
		LcdDATA_PORT |= (1<<LcdD6);

	LcdDATA_PORT &= ~(1<<LcdD7);
	if ( bit_is_set( _byte, 3 ) )
		LcdDATA_PORT |= (1<<LcdD7);

	LcdCMD_PORT |= (1<<LcdE);						// Setam Pinul E pe high
	LCD_waitInstructions(6);						// Asteptam o perioada de timp T
	LcdCMD_PORT &= ~(1<<LcdE);						// Setam Pinul E pe low
}


void LCD_waitNotBusy()
{
	unsigned char _loop = 1;

	while (_loop)
	{
		LcdDATA_DDR &= ~(1<<LcdD4 | 1<<LcdD5 | 1<<LcdD6 | 1<<LcdD7);	// Setam pinii de date de la LCD pe in pt a citi busy flag
		LcdDATA_PORT &= ~(1<<LcdD4 | 1<<LcdD5 | 1<<LcdD6 | 1<<LcdD7); // Dezactivam pullup resistor pentru pinii de in
		
		LcdCMD_PORT &= ~(1<<LcdE);						// Setam pin-ul e pe low; ar trebui sa fie deja low, doar ne asiguram
		LcdCMD_PORT &= ~(1<<LcdRS);					// Setam pinul RS pe low
		LcdCMD_PORT |=  (1<<LcdRW);					// Setam pinul RW pe high (acum suntem in modul de interogare busy/adr)
		
		LcdCMD_PORT |= (1<<LcdE);						// Setam Pinul E pe high
		LCD_waitInstructions(6);						// Asteptam o perioada de timp T
		_loop = LcdDATA_PIN & (1<<LcdD7);				// Citim busy flag-ul
		LcdCMD_PORT &= ~(1<<LcdE);						// Setam Pinul E pe low
		
		LCD_waitInstructions(6);						// Asteptam o perioada de timp T
		
		LcdCMD_PORT |= (1<<LcdE);						// Setam Pinul E pe high
		LCD_waitInstructions(6);						// Asteptam o perioada de timp T
		LcdCMD_PORT &= ~(1<<LcdE);						// Setam Pinul E pe low

		LcdDATA_DDR |= (1<<LcdD4 | 1<<LcdD5 | 1<<LcdD6 | 1<<LcdD7); // Setam Portul de LCD ca port de iesire la loc
	}
}




void LCD_printDecimal2u(unsigned int _n)
{
	unsigned char tmp=0;
	
	// Extragem sutele
	while(_n>=100)
		_n-=100;

	while(_n>=10){
		tmp++;
		_n-=10;
	}

	LCD_writeData(tmp+'0');
	LCD_writeData(_n+'0');
}

void LCD_printHexa(unsigned int _n)
{
	unsigned char _tmp = _n>>4;
	if (_tmp>9)
		_tmp += 'A'-10;
	else
		_tmp += '0';
	LCD_writeData( _tmp );
	_tmp = _n & 0x0F;
	if (_tmp>9)
		_tmp += 'A'-10;
	else
		_tmp += '0';
	LCD_writeData( _tmp );
}


void LCD_print(char* _msg)
{
	unsigned char i=0;
	for( ; _msg[i]!=0 && i<16; i++)
		LCD_writeData( _msg[i] );
}

void LCD_print2(char* _msg1, char* _msg2)
{
	LCD_writeInstruction(LCD_INSTR_clearDisplay);
	LCD_print(_msg1);
	LCD_writeInstruction(LCD_INSTR_nextLine);
	LCD_print(_msg2);
}


void LCD_waitInstructions(unsigned char _instructions)
{
	while (_instructions--)
		;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
777xxx欧美| 欧美在线视频不卡| 日本不卡视频在线观看| 国产精品传媒视频| 亚洲欧洲色图综合| 国产精品网站在线播放| 欧美激情艳妇裸体舞| 久久影院视频免费| 国产肉丝袜一区二区| 国产欧美日韩三区| 中国av一区二区三区| 国产精品久久久久7777按摩| 国产精品美女久久久久久久| 国产精品嫩草影院av蜜臀| 国产精品污污网站在线观看| 亚洲欧美国产三级| 亚洲永久免费视频| 午夜私人影院久久久久| 日韩成人午夜精品| 国产原创一区二区| www.欧美日韩国产在线| 欧美系列一区二区| 日韩一级片网站| 中文子幕无线码一区tr| 日韩毛片视频在线看| 亚洲国产一区二区在线播放| 蜜桃视频在线观看一区| 国产91在线看| 欧美亚洲高清一区二区三区不卡| 欧美日韩国产中文| 国产亚洲欧美日韩俺去了| 亚洲视频在线一区观看| 天堂va蜜桃一区二区三区漫画版| 精品在线免费视频| 91性感美女视频| 精品国精品国产| 中文字幕av一区二区三区免费看| 亚洲一区二区三区美女| 国产尤物一区二区在线| 色婷婷精品久久二区二区蜜臂av| 欧美一区二区成人6969| 国产精品美女久久久久aⅴ| 亚洲va国产天堂va久久en| 精品一区二区三区在线播放视频| av中文字幕亚洲| 欧美mv日韩mv国产网站app| 亚洲丝袜另类动漫二区| 麻豆精品久久久| 日本久久精品电影| 久久久久99精品国产片| 亚洲高清视频在线| 成人国产在线观看| 精品欧美一区二区三区精品久久| 亚洲视频中文字幕| 国产精品一区二区久激情瑜伽 | 婷婷国产v国产偷v亚洲高清| 久久电影国产免费久久电影| 色94色欧美sute亚洲13| 国产日韩欧美高清| 裸体一区二区三区| 欧美日韩国产综合一区二区 | av一二三不卡影片| 欧美r级在线观看| 日韩—二三区免费观看av| 91香蕉视频mp4| 国产精品美女久久久久高潮| 久久aⅴ国产欧美74aaa| 4438成人网| 亚洲国产成人porn| 色一情一乱一乱一91av| 亚洲私人黄色宅男| 99精品在线免费| 国产精品高潮呻吟久久| 国产传媒久久文化传媒| 精品国内片67194| 久久 天天综合| 精品日韩欧美在线| 久久99国产精品麻豆| 日韩一区二区精品在线观看| 日韩高清不卡在线| 欧美高清激情brazzers| 日韩国产高清影视| 日韩一区二区影院| 久久激情五月激情| 久久久久99精品国产片| 国产成人精品影视| ㊣最新国产の精品bt伙计久久| 成人午夜精品一区二区三区| 亚洲欧洲精品成人久久奇米网| 国产成人精品综合在线观看 | 蜜臀国产一区二区三区在线播放 | 日韩欧美国产综合| 免费成人结看片| 久久综合九色综合97婷婷女人| 狠狠色丁香婷综合久久| 国产亚洲视频系列| 色综合天天综合网天天看片| 亚洲免费av在线| 在线综合亚洲欧美在线视频| 精品一区二区免费在线观看| 国产日韩精品一区二区三区| 91啪亚洲精品| 毛片不卡一区二区| 国产精品网站在线观看| 欧美在线|欧美| 久久机这里只有精品| 国产精品毛片久久久久久久| 欧美写真视频网站| 国产自产高清不卡| 亚洲女爱视频在线| 精品捆绑美女sm三区| 成人国产精品免费观看| 首页亚洲欧美制服丝腿| 久久婷婷色综合| 欧美视频一区二区三区| 国产一区二区三区在线观看免费| 亚洲欧美综合色| 日韩欧美中文字幕精品| k8久久久一区二区三区| 蜜臀av一区二区在线免费观看| 国产日韩欧美精品在线| 欧美日韩高清影院| 成人av在线电影| 伦理电影国产精品| 亚洲激情中文1区| 国产视频一区不卡| 91精品国产美女浴室洗澡无遮挡| 成人黄页毛片网站| 精东粉嫩av免费一区二区三区| 亚洲精品第1页| 国产欧美一区二区在线观看| 91麻豆精品国产| 在线影院国内精品| 成人av网站在线观看免费| 久久成人久久鬼色| 一区二区三区产品免费精品久久75| 久久综合色之久久综合| 在线综合+亚洲+欧美中文字幕| 91老司机福利 在线| 高清国产一区二区| 国内精品久久久久影院薰衣草| 亚洲不卡av一区二区三区| 亚洲人成伊人成综合网小说| 国产色产综合色产在线视频| 欧美一区二区福利视频| 在线播放视频一区| 欧美日韩在线综合| 欧亚洲嫩模精品一区三区| 99热精品国产| 不卡的av中国片| 成人高清在线视频| av成人动漫在线观看| 国产成人一区二区精品非洲| 不卡视频一二三| 国产成人免费高清| 国产91精品免费| 成人美女视频在线看| 成人小视频免费观看| 紧缚捆绑精品一区二区| 精品一区二区三区免费播放| 精品一区二区三区免费| 国产专区综合网| 国产**成人网毛片九色| 成人福利视频网站| 99久久久无码国产精品| av成人免费在线观看| 色偷偷成人一区二区三区91| 色欧美片视频在线观看在线视频| 91久久精品一区二区三| 欧美性一二三区| 91精品国产综合久久久蜜臀粉嫩| 欧美日韩一区二区在线观看视频 | 高清不卡一二三区| av激情综合网| 欧美私模裸体表演在线观看| 欧美精品丝袜中出| 欧美刺激脚交jootjob| 亚洲精品一区二区三区福利 | 97精品超碰一区二区三区| 99精品欧美一区二区三区小说| 色播五月激情综合网| 欧美蜜桃一区二区三区| 日韩欧美一区中文| 中文字幕一区二区三区不卡在线 | 国产视频视频一区| 最新高清无码专区| 婷婷综合另类小说色区| 精品一二三四在线| 97成人超碰视| 日韩欧美国产精品一区| 国产精品剧情在线亚洲| 亚洲国产另类精品专区| 国产精品一级在线| 91传媒视频在线播放| 2023国产精品自拍| 亚洲精品成人精品456| 激情小说欧美图片| 色婷婷一区二区三区四区| 亚洲精品一区二区三区蜜桃下载 | 国产日产欧美精品一区二区三区|