Re: [問題] LCD程式 請教

看板ASM (組合語言)作者 (賞你個痛快)時間16年前 (2008/08/19 22:29), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串2/2 (看更多)
自問自答@_@ 感謝r大陪我測試 以下是測試出來的結果 我在初始設定的地方 每個指令後面加上一行 delay1ms(2000); 之後程式就可以正常執行了= =||| 我想程式錯誤的原因應該是因為每一行set up太快,沒有等lcd ok 就又執行下一行 導致錯誤 有人可以替我講解一下 tcyce pweh tER tEF tAS tAH tDSW tDDR tDHR 這些東西所代表的意義嗎 我看SPEC實在看不太董 是否可以指教一下 ※ 引述《beminaru (賞你個痛快)》之銘言: : 以下是我買的課本的範例程式 : 但是我實際上照著接之後 : 載入程式卻沒有動作 : 想請教一下有可能是哪邊出問題 : 使用的LCD SPEC : http://blog.diyzone.net/blog/oldhan/resource/datasheet/download/ : LMC-STC2B16-01.pdf : 使用的8051: 89S52 : ================================== : /*LCD文字顯示實驗(ch13-1.c)*/ : #include <reg51.h> : #define LCDP P1 // LCD接至P1 : sbit RS=P3^2; sbit RW=P3^1; sbit en=P3^0; : //sbit RS=P1^0; sbit RW=P1^1; sbit en=P1^2; : char line1[]="LCM test program"; : char line2[]="Everything is OK"; : char line3[]="中文LCM 測試程式"; : char line4[]="一切正常歡迎使用"; : void init_LCM(void); : void write_inst(char); : void write_char(char); : void check_BF(void); : void delay1ms(int); : main() : { char i; /* 宣告變數 */ : init_LCM(); /* 初始設定 */ : while(1) /* 無盡迴圈 */ : //===== LCM test program ====== : { write_inst(0x80); /* 指定第一列位置 */ : for (i=0;i<16;i++) /* 迴圈 */ : write_char(line1[i]); /* 顯示16個字 */ : //===== Everything is OK ====== : write_inst(0x90); /* 指定第二列位置 */ ^----設錯 C0 : for (i=0;i<16;i++) /* 迴圈 */ : write_char(line2[i]); /* 顯示16個字 */ : delay1ms(2000); /* 延遲2秒 */ : //===== 中文LCM 測試程式 ====== : write_inst(0x80); /* 指定第一列位置 */ : for (i=0;i<16;i++) /* 迴圈 */ : write_char(line3[i]); /* 顯示16個字 */ : //===== 一切正常歡迎使用 ====== : write_inst(0x90); /* 指定第二列位置 */ ^----設錯 C0 : for (i=0;i<16;i++) /* 迴圈 */ : write_char(line4[i]); /* 顯示16個字 */ : delay1ms(2000); /* 延遲2秒 */ : } /* while結束 */ : } /* 程式結束 */ : //====初始設定函數(8位元傳輸模式)=================== : void init_LCM(void) : { write_inst(0x30); /* 設定功能 */ delay1ms(2000); 添加delay time : write_inst(0x30); /* 設定功能 */ delay1ms(2000); 添加delay time : write_inst(0x30); /* 設定功能 */ delay1ms(2000); 添加delay time : write_inst(0x38); /* 設定兩列 */ delay1ms(2000); 添加delay time : write_inst(0x08); /* 關閉顯示功能 */ delay1ms(2000); 添加delay time : write_inst(0x01); /* 清除顯示幕 */ delay1ms(2000); 添加delay time : write_inst(0x06); /* 設定輸入模式 */ delay1ms(2000); 添加delay time : write_inst(0x0e); /* 開啟顯示功能 */ delay1ms(2000); 添加delay time : } /* 函數結束 */ : //====寫入指令函數================================ : void write_inst(char inst) : { RS = 0; RW=0; /* 寫入指令模式 */ : en = 1; /* 致能 */ : LCDP = inst; /* 寫入指令 */ : en = 0; check_BF(); /* 完成 */ : } /* 函數結束 */ : //====寫入資料函數================================ : void write_char(char character) : { RS = 1; RW=0; /* 寫入資料模式 */ : en = 1; /* 致能 */ : LCDP = character; /* 寫入字元 */ : en = 0;check_BF(); /* 完成 */ : } /* 函數結束 */ : //====檢查忙碌函數================================ : void check_BF(void) : { : char i,x = 0x80; /* 宣告變數 */ : while (x&0x80) /* 若BF=1則執行迴圈 */ : { RS = 0; RW=1; /* 讀取指令模式 */ : en = 1; /* 致能 */ : x = LCDP; /* 讀取指令 */ : en = 0; : for (i=0;i<10;i++); /* 完成 */ : } /* 迴圈結束 */ : } /* 函數結束 */ : //====延遲函數================================ : void delay1ms(int x) : { int i,j; /* 宣告變數 */ : for (i=1;i<x;i++) /* 外迴圈 */ : for (j=1;j<120;j++); /* 內迴圈 */ : } /* 函數結束 */ -- 靜靜的等人追的話頂多只能有兩三個選擇 但是主動出擊去追人的話妳的選擇將會是無限喔~共勉之 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.6.3.229

08/20 23:34, , 1F
記得可以讀lcd 的狀態是不是busy , 這樣就可以不用delay了
08/20 23:34, 1F

08/20 23:37, , 2F
你有check busy 的函式 可以用用看 = =
08/20 23:37, 2F
文章代碼(AID): #18gjY_Nj (ASM)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #18gjY_Nj (ASM)