导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:关于点阵液晶显示求助!

* 18195: C51编程:关于点阵液晶显示求助!

   xiaotan97 
xiaotan97发表的帖子 

 C51编程:关于点阵液晶显示求助!
    我在编写点阵液晶显示的时候发现一个这样的问题让我没有高明白是怎回事,请求大家
帮助。
    我选用用的液晶片是Truly  MFC-G12864DPLY-1N型点阵液晶显示模块。单片机选用的是
89C51或52。P2口同液晶片的D0~D7相联。P1口的低5位接读写和片选信号。
    问题:
    在对模块的左半边进行写的时候,起先定义一个页和一个起始列写字的上半部分,写完
后在定义另外一页,再重先定以列同前面定义的列相同(对齐)。一般来说只要定义一个起
始列后再进行写的时候列计数自动相加。那么重先定义列,他会自动从新定以列处再自动相
加,这样达到前后两页的数据对齐,不如写一个字就会上下半对齐。但是我却发现程序执行
的时候没有按我预期的设想工作。即列记数一直再相加,导致上下部分出现错位。同样的程
序我把片选设在右半部分时结果又是正确的。这到底是怎么回事?!
  我的源程序如下:
  请各位大侠帮忙分析一下我的程序,到底是什么原因导致这个问题的?谢谢!
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>

#define     uchar  unsigned char
#define     uint   unsigned int
#define     Byte   unsigned char
#define     Word   unsigned int
#define     bool   bit 

sbit   y_rs        = P1^0;             /*定以寄存器选择信号引脚*/        
sbit   y_rw        = P1^1;             /*定义使能引脚*/
sbit   y_e         = P1^2;             /*定义读写引脚*/        
sbit   y_cs1       = P1^3;             /*定义片选1引脚*/
sbit   y_cs2       = P1^4;             /*定义片选2引脚*/
sbit   y_rstb      = P1^5;             /*定义复位引脚*/

                                       /*P2口为D0-D7数据线*/ 
                                    
uchar code buff[]=                     /*显示一个重字*/
{
  
0x10,0x10,0x12,0xF2,0x52,0x52,0x52,0xFE,0x52,0x52,0x51,0x31,0xF1,0x10,0x08,0x08,
  
0X80,0XA0,0XA0,0XA7,0XA5,0XA5,0XA5,0XFF,0XA5,0XA5,0XA5,0XA5,0XA7,0X90,0X80,0X80
};

                                     
/*-----------------------------------------------------------------*/

void init(void);
void L_WriteState(uchar L_WRSTATE);
void L_WriteData(uchar L_WRDATA);
void Clear(void);
void Write(void);


void main(void)
{
  y_cs1 = 0;
  _nop_();
  y_cs1 = 1;
  _nop_();
  y_cs1 = 0;
  init();
  Write();
  while(1);
}

void init(void)
{
   uchar temp;
  
   y_rstb=0;                                       /*显示复位*/
   _nop_();
   _nop_();
   y_rstb=1;
   
   P1 = 0X38;                                      /*使能片选1和2*/
   y_rw=1;                                         /*读写允许;读取状态字*/
   y_rs=0;                                         /*清除寄存器选择信号口*/
  
   temp=P2 | 0XFF;  
   while ((temp & 0X10)==0X10)                     /*复位状态*/  
   {   
        while ((temp & 0X80)==0X80)                   /* 处于忙状态 */
     {
       P2|=0XFF;                                   /*将P2口全部置1*/
       y_e=1;                                      /*使能液晶显示模块*/ 
       temp=P2;
       y_e=0;  
     }
   } 
   
  temp=0XC0;                                       /*设置起始行*/
  L_WriteState(temp);
                        
  temp=0X3F;                                       /*开显示*/
  L_WriteState(temp);
  
  Clear();                                         /*清屏*/
}

