/* * File: lcd.c * Author: Pekka Viljakainen * PIC16F690 * INTERNAL OSC 8 MHz * Runs OK PIC16F877A / 20MHz * Compiler XC8 * Created on 9. helmikuuta 2018, 17:13 */ #include #include "lcd.h" #include "delay.h" //#include "rs232.h" #include #define E RD2 //ENABLE-bitti #define RS RD0 //REGISTER SELECT-bitti #define RW RD1 //READ/WRITE-bitti //#define busyflag RA3 #define D0 RD3 //Databit 0 #define D1 RC4 //Databit 1 #define D2 RC5 //Databit 2 #define D3 RD4 //Databit 4 //#define D7_TrisBit TRISD7 //char number[]=" "; char number[]=" "; char bit8binary[]=" "; extern bit negative; 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_signed_char(signed char num) { negative=((num & 0x80)>>7); if (negative ==1) { number[0]=(char)(0x2D); num=num*-1; } if (negative ==0) number[0]=(char)(0x2B); number[1]=(char)(abs(num/100)+0x30);//laskee vastaavan ascii-koodin, MS num=num-abs(num/100)*100;//laskee vastaavan ascii-koodin, seuraava nro number[2]=(char)(abs(num/10)+0x30); num=num-abs(num/10)*10; number[3]=(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; //high nibble first D1= (letter & 0x20)>>5; D2= (letter & 0x40)>>6; D3= (letter & 0x80)>>7; RS = 0; //RS low e_togg(); //latch the data lcd_busy(2); D0= (letter & 0x1); //low nibble then D1= (letter & 0x2)>>1; D2= (letter & 0x4)>>2; D3= (letter & 0x8)>>3; RS = 0; //RS low e_togg(); //latch it } void lcd_char(char letter) { lcd_busy(2); D0= (letter & 0x10)>>4; //high nibble first D1= (letter & 0x20)>>5; D2= (letter & 0x40)>>6; D3= (letter & 0x80)>>7; RS = 1; //RS high e_togg(); //latch the data lcd_busy(2); D0= (letter & 0x1); //low nibble then D1= (letter & 0x2)>>1; D2= (letter & 0x4)>>2; D3= (letter & 0x8)>>3; //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(); D0= 1; //send 3 D1= 1; D2= 0; D3= 0; //send 3 shifted <<4 e_togg(); lcd_busy(40); // At least 5ms wait D0= 1; //send 3 D1= 1; D2= 0; D3= 0; e_togg(); lcd_busy(2); // At least 200 uS wait D0= 1; //send 3 D1= 1; D2= 0; D3= 0; e_togg(); lcd_busy(2); // At least 200 uS wait D0= 0; //send 2 D1= 1; D2= 0; D3= 0; e_togg(); lcd_busy(40); // 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++){} } }