Witam, zaczynam zabawę z avrstudio4 , znalazlem na elektrodzie program obsługi lcd i mam kłopot. Potrafię wyświetlić tekst, ale jak wyświetlić zmienną a ? Listing poniżej:
------------------------------------------------------------------------------------- #include <avr/io.h>
#include <util/delay.h>
#include <string.h>
//Tu należy zdefiniować piny , używane do sterowania wyśw. LCD //Sygnał R/W podpięty na stałe do GND #define RSPIN PC1 //numer bitu dla linii RS #define EPIN PC0 #define D4PIN PB0 #define D5PIN PD7 #define D6PIN PD6 #define D7PIN PD5
#define RSPORT PORTC //port do którego podłączono linię RS #define EPORT PORTC #define D4PORT PORTB #define D5PORT PORTD #define D6PORT PORTD #define D7PORT PORTD
#define RSDDR DDRC //port konfiguracyjny linii RS #define EDDR DDRC #define D4DDR DDRB #define D5DDR DDRD #define D6DDR DDRD #define D7DDR DDRD //koniec definicji pinów LCD
//Takie sobie uproszczenia ;) #define SET_D4 D4PORT|=(1<<D4PIN) #define SET_D5 D5PORT|=(1<<D5PIN) #define SET_D6 D6PORT|=(1<<D6PIN) #define SET_D7 D7PORT|=(1<<D7PIN)
#define CLR_D4 D4PORT&=~(1<<D4PIN) #define CLR_D5 D5PORT&=~(1<<D5PIN) #define CLR_D6 D6PORT&=~(1<<D6PIN) #define CLR_D7 D7PORT&=~(1<<D7PIN)
#define SET_E EPORT|=(1<<EPIN) #define CLR_E EPORT&=~(1<<EPIN) #define SET_RS RSPORT|=(1<<RSPIN) #define CLR_RS RSPORT&=~(1<<RSPIN) #define CLRDISP 0x01 #define HOMEDISP 0x02 //koniec uproszczeń
void LCDresetdata(void) //wyzeruj szynę danych LCD { CLR_D4; CLR_D5; CLR_D6; CLR_D7; } void LCDwrite(char d) //zapis bajtu do LCD { LCDresetdata(); if(d & 0x10){SET_D4;} if(d & 0x20){SET_D5;} if(d & 0x40){SET_D6;} if(d & 0x80){SET_D7;} SET_E;CLR_E; LCDresetdata(); if(d & 0x01){SET_D4;} if(d & 0x02){SET_D5;} if(d & 0x04){SET_D6;} if(d & 0x08){SET_D7;} SET_E;CLR_E; _delay_ms(2); } void LCDconfigIO(void) //wszystkie piny do których podłączony jest LCD jako wyjście { RSDDR|=(1<<RSPIN);EDDR|=(1<<EPIN);D4DDR|=(1<<D4PIN); D5DDR|=(1<<D5PIN);D6DDR|=(1<<D6PIN);D7DDR|=(1<<D7PIN); } void LCDcmd(char d) //Wyślij komendę do LCD { CLR_RS; LCDwrite(d); } void LCDchr(char d) //Wyślij 1 znak do LCD { SET_RS; LCDwrite(d); } void LCDinit(void) //inicjalizacja LCD { LCDconfigIO(); CLR_RS; CLR_E; _delay_ms(20); CLR_D7; CLR_D6; SET_D4; SET_D5; unsigned char i; for(i=0;i<3;i++) {SET_E;CLR_E;_delay_ms(5);} CLR_D4; SET_E; CLR_E; _delay_ms(5); LCDcmd(0x28); //function set - interface=4 bit,line=2,font=5x7 LCDcmd(0x0c); //display ctrl - display on LCDcmd(0x06); //entry mode set - increment LCDcmd(0x01); //clear display
} //wyczyść wyśw. void LCDcls(void) {LCDcmd(CLRDISP);} //ustaw kursor na pozycji 0,0 void LCDhome(void) {LCDcmd(HOMEDISP);} //wyślij tekst z RAM na wyśw. void LCDtext(char *txt) {while(*txt) {LCDchr(*txt++);}} //umieść kursor na pozycji x,y - brak kontroli dla x i y void LCDxy(char x,char y) { unsigned char com=0x80; com|=(x|(y<<6)); LCDcmd(com); }
// program główny int main(void) {
LCDinit(); while(1) { unsigned char a=4; _delay_ms(300); LCDxy(0,0); LCDtext("ff"); _delay_ms(300); LCDcls(); } return 0; }