#include #include #include #include #include #include #define PORTADDRESS 0x378 /* Enter Your Port Address Here */ #define DATA PORTADDRESS+0 #define STATUS PORTADDRESS+1 #define CONTROL PORTADDRESS+2 void moutp(unsigned int port, unsigned char value) { // asm ("mov %dx,_port"); // asm ("mov %al,_value"); asm ("out %%al,%%dx" : : "dx" (port), "al" (value) ); } unsigned char minp(unsigned int port) { unsigned char navrat; // asm (" mov %DX,_port"); asm (" in %%dx,%%al" : "=al" (navrat) : "dx" (port)); // asm (" mov _navrat,%al" : "=&al" (navrat) : "dx" (port)); return navrat; } void lcd_set_e(int nastav) { if (nastav == 0) moutp(CONTROL, minp(CONTROL) | 0x08); /* Set Select Printer (Register Select) */ else moutp(CONTROL, minp(CONTROL) & 0xF7); /* Reset Select Printer (Register Select) */ } void lcd_pulse_e() { lcd_set_e(1); Sleep(1); lcd_set_e(0); } // 1 - data input // 0 - register input void lcd_set_rs(int nastav) { if (nastav == 0) moutp(CONTROL,minp(CONTROL) | 0x01); /* Set Strobe */ else moutp(CONTROL,minp(CONTROL) & 0xFE); /* ReSet Strobe */ } unsigned char shk( unsigned char x ) { return x; unsigned char y; y = 0; if (x & 1) y += 2; if (x & 2) y += 1; if (x & 4) y += 4; if (x & 8) y += 8; printf("x %d x",y); return y; } void lcd_zapis(unsigned char val, int prikaz, int bit8) { unsigned char zap; if (prikaz ) lcd_set_rs(0); else lcd_set_rs(1); if ( bit8 ) { // horni 4 bit zap = (val & 0xf0)/ 16; moutp(DATA, shk(zap)); lcd_pulse_e(); } else { // horni 4 bit zap = (val & 0xf0)/ 16; moutp(DATA, shk(zap)); lcd_pulse_e(); // dolni 4 bit zap = val & 0x0f; moutp(DATA, shk(zap)); lcd_pulse_e(); } if ( prikaz ) printf("prikaz,8:%d, %d, \n",bit8,val); else printf("data ,8:%d, %d, \n",bit8,val); } void lcd_init() { // inicializace LCD lcd_zapis(0,0,1); lcd_set_rs(0); lcd_set_e(0); //lcd_set_power(0); Sleep(1); // cekej nez se vyresetuje printf("zapnuti lcd\n"); //lcd_set_power(1); // pri zapnuti se provede init getchar(); Sleep(16); // po power on se ma cekat min. 15ms lcd_zapis(0x30,1,1); // zapis 8bitove 0x30 Sleep(5); // ma se cekat min. 4.1 ms lcd_zapis(0x30,1,1); // zapis 8bitove 0x30 Sleep(1); // ma se cekat min. 100 us lcd_zapis(0x30,1,1); // zapis 8bitove 0x30 Sleep(5); // ma se cekat min. 4.1 ms // nastav 4 bit komunikaci - neustale dalsi bity se ztraceji lcd_zapis(0x20,1,1); // zapis 8bitove 0x20 Sleep(1); // ma se cekat min. 40 us // nyni se jiz komunikuje 4 bitove tj. 2 x 4 bity lcd_zapis(0x28,1,0); // zapis 4 bitove Sleep(1); // ma se cekat min. 40 us // display off, cursor off, blink off lcd_zapis(0x08,1,0); // zapis 4 bitove Sleep(1); // ma se cekat min. 40 us // clear screen, cursor home lcd_zapis(0x01,1,0); // zapis 4 bitove Sleep(2); // ma se cekat min. 1.64 ms // increment cursor to the right when writing, do not shift screen lcd_zapis(0x06,1,0); // zapis 4 bitove Sleep(1); // ma se cekat min. 40 us } void main(void) { long r,c,x; unsigned char d; lcd_init(); // //LCD 4 bit, dva radky, 5x8 bodu // lcd_zapis(0x28,1,0); // getchar(); // //LCD ON OK // lcd_zapis(0xF,1,0); // getchar(); // for (x=0; x < 40; x++) // { // lcd_zapis('D',0,0); // lcd_zapis(10,0,0); // Sleep(1); // } // getchar(); // lcd_zapis(2,1,1); Sleep(2); // lcd_zapis(0,1,0); Sleep(2); // lcd_zapis(0x20,1,0); Sleep(2); ////LCD ON OK lcd_zapis(0xF,1,0); getchar(); /* srand(3251); c = 5; while ( 1 == 1 ) { r=c; d = r / 2; // zapis_8b(d, 1,0); lcd_zapis(d, r & 1,0); c++; printf(" %ld ",c); // d = getchar(); d = 0; if ( d == 'c' ) while (1 == 1) { d = getchar(); if (d == 'c') break; lcd_zapis(d,0,0); } if ( d == 'k' ) break; if (c > 25) break; Sleep(2); } getchar(); /* while (1 == 1) { d = getchar(); if (d == 'c') break; lcd_zapis(d,0,0); } */ for (x=0; x < 40; x++) { lcd_zapis('A',0,0); lcd_zapis(10,0,0); Sleep(1); } getchar(); //// vymaz OK //lcd_zapis(1,1,0); ////LCD OFF OK ////lcd_zapis(8,1,0); ////LCD ON OK //lcd_zapis(0xF,1,0); //LCD 4 bit, dva radky, 5x8 bodu lcd_zapis(0x28,1,0); getchar(); for (x=0; x < 40; x++) { lcd_zapis('B',0,0); lcd_zapis(10,0,0); Sleep(1); } getchar(); /* // nyni se jiz komunikuje 4 bitove tj. 2 x 4 bity lcd_zapis(0x28,1,1); // zapis 4 bitove Sleep(16); // ma se cekat min. 40 us getchar(); // display off, cursor off, blink off lcd_zapis(0x08,1,1); // zapis 4 bitove Sleep(16); // ma se cekat min. 40 us getchar(); */ getchar(); // vypni LCD lcd_zapis(0x08,1,0); Sleep(2); getchar(); // zapni LCD lcd_zapis(0x0A,1,0); Sleep(2); getchar(); // clear screen, cursor home lcd_zapis(0x01,1,1); // zapis 4 bitove Sleep(16); // ma se cekat min. 1.64 ms getchar(); // increment cursor to the right when writing, do not shift screen lcd_zapis(0x06,1,1); // zapis 4 bitove Sleep(16); // ma se cekat min. 40 us getchar(); // zapni,kurz + blikani lcd_zapis(0x0f,1,0); Sleep(2); getchar(); // kurzor na prvni pozici //zapis_8b(0x01,1,0); //Sleep(2); //getchar(); // zapis D lcd_zapis('0',0,0); Sleep(2); lcd_zapis('1',0,0); Sleep(2); lcd_zapis('2',0,0); Sleep(2); lcd_zapis('3',0,0); Sleep(2); lcd_zapis('4',0,0); Sleep(2); lcd_zapis('5',0,0); Sleep(2); lcd_zapis('6',0,0); Sleep(2); lcd_zapis('7',0,0); Sleep(2); lcd_zapis('8',0,0); Sleep(2); lcd_zapis('9',0,0); Sleep(2); lcd_zapis(':',0,0); Sleep(2); lcd_zapis(';',0,0); Sleep(2); lcd_zapis('<',0,0); Sleep(2); lcd_zapis('=',0,0); Sleep(2); lcd_zapis('>',0,0); Sleep(2); lcd_zapis('?',0,0); Sleep(2); lcd_zapis('@',0,0); Sleep(2); lcd_zapis('A',0,0); Sleep(2); getchar(); // vypni lcd_zapis(0x08,1,0); Sleep(2); getchar(); }