Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
06/19/03 17:16
Read: times


 
#48836 - RE: lcd on 80c320
Responding to: ???'s previous message

The following code should get you up and running as long as you alter the delays for your CPU ,and the pin assignments for your ports..

/*
/*

***************** LCD 4bit databus routine ***********
R.Redding
PWR Instruments.
File saved as LCD_4bit.c
see LCD_4bit.h for update list.
	
                L.C.D Display 4bit databus 
for             
clock           12.0mhz    (1uS execution cycle)

*/
*/


/***************** Defines *************************************************/
#define 	lcd_on      	1
#define 	lcd_off     	0
#define 	line_two    	0x40//second line of HD44780
#define 	time_out    	12  //12 =2ms based on 1us cycle   

/***************** PIN I/0 *************************************************
from i/o map
#define lcd_port       		P0			
#define lcd_rw_Pin        	P0^0		
#define lcd_enable_Pin  	P0^2	
#define lcd_rs_Pin     		P0^1
/***************** PIN I/0 *************************************************/

#include <main.h>

sbit lcd_rw      		= lcd_rw_Pin;		// LCD read/write
sbit lcd_enable  		= lcd_enable_Pin;	// LCD enable
sbit lcd_rs     		= lcd_rs_Pin;		// LCD register select
/***************** LCD Delays *************************************************/
//based on delays8051.c
void lcd_short_delay(void){//100cycles from entry to exit
delay_us();
delay_us();
}
void lcd_long_delay(void){//1mS
delay_ms(1);
}


/***************** LCD check busy *************************************************
lcd_timeout variable (added 07/2002), used as a  catcher for some optex displays (HD44780 -U 7F3 chip) ,
the routine will exit if busy flag has been lowered or timeout occurred.
Longest  HD44780 instruction is 1.6ms ,so timeout set to 2ms..
/**********************************************************************************/
void lcd_checkbusy(void){
U8 lcd_val,lcd_timeout;
lcd_timeout=0;

#define  __UseTimeout__
#ifdef __UseTimeout__
do {  // wait until lcd is ready
	lcd_port =0xf0;//set upper nibble to input
	lcd_rw = 1;
	lcd_enable = 1;delay_us();lcd_enable = 0;	// toggle data clock 
	lcd_val = lcd_port;  				// read data bus
	delay_us();	
	lcd_enable = 1;lcd_short_delay();lcd_enable = 0;//re-pulse for busy signal
	lcd_timeout++;
 } while((lcd_val & 0x80) && (lcd_timeout<time_out));
#else
do {  // wait until lcd is ready
	lcd_port =0xf0;//set upper nibble to input
	lcd_rw = 1;
	lcd_enable = 1;delay_us();lcd_enable = 0;	// toggle data clock 
	lcd_val = lcd_port;  				// read data bus
	delay_us();	
	lcd_enable = 1;lcd_short_delay();lcd_enable = 0;//re-pulse for busy signal
} while((lcd_val & 0x80));
#endif
}

/***************** LCD send byte *************************************************
Sends data/command byte to LCD , high nibble then low .
/**********************************************************************************/
void lcd_send_byte(U8 lCommand,U8 lData ) {
      U8 nlow,nhigh;
      
      nlow = (lData & 0xf)<<4;
      nhigh = (lData & 0xf0);
      lcd_checkbusy();

      lcd_port =nhigh;
      lcd_rs = lCommand;
      lcd_rw = 0;
      lcd_enable = 1;
      lcd_short_delay();
      lcd_enable = 0;

      lcd_port =nlow;
      lcd_rs = lCommand;
      lcd_rw = 0;
      lcd_enable = 1;
      lcd_short_delay();
      lcd_port = 0;
      lcd_short_delay();

}

/***************** LCD Init sequence ***********************************************
Sends data/command byte to LCD , high nibble then low .
initialises to 28,8,c,6 = 4bit ,2-line ,
power off/on sequence ,no cusor,noblink,increment(+1)
/**********************************************************************************/
void init_lcd(void) {
    U8 i;
    lcd_port=0;

    lcd_long_delay();

    for(i=1;i<=3;++i) {
       lcd_port=0x30;
       delay_ms(10);
       lcd_enable = 1;
       lcd_short_delay();
       lcd_enable = 0;

    }

    lcd_port=0x20;
    lcd_long_delay();
    lcd_enable = 1;
    lcd_short_delay();
    lcd_enable = 0;
    lcd_long_delay();

    lcd_send_byte(1,0x28);
    lcd_long_delay();
    lcd_send_byte(1,0x08);
    lcd_long_delay();
    lcd_send_byte(1,0x0c);
    lcd_long_delay();
    lcd_send_byte(1,0x06);
}

/***************** LCD Higher level ***********************************************
//null terminated strings only
void LCD_send_string(U8 * s){	while(*s)lcd_putc(*s++);
}
/**********************************************************************************/
void lcd_gotoxy(U8 x,U8 y) { // x=horizontal position , y= line 1 or 2,
    U8 lcdaddress;

   if(y!=1)
     lcdaddress=line_two;
   else
     lcdaddress=0;
   lcdaddress+=x-1;
   lcd_send_byte(0,0x80|lcdaddress);
}
//*************************************************************************
void lcd_putc(U8 c) {
   switch (c) {
     case 'f' : lcd_send_byte(0,1);break;		//clear display
     case 'r' : lcd_gotoxy(0,1);break;			//return to 1/1                                     
     case 'n' : lcd_gotoxy(0,2);break;			//newline 1/2
     case 'b' : lcd_send_byte(0,0x10);break;	        //move back one
     default   : lcd_send_byte(1,c);
   }
}



List of 17 messages in thread
TopicAuthorDate
lcd on 80c320            01/01/70 00:00      
   RE: lcd on 80c320            01/01/70 00:00      
      RE: lcd on 80c320... Donatas            01/01/70 00:00      
         RE: lcd on 80c320... Donatas            01/01/70 00:00      
   RE: lcd on 80c320            01/01/70 00:00      
      RE: lcd on 80c320            01/01/70 00:00      
         RE: lcd on 80c320            01/01/70 00:00      
            RE: lcd on 80c320            01/01/70 00:00      
               RE: lcd on 80c320            01/01/70 00:00      
                  RE: lcd on 80c320            01/01/70 00:00      
                     RE: lcd on 80c320            01/01/70 00:00      
                        RE: lcd on 80c320            01/01/70 00:00      
                           RE: lcd on 80c320            01/01/70 00:00      
   RE: lcd on 80c320            01/01/70 00:00      
      RE: lcd on 80c320            01/01/70 00:00      
         RE: backslashes - steve..            01/01/70 00:00      
   RE: lcd on 80c320            01/01/70 00:00      

Back to Subject List