?? lcd.c
字號(hào):
/*********************************************************************
* 標(biāo)題: 基于HD44780的1602簡(jiǎn)單驅(qū)動(dòng)(C51)
* 文件: lcd.c
* 作者:
* 參考: AVR單片機(jī)與CPLD/FPGA綜合應(yīng)用入門
* 日期: 2007.5.10
* 修改: 2007.5.26
* 軟件: Keil C51 V8.02
* 芯片: AT89X51
* 說(shuō)明: 硬件連接定義在lcd.h中
*
*********************************************************************/
#include "lcd.h"
// 本地函數(shù)
void lcd_delay_us(unsigned char us) // 延時(shí)微秒@12M,ms最大值255
{
while(--us)
{
;
}
}
void lcd_delay_ms(unsigned char ms) // 延時(shí)毫秒@12M,ms最大值255
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 124; i++)
{
;
}
}
}
// 產(chǎn)生一個(gè)使能脈沖
void lcd_e_toggle(void)
{
LCD_E = 1;
lcd_delay_us(300);
LCD_E = 0;
}
// 循環(huán)檢測(cè)LCD忙標(biāo)志(BF),直到其值為0,方可執(zhí)行下一指令
void lcd_wait_until_finish(void)
{
LCD_RW = 1; // RW置1,狀態(tài)為讀
LCD_RS = 0; // RS置0,讀狀態(tài)時(shí)RS需置低電平
LCD_E = 1; // E 置1,讀取信息
// while(LCD_BF) // 循環(huán)直至BF=0
// {
// ;
// }
LCD_E = 0; // E重置為0
}
// 公共函數(shù)
// 向LCD寫命令字
void lcd_command(unsigned char cmd)
{
LCD_RW = 0; // RW置0,狀態(tài)為寫
LCD_RS = 0; // RS置0,寫入命令字
LCD_DATA_PORT = cmd; // 將命令字cmd送入LCD的數(shù)據(jù)端口
lcd_e_toggle(); // 產(chǎn)生使能脈沖,在下降沿開始執(zhí)行,將命令字讀入
lcd_wait_until_finish(); // 等待執(zhí)行完畢
}
// 設(shè)置顯示位置(即寫入顯示地址),x,y均從0開始
void lcd_goto_xy(unsigned char x, unsigned char y)
{
unsigned char p; // p為字符顯示位置,即DDRAM中的地址
if (y==0)
{
p = 0x00 + x; // (0,0)顯示位置為0x00
}
else
{
p = 0x40 + x; // (0,1)顯示位置為0x40
}
lcd_command(p + 0x80); // 寫入顯示地址時(shí)DB7須為高電平,加0x80
}
// 寫字符(傳入的參數(shù)實(shí)際為所需顯示字符的地址,即液晶字符產(chǎn)生器中字符的地址)
void lcd_putc(unsigned char c)
{
LCD_RW = 0; // RW置0,狀態(tài)為寫
LCD_RS = 1; // RS置1,寫入數(shù)據(jù)
LCD_DATA_PORT = c; // 將字符c(實(shí)際上是字符的地址)送入LCD數(shù)據(jù)端口
lcd_e_toggle(); // 使能脈沖
lcd_wait_until_finish(); // 等待完成
}
// 指定位置寫字符
void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c)
{
lcd_goto_xy(x,y);
lcd_putc(c);
}
// 寫字符串
void lcd_puts(unsigned char *s)
{
while(*s)
{
lcd_putc(*s);
s++;
}
}
// 指定位置寫字符串
void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s)
{
lcd_goto_xy(x, y);
lcd_puts(s);
}
// LCD初始化
void lcd_init(void)
{
lcd_delay_ms(12); // 上電后適當(dāng)延時(shí)
lcd_command(0x38); // 設(shè)為8位接口模式,顯示2行字符
lcd_command(0x06); // 寫入新數(shù)據(jù)后光標(biāo)右移
lcd_command(0x0f); // 顯示功能開,不顯示光標(biāo)
lcd_command(0x01); // 清屏
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -