这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 12232C,16 12232C液晶现实,前16列乱码.....

共2条 1/1 1 跳转至

12232C,16 12232C液晶现实,前16列乱码.....

院士
2006-09-17 18:14:16     打赏
12232C,16 12232C液晶现实,前16列乱码.....



关键词: 12232C     液晶     现实     16列     乱码     .....    

院士
2006-12-22 22:43:00     打赏
2楼
问  /*=====================================================================

                        HY-12232C9显示驱动程序

                    于2006年十一黄金周期间创作于天津
                 编译环境为KEILC UV2. MCU-AT89C52
                   参考www.21ic.com论坛上众多高手作品

======================================================================

                        HY-12232C9引脚说明

                    1--GND:
                    2--VCC:
                    3--GND:
                    4--RS:    为H,表示D0-D7为数据
                            为L,表示D0-D7为指令
                    5--E1:    读写使能信号(master).
                    6--E2:    读写使能信号(slaver).
                    7--R/W: 读写选择信号。
                            为H,读数据。
                            为L,写数据。
                    8--DB0:
                        .            .
                        .            .
                    15--DB7:
                    16--RST: 复位信号,上升沿复位,
                             复位后电平保持为高.
                    17--LEDA:接LCD外接驱动电源:0-+5V
                             或0--5V.这里接+5V。
-----------------------------------------------------------------------

                             接线说明

            |DB0----P1.0| |DB1----P1.1| |DB2----P1.2|
            |DB3----P1.3| |DB4----P1.4| |DB5----P1.5|
            |DB6----P1.6| |DB7----P1.7|    |RS ----P2.6|
            |E1 ----P2.5| |E2 ----P2.4| |R_W----P2.3|
            |RST----P2.2| |LEDA---VCC |


=====================================================================*/

    #include     <reg52.h>
    #include    <intrins.h>
//---------------------------------------------------------------------
    #define        uchar    unsigned    char
    #define        uint    unsigned    char

    sbit    RS  =     P2^6;
    sbit    E1  =     P2^5;
    sbit    E2  =     P2^4;
    sbit    R_W =     P2^3;
    sbit    RST =     P2^2;

    sbit    led =    P2^7;            //外接指示灯,用于测试?
//---------------------------------------------------------------------
    void delay(uint    i);             // 函数声明   
//---------------------------------------------------------------------
    void wr_m_i(uchar i)               // 写指令到master.
    {
     do                             // 判忙
     {
      E1=0;RS=0;R_W=1;E1=1;
     }while(P1&0x80);

     E1=0;RS=0;R_W=0;P1=i;E1=1;
     _nop_();_nop_();
     E1=0;
     }

    void wr_m_d(uchar i)            // 写数据到master.
    {
     do                             // 判忙
     {
      E1=0;RS=0;R_W=1;E1=1;
     }while(P1&0x80);

     E1=0;RS=1;R_W=0;P1=i;E1=1;
     _nop_();_nop_();
     E1=0;
     }
//---------------------------------------------------------------------
    void wr_s_i(uchar i)               // 写指令到slaver.
    {
     do                                // 判忙
     {
      E2=0;RS=0;R_W=1;E1=1;
     }while(P1&0x80);

     E2=0;RS=0;R_W=0;P1=i;E2=1;
     _nop_();_nop_();
     E2=0;
    }

    void wr_s_d(uchar i)            // 写数据到slaver.
    {
     do
     {
      E2=0;RS=0;R_W=1;E2=1;            // 判忙
     }while(P1&0x80);

     E2=0;RS=1;R_W=0;P1=i;
     E2=1;
     _nop_();_nop_();
     E1=0;
     }
//----------------------------------------------------------------
    void lcd_display(void)            // 显示测试程序:左半屏为数据全
    {uchar page,line,i;                // 为0F.右半屏全为F0.
     for(page=0;page<4;page++)
/*-----------------------------------------------------------------
     {wr_m_i(0xb8|page);wr_s_i(0xb8|page);
      wr_m_i(0x00);wr_s_i(0x00);    // 此部分程序为最初写的.显示不
      for(line=0;line<64;line++)    // 正常.右半屏乱码
       {                            // 后改为下边程序;每一页先写左
        wr_m_d(0x0f);               // 半屏,再写右半屏后,正常.
        wr_s_d(0xf0);
        }       
      }
------------------------------------------------------------------*/
      {wr_m_i(0xb8|page);wr_s_i(0xb8|page);
      wr_m_i(0x00);wr_s_i(0x00);
      for(line=0;line<61;line++)wr_m_d(0x0f);
      for(line=0;line<61;line++)wr_s_d(0xf0);
      }    
     for(i=0;i<100;i++)delay(50);
     led=~led;
    }
//---------------------------------------------------------------------
    void delay(uint    i)                // 延时子函数.
    {
     uint    j;
     for(j=0;j<i;j++);
    }
//---------------------------------------------------------------------
    void clr_ram(void)                // 清屏函数.
    {
     
     uchar page,line;
     for(page=0;page<4;page++)
     {wr_m_i(0xb8|page);wr_s_i(0xb8|page);
      wr_m_i(0x00);wr_s_i(0x00);
      for(line=0;line<61;line++)wr_m_d(0x00);
      for(line=0;line<61;line++)wr_s_d(0x00);
     }

    }