void L_WriteState(uchar L_WRSTATE)                  /*写控制信息*/       
{  uchar  mm;
   mm=0X80;
   y_rs=0;          
   y_rw=1; 
   _nop_();   
   _nop_(); 
  
   while(mm==0X80)                                  /*判断是否忙?*/
   {
     P2|=0XFF;
     y_e=1;
     mm=P2 & 0X80;
     _nop_();
     _nop_();                                       /*取忙标志*/ 
     y_e=0;
    }
    
    y_rw=0;
    y_rs=0;
    
    P2=L_WRSTATE;
    y_e=0;
    _nop_();
    _nop_();
    y_e=1;
    _nop_();
    _nop_();
    y_e=0;
}


void Clear(void)                                   /* 清屏 */
{
  uchar rr,ss,cc;     
  P1=0X38;                                         /*清除 显示 RAM*/
  
  for (cc=0xB8;cc<=0XC0;cc++)   
  {  
    rr=cc;             
    ss=0XC0;                                       /*设置起始行*/
    L_WriteState(ss);
  
    ss=rr;                                         /*设置页地址*/
    L_WriteState(ss);
  
    ss=0X40;                                       /*设置列地址起始位置*/
    L_WriteState(ss); 
  
    rr=0X40;                                       /*清64列*/  
    while(rr--)
    {
      ss=0X00;
      L_WriteData(ss);
    }
  }
}


void L_WriteData(uchar L_WRDATA)                  /*输出数据*/
{
   uchar  mm;
   mm=0X80;
   y_rs=0;          
   y_rw=1;  
   _nop_();   
   _nop_();     
   while(mm==0X80)                               /*判断是否忙?*/
   {
     P2|=0XFF;
     y_e=1;
     mm=P2 & 0X80;
     _nop_();
     _nop_();                                    /*取忙标志*/ 
     y_e=0;
    }
  
   y_rs=1;
   y_rw=0;
   _nop_();
   _nop_();
   
   P2=L_WRDATA;                                  /*端口写数*/
   y_e=0;
   _nop_();
   y_e=1;
   _nop_();
   y_e=0;
}

void Write(void)                    /*写数据*/
{
  uchar L_Wr1,L_Wr2,L_Wr3,L_Wr4;
  int  ii;
  Clear();
  
  y_cs1=1;                        
  y_cs2=0;
  _nop_();


  L_Wr1=0XBA;                      /*第3页*/            
  L_WriteState(L_Wr1);
  
  L_Wr1=0X50;                      /*第49列*/    
  L_WriteState(L_Wr1);
  
  for (ii=0;ii<16;ii++)            /*写字的上半部分*/
  {  
    L_Wr3=buff[ii];
    L_WriteData(L_Wr3);
  } 
  

  y_cs1=1;
  y_cs2=0; 
  _nop_();

 
  L_Wr1=0XBB;                      /*第4页*/                       
  L_WriteState(L_Wr1);
  L_Wr1=0X50;                      /*第49列*/    
  L_WriteState(L_Wr1);
 


  
  for(ii=16;ii<32;ii++)            /*写下半部分*/       
  {
    L_Wr3=buff[ii];
    L_WriteData(L_Wr3);
  }
  _nop_();
}

发表时间:2003年1月30日15:55:00

  
回复该帖

本主题共有 6 帖,分页:>>>>>该主题的所有内容[6]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  18237.[详细]你一自己一定可以调成功
摘要:别人很难看你的程序。相信你一定能调出来。我水平不高,看不出你在写前确定写的位置。 调出后告诉我。......(48字)
- [v-e][978次] 2003年2月3日

  18333.[详细]问题找到了
摘要:是液晶模块本身左半部分有问题,我换了一块液晶片就解决了。程序可用。......(33字)
- [xiaotan97][840次] 2003年2月7日

  18362.[详细]祝贺你!
摘要:......(无内容)
- [a12345678][795次] 2003年2月8日

[上一篇帖子]:建议改用赛灵公司的相应产品,否则你的设计会失败的,我不愿看到有人重蹈覆辙
[下一篇帖子]:硬件:请问哪个公司能提供EP7312样片,我到凌云申请了二次了。我在哈尔滨