[求助] 【求助】关于12864的疑问

blue_bm   2012-9-9 21:15 楼主
是这样的,我今天写了一段代码,让12864显示两行字符,正常的话应该是这种效果:

年 月 日
时 分 秒

一上来写的时候写错了,把显示代码放在了while(1)里,也就是这段显示程序一直无限循环。
这个的效果是能看出来字符在闪动,这个我可以理解,可是我不理解的是,字符显示居然成了这样:

年 月 日
时 分 秒 年

月 日

难道说12864比单片机反应快吗?
上善若水 顺其自然

回复评论 (14)

地址乱套了
点赞  2012-9-10 08:35

回复 沙发 huo_hu 的帖子

能说的详细点吗?谢谢啦
上善若水 顺其自然
点赞  2012-9-10 20:02
每次显示时先送要显示的地址0x80+addr,如果不送地址直接给数据就是在当前AC后面显示.addr范围0~31,(32=0...).你的程序可能送的地址不对。
另外不刷新内容液晶不应该闪,既然那几个字是固定的就不用刷新它。
点赞  2012-9-11 08:16
哥们,你的头像很像我一朋友
点赞  2012-9-11 08:32

回复 4楼 huo_hu 的帖子

她用的是12864不是1206
点赞  2012-9-12 11:29

回复 楼主 blue_bm 的帖子

程序上有问题。上程序
点赞  2012-9-12 12:31

回复 6楼 ltbytyn 的帖子

1602和12864一样的
点赞  2012-9-12 13:38

回复 7楼 ltbytyn 的帖子

我一直都用的这段程序...就是不知道为什么放while(1)里就不行了...


uchar code tab1[]="  年  月  日";
uchar code tab2[]="  时  分  秒";

sbit lcd_rs = P2^0;   //H=data; L="command";
sbit lcd_rw = P2^1;   //H=read; L="write";
sbit lcd_en = P2^2;   //input enable;
sbit lcd_psb= P2^3;   //H=并口; L="串口";
sbit lcd_rst= P2^4;   //Reset Signal 低电平有效
sbit lcd_busy=P0^7;   //lcd busy bit



void main()
{
        while(1)
            {
                lcd_init();
                 lcd_wcmd(0x01);

                lcd_pos(0,0);
                print(tab1);
                lcd_pos(2,0);
                print(tab2);
        }
}





//液晶检测忙状态
void busy_lcd(void)
{
        lcd_data=0xff;
        lcd_rs=0;
        lcd_rw=1;
        lcd_en=1;
        while(lcd_busy==1);
        lcd_en=0;
}


//对液晶写指令
void lcd_wcmd(uchar cmd)
{
        busy_lcd();
        lcd_rs=0;
        lcd_rw=0;
        lcd_data=cmd;
        lcd_en=1;
        ;
        lcd_en=0;
}


//对液晶写数据
void lcd_wdata(uchar dat)
{
        busy_lcd();
        lcd_rs=1;
        lcd_rw=0;
        lcd_data=dat;
        lcd_en=1;
        ;
        lcd_en=0;
}


//液晶初始化
void lcd_init(void)
{
        lcd_wcmd(0x30);
        //基本指令操作
        lcd_wcmd(0x06);
        /*光标的移动方向*/
        lcd_wcmd(0x0c);
        /*开显示,关游标*/
        lcd_wcmd(0x01);
        //清除显示内容
}


//指定要显示字符的坐标
void lcd_pos(uchar y, uchar x)
{
       
        if(y==1)
        lcd_wcmd(0x80|x);
        if(y==2)
        lcd_wcmd(0x90|x);
        if(y==3)
        lcd_wcmd((0x80|x)+8);
        if(y==4)
        lcd_wcmd((0x90|x)+8);

}

//液晶显示字符串程序
void print(uchar str[])
{
        uint i;
        i=0;
        while(str!='\0')
        {
                lcd_wdata(str);
                i++;
        }
}
上善若水 顺其自然
点赞  2012-9-12 23:29
while(str)        {
                lcd_wdata(str
);
                i++;
        }


[ 本帖最后由 huo_hu 于 2012-9-13 08:41 编辑 ]
点赞  2012-9-13 08:39
我也打不上[]号
点赞  2012-9-13 08:42
你怎么把 lcd_init();
放到大循环里面去了
点赞  2012-9-13 08:44

回复 9楼 blue_bm 的帖子

void main()
{
        while(1)
            {
                lcd_init();
                 lcd_wcmd(0x01);

                lcd_pos(0,0);
                print(tab1);
                lcd_pos(2,0);
                print(tab2);
        }
}
楼主把初始化放入循环中是大错特错.
在主函数初使化一次就行
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2012-9-13 16:09

回复 13楼 ddllxxrr 的帖子

呃...这个是打错了...因为程序被我改了,再弄到这的时候有点不仔细...原来试的程序里初始化是不在大循环里的
上善若水 顺其自然
点赞  2012-9-13 17:04
点赞  2012-10-2 10:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复