//---------------------------------------------------------------------
    void lcd_init(void)                // 液晶模块初始化
    {delay(100);
     RST=0;                            // 调试程序时偶然发现在RST=0;RST=1之    
     RST=1;                            // 间如果加入多个NOP后(足够多,10Q多
                                    // 个),不显示.WHY????????
     wr_m_i(0xaf);
     wr_s_i(0xaf);     
     wr_m_i(0xc0);
     wr_s_i(0xc0);
     wr_m_i(0xa4);
     wr_s_i(0xa4);
     wr_m_i(0x00);
     wr_s_i(0x00);
     wr_m_i(0xa9);
     wr_s_i(0xa9);
     wr_m_i(0xa0);
     wr_s_i(0xa0);
     wr_m_i(0xba);
     wr_s_i(0xba);
     wr_m_d(0x0f);
     wr_s_d(0x0f);
    }
//---------------------------------------------------------------------
    char rd_m_d(void)                // 从master读RAM数据.
    {char i;
     do
     {
      E1=0;RS=0;R_W=1;E1=1;
     }while(P1&0x80);

     E1=0;RS=1;R_W=1;E1=1;
     _nop_();_nop_();
     i=P1;
     return(i);
    
    }
//---------------------------------------------------------------------
    void mov_ram(void)                // 从master第一页中取出几列数据送slaver
    {                                // 用于测试目的.
     uchar i,buff[8];
     wr_m_i(0xb8|0);wr_m_i(0x00);    // 第一页的第一列开始
     for(i=0;i<4;i++)buff[i]=rd_m_d();
     wr_s_i(0xb8|0);wr_s_i(0x03);    
     for(i=0;i<4;i++)wr_s_d(buff[i]);
    }
//---------------------------------------------------------------------
    void test_prog(void)            // 测试程序. 分别在master\slaver的第一页
    {                                // 的前几列写数据.
     char i;
     wr_m_i(0xb8|0);                // ????此处很奇怪,见下边陈述
     wr_m_i(0xb8|0);
     _nop_();
     wr_m_i(0x00);
     for(i=0;i<4;i++)wr_m_d(0xaa);    // ????此处显示也很奇怪
     wr_s_i(0xb8|0);wr_s_i(0x02);
     for(i=0;i<4;i++)wr_s_d(0x55);
    }
//---------------------------------------------------------------------
    void main(void)

    {
     lcd_init();
     lcd_display();
     clr_ram();
     lcd_display();
//     mov_ram;
     test_prog();
     for(;;);
    }



1.开始只写了左边,右边没有处理(没有在初始化程序中写slaver的工作方式,也没有对RAM做任何操作.)对左边的RAM清零后,只写一次.
但是,左边的前16列是乱码,反复上电,偶尔能正常显示....这时右半边没有显示.

上电先后延时一段时间后在复位液晶模块,不行.
后来又改为上边所帖程序(反复写RAM),不行.

小弟没有调试经验,刚刚开始写程序,所以到这里没有办法了...

2.把所有的对左半边的操作,均改为右边边.现象一样.左边没有显示.

3.在初始化程序中加上对左边的操作,对左右两边都清零,都写RAM.如所帖程序.
左边前16列乱码,但是右边都是乱码!!!!!!!  

4分别注释掉led_display中的wr_m_d,wr_s_d后,乱码,但现象还不同.


1: 个人见解1 读忙状态前应该浮置总线,否则依LZ的程序没有超时判断,很容易造成死机
  P1 = 0xFF;
  do  { E2=0;  RS=0;   R_W=1;  E2=1; }while(P1&0x80);
2 写数据或命令,在写信号沿之前,应该有一段稳定时间,检查时间是否足够
  P1=i;  E2=1;  _nop_(); _nop_();   E2=0;
  是不是应该改为
  P1=i;  _nop_();_nop_(); E2=1;    E2=0;
3 LCD控制器是否有超时要求,如果在读写时超时是否会出现乱码,可考虑加入关中断的操作,
  EA=0;  P1=i;  _nop_();_nop_(); E2=1;    E2=0; EA=1;


2: 10.5日调试进展昨天乱码现象今天有所改观.但想不明白为什么??

把lcd_display()改为先写每一页左半屏,再写每一页右半屏后,昨天的3和4现象消失,但左右半屏的前面十几列都是乱码.

在模块初始化中,改为从左到右显示后,1和2现象消失.为什么跟现实方式还有关系??


但今天又出现问题:
1,在test_prog()中,把左半屏的第一页的前4列写数据AA,把右半屏第一页的第3列开始的4列写55.
但显示情况是:左半屏第一页前4列显示数据为AA.右半屏的第一页的3\4\5列显示数据为55,少的一列在左半屏的第5列........
如果只写右半屏的话,那么右边还是少一列,但是左边没有显示.......
2,加上test_prog()测试后,反复上电,左半屏的几列有时在第四页显示.
后在加一个写页地址子程序wr_m_i(0xb8|0),显示正常.WHY??不明白
3: 谢谢zg17903别的都显示正常了,读忙应该没有问题了吧.

回去再试试. 4: 还是喜欢串行接法,用SPI

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]