Gustav |
Nové stránky BETA
Hlavní nabídka
Technika & Bastlení
Média
Reklama Google

AVR - LCD panel - lcd.c PDF Tisk Email
Koutek AVR -
Napsal uživatel Michal, OK1WMR   
Středa, 14 Březen 2012 08:42

Kompatibilní zapojení: LCD panel s ATmega8

Ke stažení: lcd.c == lcd.pdf == lcd.htm
.
.


Untitled
/*---------------------------------------------------------------------------

soubor: lcd.c
verze:  1.0
datum:  13.1.2012
popis:

Obsluzne rutiny pro displej 2x16 znaku s radicem HD44780

-Komunikace je ctyrbitova (pouzivaji se pouze piny displeje D4 - D7)
-Displej je v rezimu "pouze zapis" (signal "R/W" displeje je uzemen)
-Displej je pripojen k mikrokontroleru pouze signaly: RS, EN a D4 az D7.


Tento soubor vynikl upravou souboru "mojelib.h" jehoz autora bohuzel neznam.

---------------------------------------------------------------------------*/

#include <avr/pgmspace.h>  // pgm_read_byte()

#ifndef	setb	//setb = makro ze souboru "wait.c"
#include "wait.c"
#endif


//Defaultni definice pinu, ke kterym je displej pripojen
#ifndef PORT_RS
#define PORT_RS 	PORTD
#define DDR_RS 		DDRD
#endif
#ifndef PORT_EN
#define PORT_EN 	PORTD
#define DDR_EN 		DDRD
#endif
#ifndef PORT_D4
#define PORT_D4 	PORTD
#define PORT_D5 	PORTD
#define PORT_D6 	PORTD
#define PORT_D7 	PORTD
#define DDR_D4 		DDRD
#define DDR_D5 		DDRD
#define DDR_D6 		DDRD
#define DDR_D7 		DDRD
#endif
#ifndef   RS
#define		RS 		2
#endif
#ifndef   EN
#define 	EN 		3
#endif
#ifndef   D4
#define 	D4 		4
#define 	D5 		5
#define 	D6 		6
#define 	D7 		7
#endif


// Funkce pro displej:
void lcd_ini  (void);                   //inicializace
void lcd_instr(unsigned char ins);      //napis instrukci
void lcd_char (unsigned char dat);      //napis znak
void lcd_num3  (unsigned int num,unsigned char znak); //napis cislo (3 cifry)
void lcd_num2  (unsigned char num,unsigned char znak);//napis cislo (2 cifry)
//znak = uvodni znak misto nul void lcd_text (char* text); //napis string, umisteny v RAM void lcd_ftext(const char* text); //napis string, umisteny ve FLASH // Makra pro displej: #define lcd_byt(byt) lcd_num3(byt,' ') //napis 3cifry bez pocatecnich nul #define cls() lcd_instr(0x01);wait_ms(3) //vymaz displej #define cursor_off() lcd_instr(0x0c) //vypni kurzor #define cursor_on() lcd_instr(0x0e) //zapni kurzor #define cursor_blink() lcd_instr(0x0f) //kurzor blika #define shift_lcd_left() lcd_instr(0x18) //posun text doleva #define shift_lcd_right() lcd_instr(0x1c) //posun text doprava #define gotoxy(lin,col) lcd_instr(64*((lin)+1)+((col)-1)) //jdi na radek (lin), // sloupec (col) //napis bajt (tri cifry, znak = znak misto uvodnich nul) void lcd_num3(unsigned int num,unsigned char znak) { unsigned char i; num%=1000; //oriznuti desetitisicu i=num/100; //i=stovky if(i==0) //pokud je cislo<100 lcd_char(znak); //zobraz uvodni znak else //jinak { lcd_char(0x30+i);//zobraz stovky (0x30 je v ascii tabulce nula) znak=('0'); //cislo je triciferne dalsi nula jiz neni uvodni } lcd_num2(num,znak); //vypis zbyvajici 2 cislice } //napis cislo (dve cifry, znak = znak misto uvodnich nul) void lcd_num2(unsigned char num,unsigned char znak) { unsigned char i; num%=100; //oriznuti tisicu i=num/10; //i=desitky if(i==0) //pokud je cislo<10 lcd_char(znak); //zobraz uvodni znak else //jinak lcd_char(0x30+i);//zobraz desitky lcd_char(0x30+num%10);//zobraz jednotky } //napis string, umisteny v RAM void lcd_text(char* text) { unsigned char i=0,temp; do { temp = text[i]; if(temp==0) break; //kazdy string je ukonceny nulou lcd_char(temp); i++; } while(temp>0); } //napis string, umisteny ve FLASH void lcd_ftext(const char* text) { unsigned char i=0,temp; do { temp =pgm_read_byte(text+i); //cti bajt z pameti FLASH if(temp==0) break; lcd_char(temp); i++; } while(temp>0); } void len(void) //impuls Enable do LCD { setb(PORT_EN,EN); wait_us(1); clrb(PORT_EN,EN); wait_us(50); } void write(char c) { char temp; temp = c & 0xf0; //vymaskovani hornich ctyrech bitu //vystaveni hornich ctyrech bitu na spravne piny: if(temp&(1<<4)) setb(PORT_D4,D4); else clrb(PORT_D4,D4); if(temp&(1<<5)) setb(PORT_D5,D5); else clrb(PORT_D5,D5); if(temp&(1<<6)) setb(PORT_D6,D6); else clrb(PORT_D6,D6); if(temp&(1<<7)) setb(PORT_D7,D7); else clrb(PORT_D7,D7); len(); //potvrdit (pulz EN) temp = c & 0x0f;//vymaskovani dolnich ctyrech bitu temp <<= 4; //posunuti dolnich 4 bitu na misto hornich 4 bitu //vystaveni dolni poloviny bytu na spravne piny if(temp&(1<<4)) setb(PORT_D4,D4); else clrb(PORT_D4,D4); if(temp&(1<<5)) setb(PORT_D5,D5); else clrb(PORT_D5,D5); if(temp&(1<<6)) setb(PORT_D6,D6); else clrb(PORT_D6,D6); if(temp&(1<<7)) setb(PORT_D7,D7); else clrb(PORT_D7,D7); len(); //potvrdit (pulz EN) } // Napis znak na LCD: void lcd_char(unsigned char dat) { setb(PORT_RS,RS); write(dat); } // Posli instrukci do LCD: void lcd_instr(unsigned char ins) { clrb(PORT_RS,RS); write(ins); } // Inicializace LCD ve 4-bitovem modu void lcd_ini(void) { setb(DDR_D4,D4); setb(DDR_D5,D5); setb(DDR_D6,D6); setb(DDR_D7,D7); setb(DDR_RS,RS); setb(DDR_EN,EN); clrb(PORT_RS,RS); clrb(PORT_EN,EN); wait_ms(16); setb(PORT_D4,D4); setb(PORT_D5,D5); len(); wait_ms(5); len(); wait_us(6); len(); clrb(PORT_D4,D4); len(); lcd_instr(0x28); lcd_instr(0x06); lcd_instr(0x0c); lcd_instr(0x01); wait_ms(3); } //eof //(c) OK1ZKV 2012
 
Poslední aktualizace
 5 January 2016, 07:01 
Webkamera
Webkamera na Blatenském vrchu
Change language
Sociální sít?
Náhodné foto
Podporují nás