/*無敵高氯酸修改
函數功能
delay_ms(time) 延時time毫秒
LCD_init() 初始化清空LCD屏
LCD_print(x,y,str)在(x,y)坐標上顯示str字符 0=<x=<15 y=0或者1
*/
/*定義端口*********************************************************/
#define Port P2 //數據端口
sbit Rs = P0^7; /*LCD 第四腳*/
sbit Rw = P0^6; /*LCD 第五腳*/
sbit En = P0^5; /*LCD 第六腳*/
/*定義類型*/
#define uchar unsigned char
#define uint unsigned int
/*定義LCD控制字*****************************************************/
//清屏及光標歸位
#define LCD_CLEAR 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標返回左上角
//顯示開關控制指令
#define LCD_SCREEN_ON 0x0C //顯示開
#define LCD_SCREEN_OFF 0x08 //顯示關
#define LCD_CURSOR_ON 0x0A //顯示光標
#define LCD_CURSOR_OFF 0x08 //無光標
#define LCD_C_FLASH_ON 0x09 //光標閃動
#define LCD_C_FLASH_OFF 0x08 //光標不閃動
//進入模式設置指令
#define LCD_AC_UP 0x06 //新數據后光標右移
#define LCD_AC_DOWN 0x04 //新數據后光標左移
#define LCD_S_MOVE_ON 0x05 // 畫面可平移
#define LCD_S_MOVE_OFF 0x04 //畫面不可平移
//設定顯示屏或光標移動方向指令
#define LCD_C_LEFT 0x10 //光標左移1格,且AC值減1
#define LCD_C_RIGHT 0x11 //光標右移1格,且AC值加1
#define LCD_CHAR_LEFT 0x18 //顯示器上字符全部左移一格,但光標不動
#define LCD_CHAR_RIGHT 0x1C //顯示器上字符全部右移一格,但光標不動
uchar code number[10]={"0123456789"};
/*所有函數聲明*********************************************************/
void LCD_init(void);
void LCD_wdata(uchar wdata);
void LCD_wcommand(uchar lcd_cmd,busy_f);
void LCD_gotoxy(uchar x,uchar y);
void LCD_print(uchar x,uchar y,uchar *str);
uchar Rstatus(void);
uchar LCD_rdata(void);
void delay_ms(unsigned int n) {
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
/*********************************************************************
函數名稱:LCD_print()
功能描述:顯示字符或字符串
入口參數:字符或字符串
返回值:無
**********************************************************************/
void LCD_print(uchar x,uchar y,uchar *str)
{
LCD_gotoxy(x,y);
while(*str!='\0')
{
LCD_wdata(*str);
str++;
}
}
/*
********************************************************************
函數名稱:LCD_wcommand()
功能描述:LCD寫指令
入口參數:uchar lcd_cmd:命令字,uchar busy_f:忙檢測標志位
返回值:無
********************************************************************
*/
void LCD_wcommand(uchar lcd_cmd,busy_f)
{
if (busy_f) Rstatus(); //不忙才執(zhí)行下個程序
Port = lcd_cmd;
Rs = 0;
Rw = 0;
En = 0;
En = 0;
En = 1;
}
/*********************************************************************
函數名稱:LCD_wdata()
功能描述:LCD寫數據
入口參數:uchar wdata:所寫數據
返回值:無
*********************************************************************/
void LCD_wdata(uchar wdata)
{
Rstatus();
Port = wdata;
Rs = 1;
Rw = 0;
En = 0; //若晶振速度太高可以在這后加小的延時
En = 0; //延時
En = 1;
}
/*********************************************************************
函數名稱:LCD_rdata()
功能描述:LCD讀數據
入口參數:無
返回值:所讀數據
*********************************************************************/
uchar LCD_rdata(void)
{
Rs = 1;
Rw = 1;
En = 0;
En = 0;
En = 1;
return Port;
}
/*********************************************************************
函數名稱:Rstatus()
功能描述:LCD讀忙狀態(tài)
入口參數:無
返回值:若忙,則等待,不忙則返回Port
*********************************************************************/
uchar Rstatus(void)
{
Port = 0xFF;
Rs = 0;
Rw = 1;
En = 0;
En = 0;
En = 1;
while (Port & 0x80); //檢測忙信號,不忙則退出等待
return(Port);
}
/*********************************************************************
函數名稱:LCD_init()
功能描述:LCD初始化
入口參數:無
返回值:無
*********************************************************************/
void LCD_init(void)
{
Port = 0;
LCD_wcommand(0x38,0); //三次顯示模式設置,不檢測忙信號
delay_ms(3);
LCD_wcommand(0x38,0);
delay_ms(3);
LCD_wcommand(0x38,0);
delay_ms(3);
LCD_wcommand(0x38,1); //顯示模式設置(0X38雙行(5*7),0X34單行(5*10)),0X30單行(5*7);開始要求每次檢測忙信號
LCD_wcommand(0x08,1); //關閉顯示
LCD_wcommand(0x01,1); //顯示清屏
LCD_wcommand(0x06,1); // 顯示光標移動設置
LCD_wcommand(0x0C,1); // 顯示開及光標設置
}
/*********************************************************************
函數名稱:LCD_gotoxy()
功能描述:定位到(x,y)位置
入口參數:x為行(0~1),y為列(0~15)
返回值:無
*********************************************************************/
void LCD_gotoxy(uchar x, uchar y)
{
x &= 0x1; //限制x不能大于1,y不能大于15
y &= 0xF;
if(!x) LCD_wcommand(0x80|y,1);
else LCD_wcommand(0xC0|y,1);
}