(參考)
/#include<intrins.h> //包含NOP空指令的頭文件
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_H 1 //宏定義手冊中出現的H的定義
#define LCD1602_L 0 //宏定義手冊中出現的L的定義
#define LCD1602_DAT 1 //數據
#define LCD1602_COM 0 //命令
#define LCD_15MS 300 //宏定義15MS延時需要的數值
#defineLCD_5MS 100 //宏定義 5MS延時需要的數值
/*顯示模式指令*/
#define LCD_Display_mode 0X38 //設置16x2顯示 5x7點陣 8位數據介面
/*顯示開/關及游標設置*/
#define LCD_shows0 0X0C //開顯示 不顯示游標 游標不閃爍
#define LCD_shows2 0X0E //開顯示 顯示游標 游標不閃爍
#define LCD_shows1 0X0F //開顯示 顯示游標 游標 閃爍
#define LCD_shows3 0X08 //關顯示 不顯示游標 游標不閃爍
/*指針設置*/
#define LCD_cursor1 0X04 //寫一個字元 地址指針減1
#define LCD_cursor2 0X05 //寫一個字元 地址指針減1 並屏幕右移
#define LCD_cursor3 0X06 //寫一個字元 地址指針加1
#define LCD_cursor4 0X07 //寫一個字元 地址指針加1 並屏幕左移
/*清屏指令*/
#define LCD_clear 0x01 //清屏指令 數據指針清零 所有顯示清零
/*忙狀態字*/
#define LCD_WAY 0x80 //狀態字
/*宏定義顯示起始地址*/
#define LCD_ADDH 0X80 //第一行地址0x80-0xA7
#define LCD_ADDL 0XC0 //第二行地址0xC0-0xE7
/*IO口定義*/
#define LCD1602_DATA P0 //宏定義8位數據線IO為P0口 D0~D7=P00~P07 8位數據線 D0=P00;
sbit LCD1602_RS=P2^5; //數據/命令選擇端(H/L)
sbit LCD1602_RW=P2^6; //讀/寫選擇端(H/L)
sbit LCD1602_E =P2^7; //使能信號
/*函數聲明*/
void LCD1602_init(); //液晶初始化函數
void LCD1602_writecd(bit lcd_rs, uchar LCD1602_d);//寫命令/數據 函數bit lcd_rs是數據還是命令 uchar LCD1602_d要寫入的數據
uchar LCD1602_readway(); //讀忙狀態函數 由寫入和讀取函數調用
uchar LCD1602_readata(); //讀數據函數
void LCD_DELAY(uchar LCD_delay); //
/*液晶初始化函數*/
void LCD1602_init() //液晶初始化函數
{ LCD_DELAY(LCD_15MS); //延時15MS 初始化
LCD1602_writecd(LCD1602_COM,LCD_Display_mode);//寫指令38H 設置16x2顯示 5x7點陣 8位數據介面
LCD1602_writecd(LCD1602_COM,LCD_shows0); //開顯示 不顯示游標 游標不閃爍
LCD1602_writecd(LCD1602_COM,LCD_cursor1); //檢查忙狀態
LCD1602_writecd(LCD1602_COM,LCD_clear); //寫指令01H:顯示清屏
}
/*液晶寫命令/數據函數*/
void LCD1602_writecd(bit lcd_rs, uchar LCD1602_cd)//寫命令/數據 函數
{ uchar LCD1602_NUM; //定義變數用來液晶無忙回答的退出死循環
LCD1602_NUM=255; //忙狀態檢測次數
while(LCD1602_readway()) //檢查忙狀態
{LCD1602_NUM--; //檢測次數自減
if(LCD1602_NUM==0) //判斷檢測次數等於0
{break;} //退出循環判斷忙
}
LCD1602_RW = LCD1602_L; //讀/寫選擇端(H/L)
LCD1602_RS = lcd_rs; //數據/命令選擇端(H/L)
LCD1602_DATA= LCD1602_cd; //IO口賦值
LCD1602_E = LCD1602_H; //拉高使能信號開始傳輸數據
LCD1602_E = LCD1602_L; //拉低使能信號鎖存數據
LCD1602_DATA= 0xff; //IO口數據清除
}
/*忙狀態讀取函數*/
uchar LCD1602_readway()//讀狀態函數由寫入和讀取函數調用
{ uchar LCD1602_way; //狀態字變數
LCD1602_DATA=0xff; //IO口數據清除
LCD1602_RS = LCD1602_COM; //數據/命令選擇端(H/L) 命令
LCD1602_RW = LCD1602_H; //讀/寫選擇端(H/L)
LCD1602_E = LCD1602_H; //拉高使能信號開始接收狀態
LCD1602_way =LCD1602_DATA; //讀取狀態
LCD1602_E = LCD1602_L; //拉低使能信號鎖存數據
LCD1602_way =LCD1602_way&LCD_WAY;//取忙狀態字
return(LCD1602_way); //返回狀態字
}
/*液晶讀數據函數*/
uchar LCD1602_readata()//讀數據函數
{ uchar LCD1602_data; //數據暫存變數
while(LCD1602_readway()); //檢查忙狀態 --------------------
LCD1602_DATA=0xff; //IO口數據清除
LCD1602_RS = LCD1602_DAT; //數據/命令選擇端(H/L) 數據
LCD1602_RW = LCD1602_H; //讀/寫選擇端(H/L)
LCD1602_E = LCD1602_H; //拉高使能信號開始接收狀態
LCD1602_data= LCD1602_DATA; //讀取狀態
LCD1602_E = LCD1602_L; //拉低使能信號鎖存數據
return(LCD1602_data); //返回數據
}
/*延時函數*/
void LCD_DELAY(uchar LCD_delay)//
{ uchar lcd_del;
while(LCD_delay--) //自減
{lcd_del=100;
while(lcd_del--);}
}
『貳』 舵機角度怎麼顯示在1602顯示屏上,代碼
你是需要一個個字元按順序輸出然後保持所有字元嗎?我有用keil4 編譯的C語言文件。
『叄』 lcd1602液晶顯示的程序
①問,RS,RW,E 的設置為 讀狀態時序 的過程,讀出來的數據(數據口P1) 的最高位 剛好即為 液晶的 忙碌 標志位。
②問,writecontrol(unsigned condata) 函數 是個 寫指令 函數;
③問,空操作 是為了讓數據穩定後,才使能 液晶接收數據;
④問,寫指令有時間 間隔要求,太頻繁的讀寫會丟碼,所以要加延時,三條38指令,是因為安全起見,上電後馬上初始化會出現液晶電源不穩而丟碼;
⑤問,液晶顯示 只在 更新數據 的時候刷新一次即可,液晶會維持內容,無需重復刷新。
⑥附送,③和④問,都是驅動太惡心而造成的結果,好的驅動程序不需如此操作。液晶的時序要求為ns級,單片機的指令周期普遍為us級,根本不需過多累贅。
#include"reg52.h" //包含52頭文件
#include"SMC1602A.h" //包含SMC1602A宏定義文件
#define BusyReadCount 10 //讀忙標志等待次數
#define SMC1602_Data P0 //定義 數據介面
//sbit SMC1602_VO=P2^4; //定義 VO對比度介面
sbit SMC1602_RW=P2^5; //定義 R/W介面25
sbit SMC1602_RS=P2^6; //定義 RS介面26
sbit SMC1602_E=P2^7; //定義 E介面27
#define SMC1602_En SMC1602_E=1 //使能
#define SMC1602_Dis SMC1602_E=0 //禁止
uchar SMC1602_Read(bit read_type) //1602液晶屏讀函數
{
uchar read_data;
SMC1602_Dis; //禁止使能
SMC1602_RW=ReadOperate; //讀操作
SMC1602_RS=read_type; //讀類型:0狀態,1數據
SMC1602_En; //開啟使能
read_data=SMC1602_Data; //存儲結果
SMC1602_Dis; //禁止使能
return read_data; //返回結果
}
void SMC1602_WriteByte(bit write_type,uchar write_data) //1602液晶屏讀函數
{
uchar i=BusyReadCount;
for(;i;i--); //延時操作,為寫操作預留回復時間
while((SMC1602_Read(CommOperate)&BusyState) &&(++i<=BusyReadCount)); //讀取忙標志(BusyReadCount次),若均忙中,則不再讀取忙標志,直接執行寫操作
//while(SMC1602_Read(CommOperate)&BusyState) if(++i>BusyReadCount) return; //讀取忙標志,若BusyReadCount次均忙中,則不進行寫操作
//while(SMC1602_Read(CommOperate)&BusyState); //等待空閑(死等)
SMC1602_Dis; //禁止使能
SMC1602_RW=WriteOperate; //寫操作
SMC1602_RS=write_type; //寫類型:0指令,1數據
SMC1602_Data=write_data; //寫操作,將操作數送的數據口
SMC1602_En; //開啟使能
SMC1602_Dis; //禁止使能
}
void SMC1602_WriteCGRAM(uchar *write_buf,uchar start_loca,uchar word_num,uchar start_addr) //SMC1602寫CGRAM函數,用於自定義字元
{
uchar i,j;
write_buf+=start_loca; //指向"需寫入數據數組"的起始位置
SMC1602_WriteByte(CommOperate,CGRAMAddr|start_addr<<3); //寫CGRAM操作,並將CGRAM起始地址設為 start_addr
for(j=0;j<word_num;j++) //自定義字元數量
for(i=0;i<8;i++) SMC1602_WriteByte(DataOperate,*write_buf++); //寫入一個自定義字元8個位元組數據
}
void SMC1602_Init() //1602液晶屏初始化函數
{
uint i;
SMC1602_WriteByte(CommOperate,DisplayMode); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
SMC1602_WriteByte(CommOperate,ScreenMode|ScreenOn); //游標模式設置:開啟整體顯示,開啟游標顯示,開啟游標閃爍
SMC1602_WriteByte(CommOperate,InputMode); //輸入方式設置:關閉整屏移動,開啟游標正移動(+1)
SMC1602_WriteByte(CommOperate,CleanLCD); //清屏,復位游標
SMC1602_WriteByte(CommOperate,FirstCol); //定位第一行
for(i=150;i;i--); //等待電源穩定,否則寫CGRAM數據(自定義字元)時容易丟失,uint執行周期長,用uchar將會縮短時間,不足以穩定LCD
}
『肆』 1602顯示的代碼問題,我單片機不好,求高手指點
if(hang == 1) a = 0x80;//hang=1顯示在第一行
if(hang == 2) a = 0xc0;//hang=2顯示在第二行
a = a + lie - 1;//從第零位加(lie-1)位開始顯示,假回如lie=3那麼就從0x82或oxc2的位置開始顯示
enable(a);//寫如答地址命令
write(sign);//寫入數據
『伍』 請問LCD1602D的代碼
add 是 英文「address」(地址)的前面三個字母,正確簡寫應該是 addr,在程序中 表示 顯示內地址。
0x30 是 數字容「0」的 ASCII 碼,由於 LCD1602 顯示的數據 是 ASCII ,所以需要對 顯示的內容進行 ASCII碼 轉換,程序中 a、b、c、d 是 單個數字,這個數值 + 0的ASCII 碼,就是 數字 對應的 ASCII碼
『陸』 單片機做1602液晶顯示,顯示字元錯誤,代碼如下:
可能是編譯器的問題,你試試把字母用ASCII碼表示,比如a的ASCII碼是0x61,這樣如果顯示是正確的話,就是回你的編譯器在處理的時候答弄錯了.比如漢化版的keil在處理漢字轉GB字元的時候就有bug.
可能是你的1602壞了,或者你的連線不正確.
『柒』 單片機 1602顯示代碼沒錯誤。但是不顯示字
檢查一下硬體連來線是否正確,灰度電源位器(或者定值電阻)連接是否正確。
還有,檢查一下程序里定義的管腳和實際的管腳是否一致。看看RS,RW和E是否接在程序中定義的那幾個管腳上。
以及,你的P0口有沒有接上拉電阻?P0口和1602的並行數據線高低位順序又沒有弄錯?
『捌』 求1602液晶滾屏顯示代碼,不是用指令滾屏的。
LCD1602本身是不支持漢字顯示的,但有一種方法可以通過自定義字元來顯示漢字,但是效果很不好看。
如果你要顯示漢字,可以使用帶字型檔的LCD12864。
『玖』 我用單片機1602顯示時鍾但一直錯誤求大神幫幫忙下面是代碼。。顯示代碼
錯誤就是這里:來源
LcdWriteData('0'+Time[6]>>4+0x30); // Time[6]&0x70>>4
LcdWriteData('0'+Time[6]&0x0f+0x30); // Time[6]&0x0f
……
加上 '0',又加上 0x30,弄重復了。
去掉一個,如下即可。
LcdWriteData('0' + Time[6] >> 4); // Time[6]&0x70>>4
LcdWriteData('0' + Time[6] & 0x0f); // Time[6]&0x0f
……
後面還有很多行,都要改。