找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2586|回復: 1
打印 上一主題 下一主題
收起左側

1602液晶51單片機驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:26188 發(fā)表于 2015-2-18 01:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//引腳定義
#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); //寫入字符串值
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:43559 發(fā)表于 2015-3-4 22:44 | 只看該作者
看看。感謝分享。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表