Re: [問題] LCD程式 請教
自問自答@_@
感謝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
08/20 23:34, 1F
→
08/20 23:37, , 2F
08/20 23:37, 2F
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章