打印

求助st7920驱动器没有cs1 cs2片选端 该如何清除左 或右半屏

[复制链接]
3576|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangxinaaa|  楼主 | 2011-11-13 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wangxinaaa 于 2011-11-13 14:22 编辑

    • void chkBF(void)  //lcd检测忙
      {
      P0=0xff;
      lcdrw=0;
      lcdrs=1;
      lcden=1;
      while(!BusyFlag);
        delay(1);
      }
  • void write_cmd(uchar cmd)  //写命令write_cmd
    {
    chkBF();
    lcdrw=0;//写操作
    lcdrs=0;//命令
    P0=cmd;
    delay(1);
    lcden=1;
    delay(1);
    lcden=0;
    }
  • void write_date(uchar dat)   //写数据write_date()
    {
    chkBF();
    lcdrw=0;//写操作
    lcdrs=1;//数据
    P0=dat;
    delay(1);
    lcden=1;
    delay(1);
    lcden=0;
    }
  • void setxy(uchar x,uchar y)  //设置页地址x,范围0到7;列地址y,范围0到63;
    {
        write_cmd(SCRCLS);  //光标归位,清除显示,地址AC到00H
        write_cmd(0xb8+x);  //设置页地址
        write_cmd(0x40+y);  //设置列地址   
    }

  • void dis_hz(uchar x,uchar y,uchar *p)  //显示一个16x16dot的汉字
    {
          uint i,j;
          if(y<4)
          {
                 lcdcs1=0;lcdcs2=1;   // 清除左半屏   welcome_page(0x00);      
          }
          else
          {
                 lcdcs1=1;lcdcs2=0;   // 清除右半屏   welcome_page(0x01);
                 y-=4;  
           }
          for(i=0;i<2;i++)
           {
                 setxy(x*2+i,y*16);
                 for(j=0;j<16;j++)
                  {     
                         write_date(p[j+16*i]);
                  }
             }
            lcdcs1=0;lcdcs2=0;    // 全部清除   welcome_page(0x00);
    }
  • void dis_hzstr(uchar x,uchar y,uchar *p,uchar n) //显示一行汉字串
    {
            uint i;
            for(i=0;i<n;i++)
           {
                   dis_hz(x,y,p+i*32);
                   y++;
            }
    }
  • void dis_hz_fb(uchar x,uchar y,uchar *p) //在12864上的x,y处反白显示一个汉字
    {
          uint i,j;
          if(y<4)
          {
                lcdcs1=0;lcdcs2=1;    //welcome_page(0x00);//
           }
           else
           {
                  lcdcs1=1;lcdcs2=0;   
  •               y-=4;  
           }
           for(i=0;i<2;i++)
           {
                  setxy(x*2+i,y*16);
                  for(j=0;j<16;j++)
                  {     
                        write_date(255-p[j+16*i]);
                  }
           }
    l     cdcs1=0;lcdcs2=0;      
  • }

  • void clsram()   //清屏显示
    {
           uint i,j;
           lcdcs1=0;lcdcs2=1; //清左半行     
           for(i=0;i<8;i++)
           {
                  setxy(i,0);
                  for(j=0;j<64;j++)
                  {     
                            write_date(0x00);
                   }
                  setxy(0,0);
            }
  •         lcdcs1=1;lcdcs2=0; //清右半行   
            for(i=0;i<8;i++)
           {
                   setxy(i,0);
                   for(j=0;j<64;j++)
                   {     
                          write_date(0x00);
                    }
                   setxy(0,0);
            }
    }

  • void cls_line(uchar xx)   //清除一行汉字  xx:0-3
    {
           uint i,j;
           lcdcs1=0;lcdcs2=1; //清左半行   
           for(i=0;i<2;i++)
           {
                 setxy(2*xx+i,0);
                 for(j=0;j<64;j++)
                 {     
                         write_date(0x00);
                 }
                 setxy(0,0);
           }
  •        lcdcs1=1;lcdcs2=0;   //清右半行  
           for(i=0;i<2;i++)
           {
                  setxy(2*xx+i,0);
                  for(j=0;j<64;j++)
                  {     
                         write_date(0x00);
                  }
            }
    }
  • void lcd_init()   //LCD初始化lcd_init()
    {
            lcdres=0; //液晶复位
            delay(10);
            lcdres=1; //液晶复位结束
            write_cmd(DISPLAY_OFF);
            write_cmd(DISPLAY_ON);
            clsram();
            write_cmd(BASIC_INS);    //基本指令集
            write_cmd(CURSOR_ON);   //整体关,游标关,闪烁关
            write_cmd(0x06);      //DDRAM的地址计数器(AC)加1
            write_cmd(SCRCLS);   
            delay(10);            //等待初始化结束   
    }
  • void welcome_page(bit flagg)   //初始化界面进入(欢迎使用)
    {
            uchar i;
            clsram();
  •         if(!flagg)
            {
                       dis_hzstr(1,2,welcome,4);   //欢迎使用
  •                    delay(700);
                    //  for(i=0;i<8;i++)
                    //  {
                            //   dis_hz(0,i,wuxing);
                            //   dis_hz(3,7-i,wuxing+32);
                            //   delay(100);
                     //  }
                     //  for(i=0;i<8;i++)
                     //  {
                            //   dis_hz_fb(0,i,wuxing);
                            //   dis_hz_fb(3,7-i,wuxing+32);
                            //   delay(100);
                      //  }
                      //  for(i=0;i<8;i++)
                      //  {
                            //   dis_hz(0,i,wuxing);
                            //   dis_hz(3,7-i,wuxing+32);
                            //   delay(100);
                       //  }
             }
            delay(600);
            clsram();
    }
    void main()
    {
  •         bit WFlag=0;    //欢迎界面标志
            lcd_init();
            while(1)
           {
                  welcome_page(WFlag);
            }
    }

