欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
一個關于LCD1602延時的問題
[打印本頁]
作者:
290435619@qq
時間:
2020-2-12 22:28
標題:
一個關于LCD1602延時的問題
請問一下各位大神,我看LCD1602的說明文檔上面寫的延時都是ns級別的,我用的單片機是12M晶振的,所以我在寫數據的時候沒有用延時,但是LCD上就顯示不出數據來,我加了延時之后,LCD上就有數據了,而且不同的延時,LCD上顯示的數據還不同,這是怎么回事啊?
作者:
csmyldl
時間:
2020-2-13 13:26
是傳送數據的時序不符合,特別是應答的時序
作者:
290435619@qq
時間:
2020-2-13 20:56
csmyldl 發表于 2020-2-13 13:26
是傳送數據的時序不符合,特別是應答的時序
我是按照教程上面寫的,但是我看LCD1602的說明文檔上面寫的ns,所以我就想應該可以不用延時,于是我就用短的延時和長的延時分別對比了一下,發現有很大差異
作者:
CZFMDZ
時間:
2020-2-14 13:41
應該是時序問題,傳一個驗證過的程序給你參考。程序中用NOP短延時你也可以去掉或加長延時測試。
void LCMInit(void) //LCM初始化
{
WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號 設置8位格式,2行,5*7
WriteCommandLCM(0x3c,1); //顯示模式設置,開始要求每次檢測忙信號 設置8位格式,2行,5*10
//4 顯示開/關控制 0 0 0 0 1 D C B D=0關顯示 D=1開顯示 C=0無光標 C=1有光標 B=0光標不閃爍 B=1光標閃爍
WriteCommandLCM(0x08,1); //顯示關
WriteCommandLCM(0x06,1); //顯示光標移動設置 不移位
WriteCommandLCM(0x0E,1); //顯示開、有光標、光標不閃爍
WriteCommandLCM(0x01,1); //清除屏幕顯示
}
//寫數據
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0;
_nop_();_nop_();_nop_();//延時
LCM_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM, bit BuysC) //BuysC為0時忽略忙檢測
{
if (BuysC==1){ ReadStatusLCM();} //根據需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
_nop_();_nop_();_nop_();//延時
LCM_E = 1;
}
//讀數據
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
_nop_();_nop_();_nop_();//延時
LCM_E = 1;
return(LCM_Data);
}
unsigned char ReadStatusLCM(void)// 讀狀態
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
_nop_();_nop_();_nop_();//延時
LCM_E = 1;
while (LCM_Data & 0x80); //檢測忙信號 忙時一直等待
return(LCM_Data);
}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength=0;
Y &= 0x1; //限制 X不能大于15
X &= 0xF; //限制 Y不能大于1
while (DData[ListLength]!=0) //若到達字串尾則退出
{
if (X <= 20) //X坐標應小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
}
X++; ListLength++;
}
}
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1; //限制 X不能大于15
X &= 0xF; //限制 Y不能大于1
if (Y==1) { X |= 0x40; }//當要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼 寫入顯示地址時要求最高位D7恒定為高電平1
WriteCommandLCM(X, 0); //這里不檢測忙信號,發送地址碼 X值>=0x80
WriteDataLCM(DData);
}
//-----------------------------------------------------------------
//將8字節自定義字符的字模寫到CGRAM中
void write_pic(unsigned char add, unsigned char *pic_num)
{
unsigned char i;
add=add<<3;
for(i=0;i<8;i++)
{
WriteCommandLCM(0x40|add+i,1); //D7D6=01 D5~D3顯示自定義字符時的字符號 D2~D0行號
WriteDataLCM(*pic_num++);
}
ReadStatusLCM(); //檢測忙或延時一段時間 此行一定要,否則執行完立即顯示該字符時會不顯示
}
作者:
CZFMDZ
時間:
2020-2-14 13:43
這是LCD1602使用總結
//讀狀態 輸入 RS=L,R/W=H,E=H 輸出 D0—D7=狀態字
//讀數據 輸入 RS=H,R/W=H,E=H 輸出 D0—D7=數據
//寫數據 輸入 RS=H,R/W=L,D0—D7=數據,E=高脈 沖 輸出 無
//寫指令 輸入 RS=L,R/W=L,D0—D7=指令碼,E=高 脈沖 輸出 無
//
//DDRAM-- 就是顯示數據RAM存放待顯示的字符代碼共80個字節
//CGROM-- 字模存儲器內置192個常用字符的字模
//CGRAM-- 自定義的字符產生RAM 字符代碼0~F 為用戶自定義字符圖形RAM
//1602液晶模塊內部的控制器共有11條控制指令,如表10-14所示:
//序號 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
//1 清顯示 0 0 0 0 0 0 0 0 0 1 執行時間1.64ms 清屏即將DDRAM全部填充為20H
//2 光標返回 0 0 0 0 0 0 0 0 1 * 執行時間1.64ms 將光標定位到屏幕左上角
//3 置輸入模式 0 0 0 0 0 0 0 1 I/D S 執行時間40us I/D=0寫入數據后光標左移 I/D=1寫入數據后光標右移 S=0寫入數據后顯示屏不移動 S=1寫入數據后顯示屏右移1字符
//4 顯示開/關控制 0 0 0 0 0 0 1 D C B 執行時間40us D=0關顯示 D=1開顯示 C=0無光標 C=1有光標 B=0光標不閃爍 B=1光標閃爍
//5 光標或字符移位 0 0 0 0 0 1 S/C R/L * * 執行時間40us S/C R/L=00光標左移1格且AC減1 S/C R/L=01光標右移1格且AC加1 S/C R/L=10光標不動字符全部左移一格 S/C R/L=10光標不動字符全右移一格
//6 功能設定 0 0 0 0 1 DL N F * * 執行時間40us DL=0數據總線為4位 DL=1數據總線為8位 N=0顯示1行 N=1顯示2行 F=0時字符5*7點陣 F=1時字符5*10點陣
//7 置字符發生存貯器地址 0 0 0 1 字符發生存貯器地址 執行時間40us D5~D3顯示自定義字符時的字符號 D2~D0行號
//8 置數據存貯器地址 0 0 1 顯示數據存貯器地址 執行時間40us 設定一個要存入數據的DDRAM地址
//9 讀忙標志或地址 0 1 BF 計數器地址 執行時間40us BF=1表示液晶屏忙暫無法接收數據或命令
//10 寫數到CGRAM或DDRAM 1 0 要寫的數據內容 執行時間40us 將數據寫入DDRAM或CGRAM
//11 從CGRAM或DDRAM讀數 1 1 讀出的數據內容 執行時間40us 讀取DDRAM或CGRAM中的內容
作者:
辰景
時間:
2020-2-14 17:29
LCD1602模塊的時序圖決定了它的正常顯示,時序圖里有延時時間
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1