/* * lcd.c * * Created on: May 26, 2017 * Author: acer */ #include"lcd.h" #include #ifdef DRIVERLIBRARY_LCD_H_ void lcd_cmd(char cmd) { //busychck(); clearport(); //lcd_PORT =(lcd_PORT&0x0F)|(cmd&0xF0); lcd_PORT |=(cmd & 0xF0); //HIGHER NIBBLE lcd_PORT &= ~lcd_RS; //RS LOW TO SEND COMMAND lcd_pulse(); clearport(); lcd_PORT |=((cmd&0x0F)<<4); //LOWER nibble //lcd_PORT =(lcd_PORT&0x0F)|((cmd&0x0F)<<4); lcd_PORT &= ~lcd_RS; lcd_pulse(); _delay_cycles(1000); } void lcd_pulse() { ////// IMPRTANT CHANGE HERE //////// /////PROBLEM WAS : Initially enable was going from low to high so it was not printing last character ////Solution : Enable pin should go from high to low to put value on lcd lcd_PORT |= lcd_EN; //EN high _delay_cycles(4000); lcd_PORT&= ~lcd_EN; //EN low _delay_cycles(4000); } void clearport() { lcd_PORT &= (~lcd_PORT_MASK); lcd_PORT &= (~lcd_RS); } void set_cursor_pos(int row,int col) { char addr; if(row==0) addr=0x00; //row 0 then addr=0x00h(RAM addr) else addr=0x40; //row 1 den addr=0x40h addr |=col; //add offset for column lcd_cmd(0x80|addr); //set DDRAM addr for display } void clear_lcd() { lcd_cmd(0x01); //CLEAR DISPLAY //_delay_cycles(1000); lcd_cmd(0x02); //RETURN HOME //_delay_cycles(100000); } void lcd_init() { //lcd_DIR =0XFF; P3DIR=0XFF; P3OUT=0X00; clearport(); //_delay_cycles(10000); lcd_PORT &= ~lcd_EN; //CLEAR EN lcd_PORT &= ~lcd_RS; //CLEAR RS //lcd_PORT=0x20; // lcd_pulse(); //EN HIGH //_delay_cycles(1000); //lcd_cmd(0x01); // to clear screeen lcd_cmd(0x02); lcd_cmd(0x28); //FUNCTION SET- 4 BIT,2 LINE ,5X7 MATRIX //_delay_cycles(1000);\ lcd_cmd(0x0C); //DISPLAY, CURSOR AND BLINK OFF //_delay_cycles(1000); lcd_cmd(0x06); //ENTRY MODE //_delay_cycles(1000);*/ lcd_cmd(0x80); /*lcd_cmd(0x10); //NO SHIFT _delay_cycles(1000); */ } void lcd_data(unsigned char data) { //busychck(); clearport(); lcd_PORT |=(data & 0xF0); //HIGHER NIBBLE lcd_PORT |=lcd_RS; lcd_pulse(); //EN HIGH clearport(); lcd_PORT |=(data&0x0F)<<4; //LOWER nibble lcd_PORT |=lcd_RS; //RS HIGH TO SEND DATA lcd_pulse(); //EN HIGH _delay_cycles(1000); } void display(unsigned char* word) { unsigned char* c; c=word; while((*c!='\0')) { //if(c=='\0') // break; lcd_data(*c); c++; } } void LCD_DISPLAY(unsigned char* str_to_display, int x, int y, int clear_par) { if(clear_par == CLEAR_LCD) clear_lcd(); set_cursor_pos(x, y); display(str_to_display); } void display_hex(unsigned char word, int x, int y) { unsigned char localword1, localword2; localword1 = (int)word/16 + 48; localword2 = (int)word%16 + 48; set_cursor_pos(x,y); lcd_data(localword1); set_cursor_pos(x,y+1); lcd_data(localword2); } /*void busychck() { lcd_DIR &=~BIT7; //bit 7 as input port to read busy chck while((P1IN & BIT7)==1) { } lcd_DIR |=BIT7; //bit 7 as output pin } */ #endif