相关帖子

沙发
wangxinaaa|  楼主 | 2011-11-13 14:17 | 只看该作者
本帖最后由 wangxinaaa 于 2011-11-13 14:21 编辑

想咨询下像这st7920没有片选端cs1 、cs2的话,该如何清除左右半行显示的图形或是字体,(个人听几个朋友说要么用打点的方式进行清除,要么用CDRAM去写显示汉字,自己做字库,清除的时候直接往GDRAM相关位置写入0x00)可这方式昨晚弄了个通宵还不大明白,个人根据网络查找更改如下代码:(可该代码是如何读取的?)
//设置CGRAM字库
//ST7920 CGRAM(用户自定义图标)空间分布
//空间1地址:40H~4FH共16个地址,一个地址对应两个字节数据;对应调用码:0000H
//空间2地址:50H~5FH共16个地址,一个地址对应两个字节数据;对应调用码:0002H
//空间3地址:60H~6FH共16个地址,一个地址对应两个字节数据;对应调用码:0004H
//空间4地址:70H~7FH共16个地址,一个地址对应两个字节数据;对应调用码:0006H
//参数说明:num为空间编号,CGRAM_ZIKU为地址指针

void SET_CGRAM(unsigned char num,unsigned char *CGRAM_ZIKU)
{
        unsigned char i,add;
        write_cmd(0x34);     //再次设置为8位并行口,扩展指令集
        write_cmd(0x02);     //SR=0,允许设置CGRAM地址
        write_cmd(0x30);     //恢复设置为8位并行口,基本指令集
        add=(num<<4)|0x40;    //计算CGRAM的首地址
        for(i=0;i<16;i++)
        {
          write_cmd(add+i);    //设置CGRAM的首地址
          write_date(welcome[i*2]); //写入高8位数据
          write_date(welcome[i*2+1]);//写入低8位数据
        }
}
//********************************************************
//指定位置显示CGRAM自造字函数
//参数说明:x为行号,y为列号,num为编号
//********************************************************
void Display_CGRAM(unsigned char x,unsigned char y,unsigned char num)
{
        Set_Cursor(x,y);    //设置显示的起始地址
        write_date(0x00);     //写入需要显示汉字的高八位数据
        write_date(num*2);    //写入需要显示字符的低八位数据
}

使用特权

评论回复
板凳
wangxinaaa|  楼主 | 2011-11-13 14:20 | 只看该作者
希望大家能耐心教导,  个人以前玩过这屏可没深入学习,学单片机已经好几年了 ,如今深感愧疚

使用特权

评论回复
地板
mcu_lover| | 2011-11-13 21:24 | 只看该作者
LZ 你把KS0108 和ST7920搞错了。不要以为到网上随便抄个程序就可以用了。
用GDRAM去写显示汉字,自己做字库,清除的时候直接往GDRAM相关位置写入0x00 按照你这个朋友的建议去做就可以了。

使用特权

评论回复
5
ningling_21| | 2011-11-13 21:37 | 只看该作者
在7920相应位置的显示RAM写入字符“0X20”就可以起到清屏的效果...

使用特权

评论回复
6
baiyunfei.k.f| | 2011-11-14 14:33 | 只看该作者
同意5L,写空格0x20就行了

使用特权

评论回复
7
wangxinaaa|  楼主 | 2011-11-23 19:14 | 只看该作者
楼上baiyunfei.K.f  我现在这程序调试差不多了,就初始化显示过程已经全部清屏可不知为何一开机还是有杂点显示!! 可否交流下想, 希望有看着留言  或是知道的能加我qq:327289421 聊一下   这问题都一个多星期还未解决

使用特权

评论回复
8
baiyunfei.k.f| | 2011-11-25 20:19 | 只看该作者
刚上电时,液晶模块可能处于非稳定状态,你可以控制复位脚或直接上电复位,只要初始化后能正常显示,应该就没问题

使用特权

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

本版积分规则

0

主题

71

帖子

1

粉丝