|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
求教LCD总线连接方式的问题 |
作者:tomly 栏目:单片机 |
各位高手: 我用深圳瑞特公司一款RT12864的液晶显示器,如果用模拟总线方式显示,结果很好,但是用总线方式,结果不显示,现我把电路图和程序发出来,希望高手能指点指点,谢谢。 **************************************** **********非总线方式,已通过************ **************************************** #include <absacc.h> #include <intrins.h> #include <reg52.h> #define LCD12864DataPort P0 // LCD128*64 I/O 信号管脚 sbit di =P2^2; // 数据\指令 选择 sbit rw =P2^3; // 读\写 选择 sbit en =P2^4; // 读\写使能 sbit cs1 =P2^1; // 片选1,低有效(前64列) sbit cs2 =P2^0; // 片选2,低有效(后64列) sbit reset=P1^7; // 复位 sbit TEST=P1^3; // 测试程序运行指示灯 /*--基本函数源程序---------------------------------------*/ //延时 Lcd12864delay(unsigned int i) { while(i--) {;} } /*---------------------------------------------------------------*/ //状态检查 void CheckState() { unsigned CHAR dat; di=0; rw=1; do{ LCD12864DataPort=0xff; //先往P1口写11111111 en=1; dat=LCD12864DataPort; en=0; dat=0x90 & dat; //仅当第4,7位为0时才可操作 }while(!(dat==0x00)); } /*--------------------------------------------------------------*/ //写显示数据 //dat:显示数据 void WriteByte(unsigned CHAR dat) { CheckState(); di=1; rw=0; LCD12864DataPort=dat; en=1; en=0; } /*---------------------------------------------------------------*/ //向LCD发送命令 //command :命令 SendCommandToLCD(unsigned CHAR command) { CheckState(); rw=0; LCD12864DataPort=command; en=1; en=0; } /*-------------------------------------------------------------*/ //设定行地址(页)--X 0-7 void SetLine(unsigned CHAR LINE) { LINE=LINE & 0x07; // 0<=LINE<=7 LINE=LINE|0xb8; //1011 1xxx SendCommandToLCD(LINE); } /*--------------------------------------------------------------*/ //设定列地址--Y 0-63 void SetColumn(unsigned CHAR column) { column=column &0x3f; // 0=<column<=63 column=column | 0x40; //01xx xxxx SendCommandToLCD(column); } /*--------------------------------------------------------------*/ //设定显示开始行--XX void SetStartLine(unsigned CHAR startLINE) //0--63 { startLINE=startLINE & 0x07; startLINE=startLINE|0xc0; //1100 0000 SendCommandToLCD(startLINE); } /*--------------------------------------------------------------*/ //开关显示 void SetOnOff(unsigned CHAR onoff) { onoff=0x3e | onoff; //0011 111x SendCommandToLCD(onoff); } /*--------------------------------------------------------------*/ //选择屏幕 //screen: 0-全屏,1-左屏,2-右屏 void SelectScreen(unsigned CHAR screen) { //深圳RT12864:正有效 cs1: 1--左; cs2: 1--右 SWITCH(screen) { case 0: cs1=1;//全屏 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break; case 1: cs1=1;//左屏 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break; case 2: cs1=0;//右屏 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break; } } /*---------------------------------------------------------------*/ //清屏 //screen: 0-全屏,1-左屏,2-右 void ClearScreen(unsigned CHAR screen) { unsigned CHAR i,j; SelectScreen(screen); for(i=0;i<8;i++) { SetLine(i); for(j=0;j<64;j++) { WriteByte(0x00); } } } /*---------------------------------------------------------------*/ //显示8*8点阵 //旋转90度:字模被竖着切分 //lin:行(0-7), column: 列(0-15) //address : 字模区首地址 void Show88(unsigned CHAR lin,unsigned CHAR column,unsigned CHAR *address) { unsigned CHAR i; if(column>16) {return;} if(column<8) {SelectScreen(1);} //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上 else { SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上 column=column & 0x07; //防止越界 } SetLine(lin); SetColumn(column<<3); for(i=0;i<8;i++) WriteByte( *(address+i) ); } /*---------------------------------------------------------------*/ |
2楼: | >>参与讨论 |
作者: tomly 于 2006/3/26 17:21:00 发布:
接线电路图发出来了。 把电路图和程序都发出来了,希望高手指点。 |
3楼: | >>参与讨论 |
作者: 一级菜鸟 于 2006/3/26 18:58:00 发布:
译码逻辑混乱,ADDR15和ADDR14要一个来使能LCD就行了 要两根干嘛? 似乎逻辑不正确,懒得仔细看了。 |
4楼: | >>参与讨论 |
作者: tomly 于 2006/3/26 20:52:00 发布:
ADDR15和ADDR14同时是1的时候已经选通了别的器件了。 ADDR15和ADDR14同时是1的时候已经选通了别的器件了,所以只有ADDR15为1,ADDR14为0是来选通LCD使能。上面这位大侠,好好帮看看程序呀,看是哪里出了问题。 |
5楼: | >>参与讨论 |
作者: xwj 于 2006/3/26 22:13:00 发布:
很明显你的译码逻辑混乱了,自己再仔细看看! |
6楼: | >>参与讨论 |
作者: xwj 于 2006/3/26 22:35:00 发布:
分析了一下,你的电路需在6和11脚件加反向器,11脚输出加反向器 这样逻辑才是对的 如果闲门太多,应该用A15、A14同时低电平时选通,这样用4个或非门就可以了 |
7楼: | >>参与讨论 |
作者: hunao 于 2006/3/26 23:45:00 发布:
逻辑不太对 E = /(6 * 8) = /6 + /8 = A14 + 3 * A15 = A14 + /(R * W) * A15 = A14 + (/R + /W) * A15 = A14 + /R * A15 + /W * A15 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |