/********************************************************
------------------------LCD命令函数----------------------
功能描述:被调用,用来执行对LCD的操作
*********************************************************/
void lcd_command()
{
_asm NOP
_asm NOP
LCD_EN=1; //LCD开始接受数据,置使能位为1
_asm NOP //等待
_asm NOP
LCD_EN=0; //LCD结束接受数据,置使能位为0
asm //等待40us
{
PSHH
PSHX
PSHA
LDHX #$0020
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
/********************************************************
------------------------LCD功能设置----------------------
功能描述:将LCD设置成8位数据接口,1行显示,5*10点阵模式,并将
全局变量lcd_data[16]全部清为空白
全局变量:lcd_data[16]
调用函数:lcd_command()
*********************************************************/
void lcd_1_line_display()
{
byte i;
LCD_DB=0x34; //功能设置:8位数据接口,1行显示,5*10点阵模式
asm //等待20us
{
PSHH
PSHX
PSHA
LDHX #$0010
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
lcd_command();
for(i=0;i<16;i++)
{
lcd_data[i]=' ';
}
}
/********************************************************
------------------------LCD功能设置----------------------
功能描述:将LCD设置成8位数据接口,2行显示,5*7点阵模式,并将
全局变量lcd_data[2][16]全部清为空白
全局变量:lcd_data[2][16]
调用函数:lcd_command()
*********************************************************/
void lcd_2_line_display()
{
byte i,j;
LCD_DB=0x38; //功能设置:8位数据接口,2行显示,5*7点阵模式
asm //等待20us
{
PSHH
PSHX
PSHA
LDHX #$0010
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
lcd_command();
for(j=0;j<2;j++) //将lcd_data[2][16]全部清为空白
{
for(i=0;i<16;i++)
{
lcd_data[j][i]=' ';
}
}
}
/********************************************************
------------------------LCD显示设置----------------------
功能描述:将LCD设置成不同的显示模式
传入参数:cursor_display
参数设置:cursor_display=0b00000011
开显示,开光标显示,闪烁
cursor_display=0b00000010
开显示,开光标显示,不闪烁
cursor_display=0b00000001
开显示,关光标显示,闪烁
cursor_display=0b00000000
开显示,关光标显示,不闪烁
调用函数:lcd_command()
*********************************************************/
void lcd_cursor(byte cursor_display)
{
switch(cursor_display)
{
case 0b00000011:
LCD_DB=0b00001111; //显示开关控制:开显示,开光标显示,闪烁
lcd_command();
break;
case 0b00000010:
LCD_DB=0b00001110; //显示开关控制:开显示,开光标显示,不闪烁
lcd_command();
break;
case 0b00000001:
LCD_DB=0b00001101; //显示开关控制:开显示,关光标显示,闪烁
lcd_command();
break;
case 0b00000000:
LCD_DB=0b00001100; //显示开关控制:开显示,关光标显示,不闪烁
lcd_command();
break;
}
}
/********************************************************
------------------------LCD显示关闭----------------------
功能描述:将LCD显示关掉
调用函数:lcd_command()
*********************************************************/
void lcd_display_off()
{
LCD_DB=0b00001000; //显示开关设置:关显示,关光标显示,不闪烁
lcd_command();
}
/********************************************************
------------------------LCD清屏--------------------------
功能描述:将LCD清屏,DD RAM的内容全部被清除,光标回原位,
地址计数器AC=0
调用函数:lcd_command()
*********************************************************/
void lcd_clear_display()
{
LCD_DB=0x01; //清屏指令
lcd_command();
asm //等待清屏完毕,等待时间>1.6ms
{
LDHX #$2DF
ClrLCD_2MS:
AIX #-1
CPHX #0
BNE ClrLCD_2MS
}
}
/********************************************************
------------------------LCD初始化------------------------
功能描述:将LCD初始化
调用函数:lcd_command()
lcd_2_line_display()
lcd_cursor(byte cursor_display)
lcd_clear_display()
*********************************************************/
void init_lcd()
{
LCD_RS=0; //令LCD的RS=0,R/W=0,进行LCD初始化
LCD_RW=0;
lcd_2_line_display();
lcd_cursor(0b11);
lcd_clear_display();
LCD_DB=0x06; //输入方式设置:数据读写操作后,AC自动增1,显示不动,光标左移
lcd_command();
LCD_DB=0x14; //光标移位设置:光标右移一个字符位,AC自动加1
lcd_command();
}
/********************************************************
------------------------LCD一行显示----------------------
功能描述:将data[16]中的数据显示在LCD上
传入参数:data[16]
调用函数:lcd_command()
*********************************************************/
void show_lcd_1_line(byte data[16])
{
byte i;
i=0;
LCD_RS=0; //令LCD的RS=0,R/W=0,进行显示数据寄存器(DD RAM)地址设置
LCD_RW=0;
LCD_DB=0x80; //设置前16个字符首DD RAM地址
lcd_command();
LCD_RS=1; //令LCD的RS=1,R/W=0,写入数据到DD RAM中
LCD_RW=0;
while(i<16)
{
LCD_DB=data[i]; //将数据data[i]放入LCD_DB口作为LCD的输入
lcd_command();
i++;
}
}
/********************************************************
------------------------LCD两行显示----------------------
功能描述:将data[2][16]中的数据显示在LCD上
传入参数:data[2][16]
调用函数:lcd_command()
*********************************************************/
void show_lcd_2_line(byte data[2][16])
{
byte i;
i=0;
LCD_RS=0; //令LCD的RS=0,R/W=0,进行显示数据寄存器(DD RAM)地址设置
LCD_RW=0;
LCD_DB=0x80; //设置前16个字符首DD RAM地址
lcd_command();
LCD_RS=1; //令LCD的RS=1,R/W=0,写入数据到DD RAM中
LCD_RW=0;
while(i<16)
{
LCD_DB=data[0][i]; //将数据data[0][i]放入LCD_DB口作为LCD的输入
lcd_command();
i++;
}
//-------------------------------------------//
i=0;
LCD_RS=0; //令LCD的RS=0,R/W=0,进行显示数据寄存器(DD RAM)地址设置
LCD_RW=0;
LCD_DB=0xc0; //设置后16个字符首DD RAM地址
lcd_command();
LCD_RS=1; //令LCD的RS=1,R/W=0,写入数据到DD RAM中
LCD_RW=0;
while(i<16)
{
LCD_DB=data[1][i]; //将数据data[1][i]放入LCD_DB口作为LCD的输入
lcd_command();
i++;
}
}
应用实例:
一个LCD两行5*7显示的程序
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define LCD_DB PTB
#define LCD_RS PTC_PTC0
#define LCD_RW PTC_PTC1
#define LCD_EN PTC_PTC2
byte lcd_data[2][16];
void lcd_command();
void lcd_2_line_display();
void lcd_cursor(byte cursor_display);
void lcd_clear_display();
void init_lcd();
void show_lcd_2_line(byte data[2][16]);//在这个函数里最好将第二个循环的次数设成10,以便观察光标及闪烁.
void main(void)
{
CONFIG1=0x01; //禁止看门狗
DDRB=0xff; //B口为输出
DDRC=0x07; //C口的PTC0-2为输出
init_lcd();
lcd_data[0][0]=0x31;
lcd_data[1][0]=0x32;
show_lcd_2_line(lcd_data);
for(;;);
}
一个LCD一行5*10显示的程序
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define LCD_DB PTB
#define LCD_RS PTC_PTC0
#define LCD_RW PTC_PTC1
#define LCD_EN PTC_PTC2
byte lcd_data[16];
void lcd_command();
void lcd_1_line_display();
void lcd_cursor(byte cursor_display);
void lcd_clear_display();
void init_lcd(); //注意要将这里的show_lcd_2_line改成show_lcd_1_line
void show_lcd_1_line(byte data[16]); //在这个函数里最好将循环的次数设成10,以便观察光标及闪烁.
void main(void)
{
CONFIG1=0x01; //禁止看门狗
DDRB=0xff; //B口为输出
DDRC=0x07; //C口的PTC0-2为输出
init_lcd();
lcd_data[0]=0x31;
lcd_data[1]=0x32;
show_lcd_1_line(lcd_data);
for(;;);
}