作者beminaru (赏你个痛快)
看板ASM
标题Re: [问题] LCD程式 请教
时间Tue Aug 19 22:29:17 2008
自问自答@_@
感谢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
1F:→ wuzen:记得可以读lcd 的状态是不是busy , 这样就可以不用delay了 08/20 23:34
2F:→ wuzen:你有check busy 的函式 可以用用看 = = 08/20 23:37