?? lcd_1602.c
字號:
/*****************************************************************************
* 文件名: LCD_1602.c
* Copyright (c) 2008 *********武漢理工大學信息工程學院電信系
* 創建人: 王康
* 日 期: 2008.7.29
* 修改人: 王康
* 日 期:
* 描 述: 本文件定義了供調用的用戶外部函數,函數名以Lcd開頭
* 接口定義: D7~D0--P4
* RS--P5.0
* RW--P5.1
* E--P5.2
* 版 本: IAR V4.11
******************************************************************************/
//頭文件
#include "config.h"
/*****************************************************************************
* 函數名: LCD_Write_CMD
* 輸 入: cmd
* 輸 出: 無
* 功能描述: 本函數為LCD_1602寫命令子函數
* 全局變量: 無
* 調用模塊: LCD_Test_Busy
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Write_CMD(uchar cmd)
{
LCD_Test_Busy(); //檢測忙信號
CLR_RW;
CLR_RS; //寫命令
_NOP(); //延時1個系統時鐘周期,即為125ns
LCD_1602_DAT_CHL = cmd; //將命令字送入LCD數據端口
_NOP();
SET_EN; //在使能端E產生一個高脈沖,時間大于150ns
_NOP();
_NOP();
CLR_EN;
}
/*****************************************************************************
* 函數名: LCD_Write_DAT
* 輸 入: data
* 輸 出: 無
* 功能描述: 本函數為LCD_1602寫數據子函數
* 全局變量: 無
* 調用模塊: LCD_Test_Busy
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Write_DAT(uchar data)
{
LCD_Test_Busy(); //檢測忙信號
CLR_RW;
SET_RS; //寫數據
_NOP(); //延時1個系統時鐘周期,即為125ns
LCD_1602_DAT_CHL = data; //將數據送入LCD數據端口
_NOP();
SET_EN; //在使能端E產生一個高脈沖,時間大于150ns
_NOP();
_NOP();
CLR_EN;
}
/*****************************************************************************
* 函數名: LCD_1602_RST
* 輸 入: 無
* 輸 出: 無
* 功能描述: 本函數為LCD_1602的(初始化)復位子函數,嚴格按照1602的復位時序編寫
* 全局變量: 無
* 調用模塊: LCD_Write_CMD,LCD_Test_Busy,LCD_Delay
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_1602_RST(void)
{
LCD_Delay();
LCD_Delay();
LCD_Delay(); //延時15ms
LCD_Write_CMD(0x38); //寫指令38H,(不檢測忙信號)
LCD_Delay(); //延時5ms
LCD_Write_CMD(0x38); //寫指令38H,(不檢測忙信號)
LCD_Delay(); //延時5ms
LCD_Write_CMD(0x38); //寫指令38H,(不檢測忙信號)
LCD_Test_Busy(); //檢測忙信號
LCD_Write_CMD(0x38); //寫指令38H,顯示模式設置
LCD_Test_Busy(); //檢測忙信號
LCD_Write_CMD(0x08); //寫指令08H,關顯示
LCD_Test_Busy(); //檢測忙信號
LCD_Write_CMD(0x01); //寫指令01H,顯示清屏
LCD_Test_Busy(); //檢測忙信號
LCD_Write_CMD(0x06); //寫指令06H,寫字符時整體不移動,光標加1
LCD_Test_Busy(); //檢測忙信號
LCD_Write_CMD(0x0c); //寫指令0cH,顯示開,不顯示光標,光標不閃爍
}
/*****************************************************************************
* 函數名: LCD_Test_Busy
* 輸 入: 無
* 輸 出: 無
* 功能描述: 本函數為LCD_1602讀忙子函數,通過對LCD1602的狀態字的讀取得知LCD是否忙
* 全局變量: 無
* 調用模塊: 無
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Test_Busy(void)
{
LCD_1602_DAT_DIR = 0x00; //LCD_1602數據通道方向定義為輸入狀態
CLR_RS;
SET_RW; //讀狀態
_NOP();
SET_EN;
_NOP();
_NOP();
while((P4IN & LCD_BUSY)); //如果LCD_BUSY為1,則等待
CLR_EN;
LCD_1602_DAT_DIR = 0xff; //LCD_1602數據通道方向定義為輸出狀態
}
/*****************************************************************************
* 函數名: LCD_Delay
* 輸 入: 無
* 輸 出: 無
* 功能描述: 本函數為LCD_1602的延時子函數,延時月為5ms
* 全局變量: 無
* 調用模塊: 無
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Delay(void)
{
uint t = 40000;
while(t--);
}
/*****************************************************************************
* 函數名: LCD_LocateXY
* 輸 入: x--位置的列坐標
* y--位置的行坐標
* 輸 出: 無
* 功能描述: 本函數是向LCD_1602輸入要顯示字符的坐標值的子函數
* 全局變量: 無
* 調用模塊: LCD_Write_CMD,LCD_Test_Busy
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_LocateXY(uchar x,uchar y)
{
x &= 0x0f; //限制x的值小于等于15
y &= 0x01; //限制y的值小于等于1
if(y)
x |= 0x40; //顯示第二行時,地址指針加0x40
// LCD_Test_Busy(); //檢測忙信號
LCD_Write_CMD(0x80 + x); //設置數據地址指針
}
/*****************************************************************************
* 函數名: LCD_Write_One_Char
* 輸 入: x--位置的列坐標
* y--位置的行坐標
* data--要寫入的字符數據
* 輸 出: 無
* 功能描述: 本函數為在指定的位置寫一個字符的子函數
* 全局變量: 無
* 調用模塊: LCD_Write_DAT,LCD_Test_Busy,LCD_LocateXY
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Write_One_Char(uchar x,uchar y,uchar data)
{
LCD_LocateXY(x,y); //設置數據地址指針
// LCD_Test_Busy(); //檢測忙信號
LCD_Write_DAT(data); //寫數據
}
/*****************************************************************************
* 函數名: LCD_Write_String
* 輸 入: x--位置的列坐標
* y--位置的行坐標
* ptr--指向字符串首地址的指針
* 輸 出: 無
* 功能描述: 本函數為在指定的位置寫一個字符串的子函數
* 全局變量: 無
* 調用模塊: LCD_Write_One_Char
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Write_String(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i = 0;
uchar strlen = 0;
temp = ptr;
while(*ptr++ != '\0') //計算字符串有效字符的個數
strlen++;
for(i=0;i<strlen;i++)
{
LCD_Write_One_Char(x++,y,temp[i]);
if(x == 0x10)
{
x = 0;
y ^=1;
}
}
}
/*****************************************************************************
* 函數名: LCD_Write_N_Char
* 輸 入: x--位置的列坐標
* y--位置的行坐標
* n--要寫入字符的個數
* ptr--指向字符存放位置的指針
* 輸 出: 無
* 功能描述: 本函數為在指定的位置連續寫N個字符的子函數
* 全局變量: 無
* 調用模塊: LCD_Write_One_Char
* 作 者: 王康
* 日 期: 2008.7.29
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void LCD_Write_N_Char(uchar x,uchar y,uchar n,uchar *ptr)
{
uchar i;
for(i=0;i<n;i++)
{
LCD_Write_One_Char(x++,y,ptr[i]);
if(x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -