| ??? 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);
}
}
|
| Topic | Author | Date |
| 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 |



