打印

杯具了,12864显示不了,请帮忙!

[复制链接]
1310|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
joyme|  楼主 | 2011-8-11 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
买了两个12864带中文字库模块,整了一下午,一个字也显示不了,大家帮帮忙
用的是ATmega16,读状态0xfc命令,多数时候返回都是0xFF
看写的数据波形是完全符合我写的逻辑的

相关帖子

沙发
joyme|  楼主 | 2011-8-11 17:00 | 只看该作者
void                sendbyte(BYTE outData);

void                lcd_init(void)
{
        delayms(40);               //大于40MS  的延时程序
        CLRBIT(lcdport,PSB);       //设置为串口工作模式
        delayus(1);                //延时
    CLRBIT(lcdport,RES);       //复位
        delayms(2);                //延时
        SETBIT(lcdport,RES);       //复位置高
       
        CLRBIT(lcdport,CLK);       //Clock Set High
        CLRBIT(lcdport,SDA);       //Data Set High
        CLRBIT(lcdport,CS);        //CS set low to disable communication
       
        delayus(BYTE_INTERVAL);
        senddata(0x30,TRUE);             //Extended Function Set :8BIT 设置,RE=0: basic instruction set, G=0 :graphic display OFF
        delayus(CMD_INTERVAL);              //大于 100uS 的延时程序
        senddata(0x03,TRUE);
    delayus(CMD_INTERVAL);              //大于 100uS 的延时程序
        senddata(0x0C,TRUE);              //Display Control,D=1,显示开
    delayus(CMD_INTERVAL);              //大于 100uS 的延时程序
    senddata(0x01,TRUE);             //Display Clear
    delayms(4);               //大于 10mS 的延时程序  
        senddata(0x06,TRUE);             //Enry Mode Set,光标从右向左加 1 位移动
        delayus(CMD_INTERVAL);              //大于 100us 的延时程序
}

BYTE ReceiveByte(void)
{
     BYTE i,temp1,temp2;
     temp1=temp2=0;
         CLRBIT(lcdddr,SDA);
     for(i=0;i<8;i++)
     {
           SETBIT(lcdport,CLK);            
                   delayus(BIT_DELAY);
           CLRBIT(lcdport,CLK);
                   delayus(BIT_DELAY);
           if(GETBIT(lcdpin,SDA)!=0) temp1 |= (1<<(8-i));
     }
     for(i=0;i<8;i++)
     {
           SETBIT(lcdport,CLK);            
                   delayus(BIT_DELAY);
           CLRBIT(lcdport,CLK);
                   delayus(BIT_DELAY);
           if(GETBIT(lcdpin,SDA)!=0) temp2 |= (1<<(8-i));
     }
         i = (temp1&0xf0) + ((temp2>>4)&0x0f);
         SETBIT(lcdddr,SDA);
         //FormTXDMessage(RETURN_STATUS,i);
         //delayms(100);
     return i;
}

void CheckBusy( void )
{
     do   sendbyte(0xfc);      //11111,RW(1),RS(0),0
     while(0x80&ReceiveByte());      //BF(.7)=1 Busy
}

void                sendbyte(BYTE outData)
{
        BYTE  i = 0;
        for(i=0;i<8;i++)
        {
                 CLRBIT(lcdport,CLK);
                if((outData & 0x80) != 0)
                        SETBIT(lcdport,SDA);
                else
                        CLRBIT(lcdport,SDA);
                delayus(BIT_DELAY);
                SETBIT(lcdport,CLK);
                delayus(BIT_DELAY);
                CLRBIT(lcdport,CLK);
                outData <<= 1;
        }
}

void                senddata(BYTE data,BYTE  isCmd)
{
        SETBIT(lcdport,CS);
        CheckBusy();
        if(isCmd)
                sendbyte(0xf8);                             //11111,RW(0),RS(1),0
        else
                sendbyte(0xfa);                            
        //delayus(BYTE_INTERVAL);
        sendbyte(data & 0xf0);                              //Send high 4 bits
        //delayus(BYTE_INTERVAL);
        sendbyte((data<<4) & 0xf0);            //Send low 4 bits
        //delayus(BYTE_INTERVAL);
        CLRBIT(lcdport,CS);       
}
void        refresh(BYTE   linenum, BYTE FirstTime)
{
        BYTE i;
        static BYTE        xx = 0;
        if(FirstTime)
        {
                 startpos[0] = 0;
                startpos[1] = 0;
        }
        senddata(0x30,TRUE);       
        switch(linenum)
        {
                case REFRESH_ALL:
                default:
                         senddata(0x80+xx,TRUE);                                                            //Set line 1 DD RAM address
                        for(i = 0;i < FIXED_MAX;i++)
                                  senddata(/*LineFour[i]*/0x30,FALSE);
                        xx += 8;
                        xx &= 0x1f;
                        if(xx==0)
                                senddata(0x01,TRUE);       
/*
                        senddata(0x88,TRUE);
                        delayus(CMD_INTERVAL);
                        sendlinedata(num_two,linenum - 1,LineTwo);
                        senddata(0x90,TRUE);
                        delayus(CMD_INTERVAL);
                        sendlinedata(num_three,linenum - 1,LineThree);
                         senddata(0x98,TRUE);                                                              //Set line 1 DD RAM address
                        delayus(CMD_INTERVAL);
                        for(i = 0;i < FIXED_MAX;i++)
                                  senddata(LineFour[i],FALSE);               
*/                                  
                        break;
                case  LINE_TWO:
                         startpos[0] += 2;
                        senddata(0x88,TRUE);
                        sendlinedata(num_two,startpos[0],LineTwo);
                        break;
                case LINE_THREE:
                         startpos[1] += 2;
                        senddata(0x98,TRUE);
                        sendlinedata(num_three,startpos[1],LineThree);
                        break;
        }
}
上面是代码,有点多,大家包涵点,目前只是运行了REFRESH_ALL这个case里的代码,在主while里定时300ms调用一次

使用特权

评论回复
板凳
joyme|  楼主 | 2011-8-11 17:20 | 只看该作者
帮忙呀,什么情况下读状态会一直返回0xff呀,是硬件问题还是软件设置问题,我都是按规格书设置的呀

使用特权

评论回复
地板
joyme|  楼主 | 2011-8-11 18:04 | 只看该作者
搞定了,原来是Reset哪里的延时不够

使用特权

评论回复
5
老鱼探戈| | 2011-8-11 22:08 | 只看该作者
:L
真大意。带字库的很简单

使用特权

评论回复
6
joyme|  楼主 | 2011-8-12 15:48 | 只看该作者
结贴了,没人跟的贴,分全给老鱼啦,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

1289

帖子

0

粉丝