?? lcd1602func.c
字號:
/*******************************************************************
**函數功能:LCD的驅動函數 **
**創建人:xingyuegu **
**創建日期:2006-7-12 **
**版本:1.0 **
**修改日期:2006-10-30 **
**版本:2.0 **
1602液晶仿真的一些發現
看了JJJ的例子:字符液晶1602仿真測試
按自己習慣也寫了個,發現些問題
一、
JJJ說仿真時要屏蔽掉檢查LCD忙的代碼,否則會死循環
while(DBPort&0x80); //這句要屏蔽
我寫的程序總是無法正確仿真,因為不檢查LCD忙,就不能保證LCD已經空閑
查資料LCD清屏命令要1.64ms才完成,一般命令也要40us,最后加上足夠的延時后才仿真通過
后來又試了下其它LCD資料上的例程,仿真發現檢查LCD忙標志也不會死循環
分析了下,區別是:它不是一直在使能的情況下讀忙信號,而是每次都有EN=0,再EN=1重新讀取忙標志
我還沒做好實際實驗電路板,沒試過實際電路
根據JJJ的描述和我的仿真實驗,我猜仿真和實際硬件的區別是:
實際硬件在EN=1的情況下,LCD執行完指令會更新LCD忙標志為0;
而仿真需要EN=0,EN=1來重新讀取忙信號,否則就不會更新,而一直以為是忙
在JJJ的LCD1602.h加了幾句,變成
while(DBPort&0x80)
{ LcdEn=0; _nop_();
LcdEn=1; _nop_();
}
仿真就可以檢查忙標志了
自己的代碼也做相應改動,都可以成功檢查忙標志,也無需多加延時了
*******************************************************************/
#include <lcd1602.h>
#include <reg52.h>
sbit LcdRs =P2^0;
sbit LcdRw =P2^1;
sbit LcdEn =P2^2;
sfr DBPort =0x80;
/*************************************************************
**功能:延時1.64ms **
**參數:無 **
*************************************************************/
void delay1_64ms(void)
{
uchar i;
for(i = 0;i < 250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*************************************************************
**功能:延時40us **
**參數:無 **
*************************************************************/
void delay40us(void)
{
uchar i;
for(i = 0;i < 20;i++)
{
;
}
}
/*************************************************************
**功能:判斷LCD忙 **
**參數:無 **
*************************************************************/
unsigned char Lcd_Wait(void)
{
while(1)
{
DBPort=0xff;
LcdEn=0;
_nop_();
LcdRs=0;
_nop_();
_nop_();
LcdRw=1;
_nop_();
_nop_();
LcdEn=1;
_nop_();
_nop_();
_nop_();
_nop_();
if((DBPort&0x80)==0)
{
break;
}
LcdEn=0;
}
//delay40us();
return DBPort;
}
/**************************************************************
**功能:寫LCD函數 **
**參數:style為寫命令/數據,0-命令,1-數據;input為寫入的8位 **
** 命令/數據 **
**************************************************************/
void Lcd_Write(bit style,unsigned char input)
{
LcdEn=0;
_nop_();
_nop_();
LcdRs=style;
_nop_();
_nop_();
LcdRw=0;
DBPort=input;
_nop_();
_nop_();
LcdEn=1;
_nop_();
_nop_();
LcdEn=0;
_nop_();
Lcd_Wait();
}
/****************************************************************
**功能:LCD清屏函數 **
**參數:無 **
****************************************************************/
void ClrScreen(void)
{
Lcd_Write(Lcd_Command,Lcd_Clear_Screen);
delay1_64ms();
}
/****************************************************************
**功能:LCD歸位函數 **
**參數:無 **
****************************************************************/
void Screen_home(void)
{
Lcd_Write(Lcd_Command,Lcd_Home);
delay1_64ms();
}
/***************************************************************
**功能:設置顯示模式 **
**參數: **
***************************************************************/
void Lcd_SetDisplay(unsigned char DisplayMode)
{
Lcd_Write(Lcd_Command,0x08|DisplayMode);
}
/***************************************************************
**功能:LCD移動設置 **
**參數:取值如下 **
***************************************************************/
void Lcd_Move(unsigned char MoveMode)
{
Lcd_Write(Lcd_Command,0x10|MoveMode);
}
/****************************************************************
**功能:LCD輸入設置 **
**參數:取值如下 **
****************************************************************/
//
void Lcd_SetInput(unsigned char InputMode)
{
Lcd_Write(Lcd_Command,0x04|InputMode);
}
/****************************************************************
**功能:LCD初始化 **
**參數:取值如下 **
****************************************************************/
void Lcd_Init(void)
{
delay1_64ms();
Lcd_Write(Lcd_Command,0x38); //8位數據端口,2行顯示,5*7點陣
Lcd_Write(Lcd_Command,0x38);
Lcd_Write(Lcd_Command,0x38);
Lcd_SetDisplay(Lcd_Display_On); //開啟顯示, 無光標 |Lcd_Cursor|Lcd_Flash
//Lcd_Move(Lcd_CursorMove|Lcd_Left);
Lcd_SetInput(Lcd_Ac_Up|Lcd_No_Move); //AC遞增, 畫面不動_To
}
/****************************************************************
**功能:顯示位置設置 **
**參數:x-行;y-列 **
****************************************************************/
void GotoXY(unsigned char x,unsigned char y)
{
if(y==0)
{Lcd_Write(Lcd_Command,0x80|x);
}
if(y==1)
{Lcd_Write(Lcd_Command,0x80|(x+0x40));
}
}
/****************************************************************
**功能:LCD顯示函數 **
**參數:str-要顯示的字符串指針 **
****************************************************************/
void Print(unsigned char *str)
{
while(*str!='\0')
{
Lcd_Write(Lcd_Data,*str);
str++;
}
}
void print_char(uchar a)
{
Lcd_Write(Lcd_Data,a);
//Lcd_Wait();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -