![]() |
發布時間: 2013-9-28 15:03
正文摘要:圖12-3 液晶下拉電阻 如果不加這個下拉電阻,剛開始講點亮LED小燈的時候,我們就得寫一句:LCD1602_E=0,可能很多初學者容易弄不明白,所以我們才加了這樣一個電路。但是在實際開發過程中,就不必 ... |
為什么不直接出個新版講解單片機視頻呢,主頁推薦的郭天祥的視頻第一模糊,第二視頻播放速度和聲音速度延遲8S左右,雖然我可以通過下載視頻通過軟件吧延遲擬補回來但是真的太麻煩了,而且郭視頻也需要新一代更新更新呀 |
學習內容越來越難了,努力中 |
液晶屏“讀數據”操作,應該是R/W = H吧? |
最近在學指針,非常棒的文章![]() ![]() |
指針的使用最為靈活也最麻煩,這降解真心好,理解好的畫用的非常好 |
絕世好貼! |
耐心學習!謝謝樓主 |
仔細看了這篇教程 我也在開發板上試了 是存在問題的 就是 字符的 重復顯示 我改了一下 現在 編譯通過且成功 特地分享 /*問題 1602重復顯示*/ #include<reg52.h> #define LCD1602_DB P0 //1602 IO口 sbit LCD1602_RD=P1^2; // 數據命令選擇端 H DATA L CMD sbit LCD1602_RW=P1^3; // 讀寫端 H READ L WRITE sbit LCD1602_E=P1^4; // 使能 void readbusy(); //判忙 1忙 0空 void write_data(unsigned char dat); void write_cmd(unsigned char cmd); void LCD1602_INIT(); unsigned char code word1[]={"cjb study 1602"}; void LCDShowstr(unsigned char addr_start,unsigned char *p); //x y表示坐標 p表示指針變量 即數組word的首地址 void main() { LCD1602_INIT(); LCDShowstr(0x80,word1); while(1){} } void LCD1602_INIT() //1602INIT { write_cmd(0x38); //顯示模式設置 1602 固定命令 write_cmd(0x0c); //開顯示器 關閉光標 0000 1DCB D=1開顯示 C=1顯示光標 B=1 光標閃爍 write_cmd(0x06); //文字不動 地址自動加1 0000 01NS N=1 寫入一個字符后 地址自動加1 S=0 寫入一個字符 整屏不移動 write_cmd(0x01); //清屏 } /*1602每次的寫入都要確保其處于不忙的狀態 狀態字的最高位D7代表其是否忙碌1 禁止寫入 0 應許寫入*/ void readbusy() { unsigned char sta; LCD1602_DB=0XFF; //P0置位,判斷D7是不是1602拉低的 LCD1602_RD=0; LCD1602_RW=1; //讀D7狀態 RD RW 不能寫錯 do{ LCD1602_E=1; //使能 sta=LCD1602_DB; }while(sta&0x80); //等到sta 首位為0 時 退出循環 此時1602處于空閑狀態 LCD1602_E=0; //讀完了關閉使能 液晶輸出數據對總線的干擾 } void write_data(unsigned char dat) //寫數據 { readbusy(); LCD1602_RD=1; //參考時序圖 LCD1602_RW=0; LCD1602_DB=dat; LCD1602_E=1; LCD1602_E=0; } void write_cmd(unsigned char cmd) //寫命令 { readbusy(); LCD1602_RD=0; //參考時序圖 LCD1602_RW=0; LCD1602_DB=cmd; LCD1602_E=1; LCD1602_E=0; } void LCDShowstr(unsigned char addr_start,unsigned char *p) { write_cmd(addr_start); while(*p!='\0') { write_data(*p++); } } 至于問題出在哪里 我認為 是坐標哪里有問題 希望大神求解 |
真的寫得很好,很適合初學者。 |
講的很詳細透徹 |
挺好挺好,學會了不少東西 |