登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

求教LCD总线连接方式的问题

作者:tomly 栏目:单片机
求教LCD总线连接方式的问题

各位高手:
   我用深圳瑞特公司一款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
接线电路图发出来了。
把电路图和程序都发出来了,希望高手指点。

3楼: >>参与讨论
一级菜鸟
译码逻辑混乱,ADDR15和ADDR14要一个来使能LCD就行了
要两根干嘛?
似乎逻辑不正确,懒得仔细看了。

4楼: >>参与讨论
tomly
ADDR15和ADDR14同时是1的时候已经选通了别的器件了。
ADDR15和ADDR14同时是1的时候已经选通了别的器件了,所以只有ADDR15为1,ADDR14为0是来选通LCD使能。上面这位大侠,好好帮看看程序呀,看是哪里出了问题。

5楼: >>参与讨论
xwj
很明显你的译码逻辑混乱了,自己再仔细看看!
 
6楼: >>参与讨论
xwj
分析了一下,你的电路需在6和11脚件加反向器,11脚输出加反向器
这样逻辑才是对的

如果闲门太多,应该用A15、A14同时低电平时选通,这样用4个或非门就可以了

7楼: >>参与讨论
hunao
逻辑不太对
E = /(6 * 8)
  = /6 + /8
  = A14 + 3 * A15
  = A14 + /(R * W) * A15
  = A14 + (/R + /W) * A15
  =      A14
  + /R * A15
  + /W * A15


参与讨论
昵称:
讨论内容:
 
 
相关帖子
串口中断的调用
菜鸟求助,一定要帮帮哈。
如何唤醒休眠的系统
向各位大虾请教:ATMEL和STC的单片机ISP下载线能不能通用啊?
请推荐一款最简单的备份软件
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号