//-------------------------------------------------------------------- //-- LCD Driver PIC 16F690 8 MHz internal oscillator //-- 2x 16 character HD4470 compatible display //-- //-- //-- //-- //-- //-- //-- Version 0.1 //-- 22.11.2014 P.Viljakainen--- //-------------------------------------------------------------------- #include #include "lcd.h" #include #define E RC2 //ENABLE-bitti (RB0) #define RS RC6 //REGISTER SELECT-bitti (RC3) #define RW RC3 //READ/WRITE-bitti (RB1) //#define busyflag RD3 //#define D7_TrisBit TRISD7 //char number[]=" "; char number[]=" "; char bit8binary[]=" "; void lcd_8bitbinchar(unsigned int num) { if ((num/128)<1) bit8binary[0]=(char)(0x30); else { bit8binary[0]=(char)(0x31); num=num-128; } if ((num/64)<1) bit8binary[1]=(char)(0x30); else { bit8binary[1]=(char)(0x31); num=num-64; } if ((num/32)<1) bit8binary[2]=(char)(0x30); else { bit8binary[2]=(char)(0x31); num=num-32; } if ((num/16)<1) bit8binary[3]=(char)(0x30); else { bit8binary[3]=(char)(0x31); num=num-16; } if ((num/8)<1) bit8binary[4]=(char)(0x30); else { bit8binary[4]=(char)(0x31); num=num-8; } if ((num/4)<1) bit8binary[5]=(char)(0x30); else { bit8binary[5]=(char)(0x31); num=num-4; } if ((num/2)<1) bit8binary[6]=(char)(0x30); else { bit8binary[6]=(char)(0x31); num=num-2; } if ((num/1)<1) bit8binary[7]=(char)(0x30); else { bit8binary[7]=(char)(0x31); } lcd_string(bit8binary); } void lcd_32number(long num) { number[0]=(char)(abs(num/10000000)+0x30); num=num-abs(num/10000000)*10000000; number[1]=(char)(abs(num/1000000)+0x30); num=num-abs(num/1000000)*1000000; number[2]=(char)(abs(num/100000)+0x30); num=num-abs(num/100000)*100000; number[3]=(char)(abs(num/10000)+0x30); //laskee vastaavan ascii-koodin, eniten merk.nro num=num-abs(num/10000)*10000; number[4]=(char)(abs(num/1000)+0x30); //laskee vastaavan ascii-koodin, seuraava nro num=num-abs(num/1000)*1000; number[5]=(char)(abs(num/100)+0x30); num=num-abs(num/100)*100; number[6]=(char)(abs(num/10)+0x30); num=num-abs(num/10)*10; number[7]=(char)(num+0x30); lcd_string(number); } void lcd_16number(unsigned int num) { number[0]=(char)(abs(num/10000)+0x30); //laskee vastaavan ascii-koodin, eniten merk.nro num=num-abs(num/10000)*10000; number[1]=(char)(abs(num/1000)+0x30); //laskee vastaavan ascii-koodin, seuraava nro num=num-abs(num/1000)*1000; number[2]=(char)(abs(num/100)+0x30); num=num-abs(num/100)*100; number[3]=(char)(abs(num/10)+0x30); num=num-abs(num/10)*10; number[4]=(char)(num+0x30); lcd_string(number); } void lcd_string(const char *s) { while(*s != '\0') { lcd_char(*s); s++; } } void lcd_goto(unsigned char pos) { RS = 0; lcd_cmd(0x80+pos); } void lcd_busy(unsigned char kerta) { int x,y; for(x=0;x> 4; //shift over to output high 4 bits RS = 0; //RS low e_togg(); //latch the data lcd_busy(1); PORTB = letter<<4; //PORTB=PORTB<<4; RS = 0; //RS low e_togg(); //latch it } void lcd_char(char letter) { lcd_busy(1); PORTB = letter; //put char in PORTB //PORTB = PORTB >> 4; //shift over to output high 4 bits RS = 1; //RS high e_togg(); //latch the data lcd_busy(1); PORTB = letter<<4; //PORTB=PORTB<<4; RS = 1; //RS high e_togg(); //latch it } void lcd_init(void) { RS=0; // Register Select 0= Command RW = 0; //set R/W low E = 0; //set E low delay(); PORTB = 0x03<<4; //send 3 shifted <<4 //PORTB=PORTB<<4; e_togg(); lcd_busy(20); // At least 5ms wait PORTB = 0x03<<4; //PORTB=PORTB<<4; e_togg(); lcd_busy(1); // At least 200 uS wait PORTB = 0x03<<4; //PORTB=PORTB<<4; e_togg(); lcd_busy(1); // At least 200 uS wait PORTB = 0x02<<4; //send 2 - set 4-bit mode //PORTB=PORTB<<4; e_togg(); lcd_busy(20); // At least 5ms wait lcd_cmd(0x28); //set 4-bit mode and 2 lines lcd_busy(2); lcd_cmd(0x10); //cursor move & shift left lcd_busy(2); lcd_cmd(0x06); //entry mode = increment lcd_busy(2); lcd_cmd(0x0d); //display on - cursor blink on lcd_busy(2); lcd_cmd(0x01); //clear display lcd_busy(2); } void e_togg(void) { E=1; E=0; } void delay(void) { int x,y; for(x=0;x<1;x++) { for(y=0;y<10000;y++){} } }