|
发表于 2005-1-9 23:45:43
|
显示全部楼层
我正好写过一个,不过是4位的。
//********************************************
//7920中文LCD屏,带中文字库
//联接: LCD MEGA128
// RS ----- PORTC.0
// RD ----- PORTC.1
// EN ----- PORTC.2
// DB4 ----- PORTC.4
// DB5 ----- PORTC.5
// DB6 ----- PORTC.6
// DB7 ----- PORTC.7
//********************************************
#define LCD_RS PORTC.0
#define LCD_RD PORTC.1
#define LCD_EN PORTC.2
#define LCD_DB PORTC
//********************************************
//将数据输出到LCD接口,LCD数据口宽度为4bit
//rs: 1 操作指令寄存器,0 操作数据寄存器
//rd: 1 从LCD读出数据, 0 向LCD写数据
//db: 要写入的数据,仅底4位有效
//********************************************
void lcd_setport(char rs,char rd,char db)
{
//unsigned char temp;
db=db<<4;
LCD_RS=rs;
LCD_RD=rd;
delay_us(20);
LCD_EN=1;
delay_us(10);
LCD_DB=LCD_DB&0x0F;
LCD_DB=LCD_DB|db;
//LCD_DB=db;
delay_us(10);
LCD_EN=0;
delay_us(20);
}
//********************************************
//LCD功能设定,LCD数据口宽度为4bit
//re: 1扩展指令, 0 基本指令
//********************************************
void lcd_function_set(char re)
{
char db;
db=db|(re<<2);
lcd_setport(0,0,0x02);
lcd_setport(0,0,db);
}
//********************************************
// LCD软件复位
//********************************************
void lcd_reset(void)
{
#asm("cli")
lcd_setport(0,0,0x03);
delay_ms(10);
lcd_setport(0,0,0x03);
delay_us(200);
lcd_setport(0,0,0x03);
delay_us(20);
lcd_setport(0,0,0x03);
delay_us(20);
lcd_function_set(0); //使用LCD基本指令
#asm("sei")
}
//**********************************************
//LCD开关设定
//display: 1 显示开, 0 显示关
//cursor: 1 光标开, 0 光标关
//blink: 1 光标处字符闪动开, 光标处字符闪动关
//**********************************************
void lcd_on_off(char display,char cursor,char blink)
{
char db;
db=0x08|(display<<2)|(cursor<<1)|blink;
lcd_setport(0,0,0x00);
lcd_setport(0,0,db);
}
//**********************************************
//LCD 清屏
//**********************************************
void lcd_clear(void)
{
lcd_setport(0,0,0x00);
lcd_setport(0,0,0x01);
delay_ms(7);
}
//**********************************************
//LCD显示回原点,设DDRAM地址为0,DDRAM内容不变
//**********************************************
void lcd_return_home(void)
{
lcd_setport(0,0,0x00);
lcd_setport(0,0,0x02);
}
//**********************************************
//输入方式设定,设定光标移动方向并指定整体是否移动
//id :1 增量方式, 0 减量方式
//s: 1 写入后整体移动,0 不移动
//**********************************************
void lcd_entry_mode(char id,char s)
{
char db;
db=0x04|(id<<1)|s;
lcd_setport(0,0,0x00);
lcd_setport(0,0,db);
}
//**********************************************
//移动光标或整体
//s_c: 1 整体显示移位,0 光标移动
//r_l: 1 左移, 0 右移
//**********************************************
void lcd_cour_disp_shift(char s_c,char r_l)
{
char db;
db=db|(s_c<<3)|(r_l<<2);
lcd_setport(0,0,0x01);
lcd_setport(0,0,db);
}
//**********************************************
//读取当前显示位置
//**********************************************
char lcd_read_address(void)
{
char address,address_l;
LCD_EN=0;
LCD_RS=0;
delay_us(5);
LCD_RD=1;
delay_us(5);
LCD_EN=1;
DDRC=0x07;
delay_us(5);
address=PINC&0x70;
LCD_EN=0;
delay_us(5);
LCD_EN=1;
delay_us(5);
address_l=PINC&0xF0;
address_l= address_l>>4;
address=address|address_l|0x80;
LCD_EN=0;
LCD_RD=0;
PORTC&=0x08;
DDRC|=0xF7;
return address;
}
//**********************************************
//设定CGRAM地址
//**********************************************
void lcd_set_cgram_address(char address)
{
char db;
db=0x04|(address>>4);
lcd_setport(0,0,db);
db=address;
lcd_setport(0,0,db);
}
//**********************************************
//设定DDRAM地址
//*********************************************
void lcd_set_ddram_address(char address)
{
char db;
db=(0x08|(address>>4))&0x0B;
lcd_setport(0,0,db);
db=address;
lcd_setport(0,0,db);
}
//**********************************************
//写数据到CGRAM 或DDRAM
//**********************************************
void lcd_write_ram(char data)
{
char db;
db=data>>4;
lcd_setport(1,0,db);
lcd_setport(1,0,data);
}
//**********************************************
//LCD初始化
//**********************************************
void lcd_inital(void)
{
//lcd_reset();
#asm("cli")
lcd_setport(0,0,0x03);
delay_ms(10);
lcd_setport(0,0,0x03);
delay_us(200);
lcd_setport(0,0,0x03);
delay_us(20);
lcd_setport(0,0,0x03);
delay_us(20);
// lcd_function_set(0); //使用LCD基本指令
lcd_setport(0,0,0x02);
lcd_setport(0,0,0x00);
// lcd_setport(0,0,0x02);
// lcd_on_off(1,1,0);
delay_us(10);
lcd_setport(0,0,0x00);
lcd_setport(0,0,0x0E);
// lcd_clear();
delay_us(10);
lcd_setport(0,0,0x00);
lcd_setport(0,0,0x01);
delay_us(10);
//lcd_entry_mode(1,0);
lcd_setport(0,0,0x00);
lcd_setport(0,0,0x06);
#asm("sei")
delay_ms(5);
}
//**********************************************
//设定显示位置
// x 列位置,范围1-8
// y 行位置,范围1-4
//**********************************************
void lcd_gotoxy(char x,char y)
{
char address;
switch ( y )
{
case 1:
address=0x80+x-1;
break;
case 2:
address=0x90+x-1;
break;
case 3:
address=0x88+x-1;
break;
case 4:
address=0x98+x-1;
break;
default: break;
}
lcd_set_ddram_address(address);
}
//**********************************************
//显示一个字符
//**********************************************
void lcd_putc(unsigned char c)
{
lcd_write_ram(c);
}
//**********************************************
//显示一个字符串
//**********************************************
void lcd_putsf(char flash *str)
{
char address;
for(;;)
{
if((*str)==0)
break;
else
{
address=lcd_read_address();
if(address==0x87)
{
lcd_putc(*str);
str++;
if(*str==0)
break;
lcd_putc(*str);
str++;
if(*str==0)
break;
lcd_gotoxy(1,2);
}
if(address==0x97)
{
lcd_putc(*str);
str++;
if(*str==0)
break;
lcd_putc(*str);
str++;
if(*str==0)
break;
lcd_gotoxy(1,3);
}
if(address==0x8F)
{
lcd_putc(*str);
str++;
if(*str==0)
break;
lcd_putc(*str);
str++;
if(*str==0)
break;
lcd_gotoxy(1,4);
}
lcd_putc(*str);
str++;
}
}
}
//**********************************************
//在指定行显示一个字符串,
//字符串长度小于16个字符或8个汉字
//**********************************************
void lcd_putsf_line(char flash *str,char line)
{
char i;
lcd_gotoxy(1,line);
for(i=0;i<=15;i++)
{
if(*str==0)
break;
else
{
lcd_putc(*str);
str++;
}
}
lcd_on_off(1,0,0);
}
//**********************************************
//整屏显示一个字符串,
//字符串长度小于64个字符或32个汉字
//**********************************************
void lcd_put_page(char flash *str)
{
lcd_clear();
lcd_gotoxy(1,1);
lcd_putsf(str);
} |
|