|
通常情況下,1602的數(shù)據(jù)口都是低位接芯片的低位,但有時按正常走線方式,線路交叉,可以反接,用此代碼。
代碼源網(wǎng)絡(luò)地址:amobbs
//LCD1602功能函數(shù)
// 51 @ 12MHz
//elecfun @ 2010-11-6
//使用方法: 使用前調(diào)用Init_LCD1602()初始化,顯示方法LCD1602_DispString(0, 0, "This is a test.");
#ifndef _LCD1602_
#define _LCD1602_
//#define _PORT_REV_ //如果數(shù)據(jù)端口高低位交換,請去掉此注釋
#include <intrins.h> //包含_nop_()指令
sbit LCD1602_RS = P2^4; //控件引腳定義,移植請修改
sbit LCD1602_RW = P2^3;
sbit LCD1602_E = P2^2;
#define LCD_PORT P1 //輸出數(shù)據(jù)總線端口定義,移植請修改
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標(biāo)返回原點
#define LCD_SHOW 0x04 //顯示開
#define LCD_HIDE 0x00 //顯示關(guān)
#define LCD_CURSOR 0x02 //顯示光標(biāo)
#define LCD_NO_CURSOR 0x00 //無光標(biāo)
#define LCD_FLASH 0x01 //光標(biāo)閃動
#define LCD_NO_FLASH 0x00 //光標(biāo)不閃動
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 畫面可平移
#define LCD_NO_MOVE 0x00 //default
/*********************************************************************************************
函數(shù)名:8位數(shù)據(jù)高低位交叉互換
調(diào) 用:uchar = DataReverse(uchar);
參 數(shù):輸入的端口(0000 0XXX 其中XXX是設(shè)置輸入端口號,可用十進(jìn)制0~7表示,0表示P1.0,7表示P1.7)
返回值:交換后的8位數(shù)據(jù)
結(jié) 果:交換數(shù)據(jù)高低位D7→D0,D6→D1.....,D0→D7,并返回交換后的結(jié)果
備 注:
/**********************************************************************************************/
unsigned char DataReverse(unsigned char datOld)
{
unsigned char datNew=0,i;
for (i=0; i<8; i++)
{
if (datOld & (1<<i)) //如果某位為1,則或上一個1
datNew |= (0x80>>i);
}
return datNew;
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:LCD1602等待函數(shù)
調(diào) 用:uchar = LCD_Wait();
參 數(shù):無
返回值:LCD1602數(shù)據(jù)總線的值
結(jié) 果:等待LCD1602內(nèi)部指令執(zhí)行完成
備 注:返回結(jié)果可不用
/**********************************************************************************************/
unsigned char LCD_Wait(void)
{
LCD1602_RS = 0;
LCD1602_RW = 1; _nop_();
LCD1602_E = 1; _nop_();
#ifdef _PORT_REV_ //如果數(shù)據(jù)線高低位交換,則需要處理數(shù)據(jù)
while(DataReverse(LCD_PORT)&0x80);
LCD1602_E = 0;
return DataReverse(LCD_PORT);
#else //正常情況下不需要交換
while(LCD_PORT&0x80);
LCD1602_E = 0;
return LCD_PORT;
#endif
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:LCD1602數(shù)據(jù)寫函數(shù)
調(diào) 用:LCD_Wait(bit, uchar);
參 數(shù):數(shù)據(jù)類型,數(shù)據(jù)值
返回值:無
結(jié) 果:將指定數(shù)據(jù)類型的數(shù)據(jù)寫入1602
備 注:數(shù)據(jù)類型:LCD_COMMAND(0)、LCD_DATA(1)
/**********************************************************************************************/
void LCD_Write(bit DataStyle, unsigned char DAT)
{
LCD1602_E = 0;
LCD1602_RS = DataStyle;
LCD1602_RW = 0; _nop_();
#ifdef _PORT_REV_
LCD_PORT = DataReverse(DAT);
#else
LCD_PORT = DAT;
#endif
_nop_();
LCD1602_E = 1; _nop_();//注意順序
LCD1602_E = 0; _nop_();
LCD_Wait(); //等待1602內(nèi)部執(zhí)行完,Proteus仿真時請注釋此句
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:LCD1602顯示設(shè)置函數(shù)
調(diào) 用:LCD_SetDisplay(uchar);
參 數(shù):顯示模式
返回值:無
結(jié) 果:正常設(shè)置1602顯示模式
備 注:內(nèi)部函數(shù),初始化時調(diào)用
/**********************************************************************************************/
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:LCD1602顯示設(shè)置函數(shù)
調(diào) 用:LCD_SetInput(uchar);
參 數(shù):顯示模式
返回值:無
結(jié) 果:正常設(shè)置1602顯示模式
備 注:內(nèi)部函數(shù),初始化時調(diào)用
/**********************************************************************************************/
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:LCD1602初始化函數(shù)
調(diào) 用:Init_LCD1602();
參 數(shù):無
返回值:無
結(jié) 果:初始化1602函數(shù)
備 注:
/**********************************************************************************************/
void Init_LCD1602()
{
LCD_Write(LCD_COMMAND, 0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點陣
LCD_Write(LCD_COMMAND, 0x38);
LCD_Write(LCD_COMMAND, 0x38);
LCD_SetDisplay(LCD_SHOW | LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)
LCD_Write(LCD_COMMAND, LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP | LCD_NO_MOVE); //AC遞增, 畫面不動
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:LCD1602數(shù)據(jù)寫函數(shù)
調(diào) 用:LCD1602_DispString(uchar, uchar, *uchar);
參 數(shù):x坐標(biāo),y坐標(biāo),字符串
返回值:無
結(jié) 果:在指定坐標(biāo)顯示字符串
備 注:x: 0~15; y:0、1
/**********************************************************************************************/
void LCD1602_DispString(unsigned char x, unsigned char y, unsigned char *s)
{
if(y == 0)
LCD_Write(LCD_COMMAND, 0x80|x);
if(y == 1)
LCD_Write(LCD_COMMAND, 0x80|(x-0x40));
while(*s != '\0')
{
LCD_Write(LCD_DATA, *s);
s++;
}
}
/**********************************************************************************************/
#endif
|
評分
-
查看全部評分
|