?? 【046】基于hd44780的1602簡單驅(qū)動(c51).txt
字號:
[相關(guān)] (001)基于HD44780液晶芯片的16×2字符型液晶(1602)簡介。
--------------------------------------------------------------------------------
lcd.h:
/*********************************************************************
* 標題: 基于HD44780的1602簡單驅(qū)動(C51)
* 文件: lcd.h
* 作者: wentao http://blog.liuwentao.net
http://wentao.programfan.com
* 參考: AVR單片機與CPLD/FPGA綜合應用入門
* 日期: 2007.5.10
* 修改: 2007.5.26
* 軟件: Keil C51 V8.02
* 芯片: AT89X51
* 說明: 硬件連接定義及函數(shù)原型聲明,此處P0,P2,P2_0等在AT89X51.h中定義,
也可用sfr, sbit自行定義。
* 聲明: 自用存檔!另僅供需要的朋友參考,請勿用做不道德轉(zhuǎn)載及商業(yè)用途!
*********************************************************************/
#ifndef LCD_H
#define LCD_H
#include <AT89X51.h>
#define LCD_DATA_PORT P0 // 液晶BD0~BD7與P0口相連
#define LCD_RS P2_0 // 液晶 RS 引腳與P2.0相接
#define LCD_RW P2_1 // 液晶 R/W 引腳與P2.1相接
#define LCD_E P2_2 // 液晶 E 引腳與P2.2相接
#define LCD_BF P0_7 // 液晶 DB7 引腳與P0.7相接 Busy Flag
// 函數(shù)原型
// 向LCD寫命令字
extern void lcd_command(unsigned char cmd);
// 設(shè)置顯示位置(即寫入顯示地址),行列均從0開始
extern void lcd_goto_xy(unsigned char x, unsigned char y);
// 寫字符(傳入的參數(shù)實際為所需顯示字符的地址,即液晶字符產(chǎn)生器中字符的地址)
extern void lcd_putc(unsigned char c);
// 指定位置寫字符
extern void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c);
// 寫字符串
extern void lcd_puts(unsigned char *s);
// 指定位置寫字符串
extern void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s);
// LCD初始化
extern void lcd_init(void);
#endif //LCD_H
--------------------------------------------------------------------------------
lcd.c:
/*********************************************************************
* 標題: 基于HD44780的1602簡單驅(qū)動(C51)
* 文件: lcd.c
* 作者: wentao http://blog.liuwentao.net
http://wentao.programfan.com
* 參考: AVR單片機與CPLD/FPGA綜合應用入門
* 日期: 2007.5.10
* 修改: 2007.5.26
* 軟件: Keil C51 V8.02
* 芯片: AT89X51
* 說明: 硬件連接定義在lcd.h中
* 聲明: 自用存檔!另僅供需要的朋友參考,請勿用做不道德轉(zhuǎn)載及商業(yè)用途!
*********************************************************************/
#include "lcd.h"
// 本地函數(shù)
void lcd_delay_us(unsigned char us) // 延時微秒@12M,ms最大值255
{
while(--us)
{
;
}
}
void lcd_delay_ms(unsigned char ms) // 延時毫秒@12M,ms最大值255
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 124; i++)
{
;
}
}
}
// 產(chǎn)生一個使能脈沖
void lcd_e_toggle(void)
{
LCD_E = 1;
lcd_delay_us(3);
LCD_E = 0;
}
// 循環(huán)檢測LCD忙標志(BF),直到其值為0,方可執(zhí)行下一指令
void lcd_wait_until_finish(void)
{
LCD_RW = 1; // RW置1,狀態(tài)為讀
LCD_RS = 0; // RS置0,讀狀態(tài)時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); // 寫入顯示地址時DB7須為高電平,加0x80
}
// 寫字符(傳入的參數(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(實際上是字符的地址)送入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); // 上電后適當延時
lcd_command(0x38); // 設(shè)為8位接口模式,顯示2行字符
lcd_command(0x06); // 寫入新數(shù)據(jù)后光標右移
lcd_command(0x0c); // 顯示功能開,不顯示光標
lcd_command(0x01); // 清屏
}
--------------------------------------------------------------------------------
測試:
#include "lcd.h"
void main(void)
{
while(1)
{
lcd_init(); // 初始化LCD
lcd_goto_xy(0,0); // 字符位置:(0,0)
lcd_putc('a'); // 顯示字符"a"
lcd_putc(0x62); // 在(1,0)顯示字符"b"(在CGROM中的地址為0x62,與ASCII碼對應)
lcd_xy_putc(3,0,'c'); // 在(3,0)顯示字符"c"
lcd_goto_xy(0,1); // 字符位置:(0,1)
lcd_puts("Hello world!"); // 顯示字符串"Hello world!"
lcd_xy_puts(16-3,1,"^_^"); // 在(13,1)列顯示字符串"^_^"
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -