|
//引腳定義
#define LCD_RS P21 // RS針,LCD數(shù)據(jù)/命令(H/L)選擇端
#define LCD_RW P22 // R/W針,LCD讀/寫(H/L)選擇端
#define LCD_EN P23 // E針,LCD使能信號高有效
#define LCD_DATA P0 // DB0~DB7針,LCD并行數(shù)據(jù)線
#define LCD_BUSY P07 // DB7針,LCD忙信號位
#define LCD_GO_HOME 0x02 //AC=0,光標、畫面回HOME位
//輸入方式設置
#define LCD_AC_AUTO_INCREMENT 0x06 //數(shù)據(jù)讀、寫操作后,AC自動增一
#define LCD_AC_AUTO_DECREASE 0x04 //數(shù)據(jù)讀、寫操作后,AC自動減一
#define LCD_MOVE_ENABLE 0x05 //數(shù)據(jù)讀、寫操作,畫面平移
#define LCD_MOVE_DISENABLE 0x04 //數(shù)據(jù)讀、寫操作,畫面不動
//設置顯示、光標及閃爍開、關
#define LCD_DISPLAY_ON 0x0C //顯示開
#define LCD_DISPLAY_OFF 0x08 //顯示關
#define LCD_CURSOR_ON 0x0A //光標顯示
#define LCD_CURSOR_OFF 0x08 //光標不顯示
#define LCD_CURSOR_BLINK_ON 0x09 //光標閃爍
#define LCD_CURSOR_BLINK_OFF 0x08 //光標不閃爍
//光標、畫面移動,不影響DDRAM
#define LCD_LEFT_MOVE 0x05 //LCD顯示(整屏)右移一位 0x05
#define LCD_RIGHT_MOVE 0x07 //LCD顯示(整屏)左移一位 0x07
#define LCD_CURSOR_LEFT_MOVE 0x10 //光標左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光標右移一位
//工作方式設置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //兩行顯示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //單行顯示
/***************************************************************************************
** 函數(shù)名稱: void LCD_BUSY_Bit(void)
** 功能描述: 等待忙信號消失
****************************************************************************************/
void LCD_BUSY_Bit(void)
{
bit byteData;
do
{//循環(huán)開始
LCD_EN = 0; //使能關
LCD_RS = 0; //指令方式
LCD_RW = 1; //讀LCD
LCD_DATA = 0xFF; //拉高數(shù)據(jù)口電位
LCD_EN = 1; //使能開
byteData = LCD_BUSY; //取忙信號
}while(byteData); //循環(huán)終點 讀到 忙位為0退出,否則繼續(xù)讀忙。
LCD_EN = 0; //使能關
}
/***************************************************************************************
** 函數(shù)名稱: void LCD_Write_Instruction(unsigned char byteData)
** 功能描述: 寫指令
** 輸 入: unsigned char byteData
** 調(diào)用模塊: void LCD_BUSY_Bit(void)
****************************************************************************************/
void LCD_Write_Instruction(unsigned char byteData)
{
LCD_BUSY_Bit(); //讀忙
Delay_us(30); //微秒級延時
LCD_EN = 0; //使能關
LCD_RS = 0; //1:數(shù)據(jù);0:指令
LCD__RW = 0; //1:讀;0:寫
LCD_DATA = byteData; //指令寫入數(shù)據(jù)口
LCD_EN = 1; //使能開
Delay_us(30); //微秒級延時
LCD_EN = 0; //使能關
}
/***************************************************************************************
** 函數(shù)名稱: void LCD_Write_DATA(unsigned char byteData)
** 功能描述: 寫數(shù)據(jù)
** 輸 入: unsigned char byteData 寫數(shù)據(jù)
** 調(diào)用模塊: void LCD_BUSY_Bit(void)
****************************************************************************************/
void LCD_Write_DATA(unsigned char byteData)
{
LCD_BUSY_Bit(); //讀忙
Delay_us(30); //微秒級延時
LCD_EN = 0; //使能關
LCD_RS = 1; //1:數(shù)據(jù);0:指令
LCD_RW = 0; //1:讀;0:寫
LCD_DATA = byteData; //數(shù)據(jù)寫入數(shù)據(jù)口
LCD_EN = 1; //使能開
Delay_us(30); //微秒級延時
LCD_EN = 0; //使能關
}
/***************************************************************************************
** 函數(shù)名稱: void LCD_1602_Setup(void)
** 功能描述: 初使化1602液晶
****************************************************************************************/
void LCD_1602_Setup(void)
{
LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); //AC自動增1,讀寫時畫面不移動
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); //顯示開,光標不顯示
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); //雙行顯示
LCD_Write_Instruction(1); //清屏
}
/***************************************************************************************
** 函數(shù)名稱: void LCD_1602_write_char(unsigned char x,unsigned char y,unsigned char dat )
** 功能描述: 單個字寫入到第x(1,2)行y(0,15)列
** 輸 入: unsigned char x 第x(1,2)行;unsigned char y(0,15)列;unsigned char *s要寫ude字符
** 調(diào)用模塊: LCD_write_instruction(),LCD_Write_DATA()
****************************************************************************************/
void LCD_1602_write_char(unsigned x,unsigned char y,unsigned char dat )
{
unsigned char i = 0;
x = (x-1)*0x40; //第幾行
y = x+y; //第幾列
LCD_write_instruction(0x80+y);
LCD_Write_DATA(dat); //寫入字符串值
}
|
|