amobbs.com 阿莫电子技术论坛

标题: [21单片机]ST7920 12864液晶做的图文菜单显示及其问题【恢复】 [打印本页]

作者: 21mcuel    时间: 2009-1-12 14:10
标题: [21单片机]ST7920 12864液晶做的图文菜单显示及其问题【恢复】
 ST7920 12864液晶做的图文菜单系统可以显示图案,遗憾的是显示会有花屏,不知道是什么原因?





ST7920 12864液晶做的图文菜单系统 (原文件名:ST7920 12864液晶做的图文菜单.jpg) 
作者: ttmax    时间: 2009-1-12 22:11
能否公布下源文件,我认为是的位置设置可能没有设置好。如果有半角字加进去就肯定会出乱码。我以前写的就是如此的。
作者: 21mcuel    时间: 2009-1-14 09:42
问题症状:ATMEGA16芯片+ST7920 12864液晶(SYB12864J-ZK)蓝底白字, 

  1.显示汉字或大片(128*64)正常,

  2.显示小图片(32*24)周围会有很多杂点,见图所示,即使在写图片之前,写图函数

  LCD12864_opGDRAM(0x00);已经写0x00了!!!!!!并且清0了!!!!还是有杂点,换了一个旧的液晶TG12864E-03

  还是一样的,不知道什么原因?

  

 (原文件名:ST7920 12864液晶图文菜单显示问题.jpg) 

  

  

/*******************************************

  文件:ST7920 12864液晶图文菜单显示.C

  环境:编译为ICC AVR6.31A,仿真为AVR Studio4.14

  硬件:ATMEGA16芯片

  日期:2008年12月10日 

  ** Author:ZRP QQ:978710555 E_Mail:zrp_ncu@163.com

  ** Time :  2009-1-4

/******************************************/

#include <iom16v.h>                        //包含型号头文件

#include <macros.h>                        //包含"位"操作头文件

#include <stdio.h>                        //标准输入输出头文件

#include <AVR_EB1A.H>                //包含自定义常量头文件



#pragma data:code

//以下是字模工具取出的图片数组

/*========================== 菜单图片(宽度x高度=32*24)=============================*/

const uchar menu_pic[6][96]={

     // 调整 

         {0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,

         0x40,0x00,0x00,0x82,0x47,0xFF,0xE1,0xC2,0x47,0xFF,0xF3,0xE2,0x47,0x38,0x68,0x02,

         0x46,0xDF,0x68,0x82,0x46,0xDF,0x69,0xC2,0x46,0xDE,0xE8,0x82,0x46,0xDD,0xE8,0x02,

         0x46,0xDD,0xE8,0x02,0x47,0x3D,0xE8,0x02,0x47,0xFF,0xE8,0x02,0x47,0xFF,0xE9,0xC2,

         0x42,0x00,0x18,0x02,0x41,0xFF,0xF3,0xE2,0x40,0x00,0x01,0xC2,0x40,0x00,0x00,0x82,

         0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00

         },

        // 工具                                        

         {0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x00,0x03,0x82,

         0x41,0xF0,0x07,0xC2,0x43,0xFF,0xCF,0xE2,0x47,0x3F,0xFE,0x02,0x47,0x3F,0xFE,0x02,

         0x43,0xFF,0xCF,0xE2,0x41,0xF0,0x0F,0xC2,0x40,0x00,0x03,0x82,0x40,0x00,0x00,0x02,

         0x40,0x00,0x03,0xC2,0x40,0x00,0x03,0xC2,0x41,0x80,0x01,0x82,0x43,0xFF,0xF3,0xC2,

         0x47,0xFF,0xFF,0xE2,0x47,0xFF,0xFF,0xE2,0x43,0xFF,0xF3,0xC2,0x41,0x80,0x01,0x82,

         0x40,0x00,0x01,0x82,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00

         },

         // 设置

         {0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x43,0x18,0x00,0x02,

         0x44,0xA4,0x0E,0x02,0x44,0xA4,0x1F,0x02,0x43,0x24,0x3F,0x02,0x40,0x00,0x7F,0x02,

         0x40,0xF0,0xFC,0x02,0x43,0xF9,0xF0,0x02,0x43,0x03,0xE0,0x02,0x46,0x77,0x80,0x02,

         0x46,0x7F,0x00,0x02,0x46,0x7E,0x00,0x02,0x46,0x7C,0x00,0x02,0x47,0x3D,0x00,0x02,

         0x43,0x1D,0x81,0x22,0x43,0x81,0xB2,0x42,0x41,0xC3,0x4F,0xE2,0x40,0xFE,0x4A,0x42,

         0x40,0x3C,0x32,0x42,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00

         },

        // 保密

         {0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0xFC,0x03,0x02,

         0x41,0xFE,0x1F,0x02,0x43,0x87,0x03,0x82,0x43,0x03,0x03,0x02,0x43,0x03,0x03,0x02,

         0x43,0x03,0x0F,0x02,0x43,0x03,0x03,0x02,0x43,0x03,0x03,0x02,0x47,0xFF,0x83,0x02,

         0x47,0xFF,0x83,0x02,0x47,0xCF,0x83,0x02,0x47,0x87,0x83,0x02,0x47,0xCF,0x83,0x02,

         0x47,0xCF,0x87,0x82,0x47,0xCF,0x8F,0xC2,0x47,0xCF,0x9C,0xE2,0x47,0xFF,0x8F,0xC2,

         0x43,0xFF,0x07,0x82,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00

         },

        // 版本

         {0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,

         0x40,0x0F,0x00,0x62,0x40,0x1D,0x80,0xF2,0x40,0x38,0x41,0xF2,0x40,0x70,0x23,0xE2,

         0x40,0xE2,0x17,0xC2,0x41,0xE4,0x4F,0x82,0x41,0xF0,0x9F,0x02,0x41,0x59,0x16,0x02,

         0x42,0x4C,0x1D,0x02,0x42,0x46,0x20,0x82,0x42,0x47,0x00,0x42,0x44,0x43,0x80,0xC2,

         0x44,0x44,0xC1,0xC2,0x44,0xC8,0x63,0x82,0x45,0x50,0x37,0x02,0x46,0x60,0x1E,0x02,

         0x40,0x40,0x0C,0x02,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00

         },

        // 退出

         {0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x40,0xFF,0xE2,

         0x40,0x60,0x80,0x62,0x43,0xF0,0x80,0xA2,0x43,0xF0,0x81,0x22,0x40,0x60,0x82,0x22,

         0x40,0x40,0x84,0x22,0x40,0x00,0x88,0x22,0x40,0x00,0x88,0x22,0x47,0xFF,0xF8,0x22,

         0x47,0xFF,0xF8,0x22,0x46,0x2A,0x2A,0x22,0x46,0xE3,0x78,0x22,0x46,0x77,0x78,0x22,

         0x46,0xE3,0x78,0x62,0x46,0x2A,0x38,0x82,0x47,0xFF,0xF9,0x02,0x47,0xFF,0xFA,0x02,

         0x40,0x00,0x0C,0x02,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00

         }

        };                  

#pragma data:data 

uchar menu_cn[6][8]={"调    整","工    具","设    置","保    密","版    本","退    出"}; 



/*******************************************

函数名称: EN_Toggle

功    能: EN端产生一个高电平使能脉冲,写LCD

参    数: 无                    

返回值  : 无

/********************************************/

void EN_Toggle(void)  //EN端产生一个高电平使能脉冲,写LCD

 {           

        LCDb_SET_E;     //拉高使能位

        Delayus(50);    //保持高电平一定的写时间,如果晶振频率太高,则可相应提高延时

        LCDb_CLR_E; 

        Delayus(50);          

 }

 

/*******************************************

函数名称: LCD12864_readbyte

功    能: 从12864液晶读出一个字节数据或者指令

参    数: DatCmd--为iDat时是数据,为iCmd时是指令

返回值  : dByte--读回的数据或者指令

/********************************************/

uchar LCD12864_readbyte(uchar DatCmd)

{

         uchar dByte;

        if (DatCmd == iCmd)                 //指令操作

                LCDb_CLR_RS;

        else

                LCDb_SET_RS;                

        LCDb_SET_RW;                              //读操作

        LCDb_SET_E;

        LCDb_DATA_DDR=0x00;             //数据总线定义为输入        

        dByte=LCDb_DI;                         //读数据或者指令               

        LCDb_CLR_E;        

        LCDb_DATA_DDR|=0xff;         //数据总线还原为输出        

        return dByte;

}



/*******************************************

函数名称: LCD12864_writebyte

功    能: 向12864液晶写入一个字节数据或者指令

参    数: DatCmd--为iDat时是数据,为iCmd时是指令

                    dByte--为写入12864的数据或者指令

返回值  : 无

/********************************************/

void LCD12864_writebyte(uchar DatCmd, uchar dByte)

{

        if (DatCmd == iCmd)                //指令操作

                LCDb_CLR_RS;

        else

                LCDb_SET_RS;        

                

        LCDb_CLR_RW;                        //写操作        

        //LCDb_SET_E;

        LCDb_DO = dByte;                //写入数据                

        //LCDb_CLR_E;        

        EN_Toggle();                //EN端产生一个高电平使能脉冲,写LCD        

 }

/*******************************************

函数名称: LCD12864_sendstr

功    能: 向12864液晶写入一个字符串

参    数: ptString--字符串指针

返回值  : 无

/********************************************/

void LCD12864_sendstr(uchar *ptString)

{   

        while((*ptString)!='\0')                          //字符串未结束一直写

        {

         LCD12864_writebyte(iDat, *ptString++);

        }

 }

 

/*******************************************

函数名称: LCD12864_clear

功    能: 12864液晶清屏

参    数: 无

返回值  : 无

/********************************************/

void LCD12864_clear(void)

{

        LCD12864_writebyte(iCmd,LCDb_CLS);

        Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!

}



/*******************************************

函数名称: LCD12864_readBF

功    能: 12864液晶清屏

参    数: 无

返回值  : busy--为1时忙,为0时可以接收指令

/********************************************/

uchar LCD12864_readBF(void)

{          

        uchar busy;

        busy=LCD12864_readbyte(iCmd);                //读回BF标志和地址

        

        if(busy&0x80)                                                //读最高位PB7,为0表示空闲,如果忙返回正在忙的状态

                busy=1;

        else                                                                   //不忙,可以写入

                busy=0;

        return busy;

}



/*******************************************

函数名称: LCD12864_gotoXY

功    能: 移动到指定位置

参    数: Row--指定的行

                    Col--指定的列

返回值  : 无

/********************************************/

void LCD12864_gotoXY(uchar Row, uchar Col)

{        

        switch (Row)                  //选择行

        {

                case 2:

                        LCD12864_writebyte(iCmd, LCDb_L2 + Col); break;        //写入第2行的指定列

                case 3:

                        LCD12864_writebyte(iCmd, LCDb_L3 + Col); break;        //写入第3行的指定列

                case 4:

                        LCD12864_writebyte(iCmd, LCDb_L4 + Col); break;        //写入第4行的指定列        

                default:

                        LCD12864_writebyte(iCmd, LCDb_L1 + Col); break;        //写入第1行的指定列        

        }

}



/*******************************************

函数名称: LCD12864_opGDRAM

功    能: 向GDRAM写入数据,并显示(完成绘图功能)

参    数: ptGDRAM--GDRAM数据指针

返回值  : 无

/********************************************/

void LCD12864_opGDRAM(const uchar *ptGDRAM)

{

        uchar i,j;

        uint x=0;

        while(LCD12864_readBF());          //读忙标志

        LCD12864_writebyte(iCmd,LCDb_EXTCMD1);                //扩充指令集,并关闭绘图显示        

        //写入并显示上半屏幕

        for(i=0;i<32;i++)                                            //行地址计数

     {                                

           for(j=0;j<8;j++)                                      //列地址计数

           {                                                

                                    LCD12864_writebyte(iCmd,0x80|i);//输入行地址                                 

                                    LCD12864_writebyte(iCmd,0x80|j);//输入列地址                                 

                 LCD12864_writebyte(iDat,ptGDRAM[x++]); //输入高位字节数据                                                  

                                 LCD12864_writebyte(iDat,ptGDRAM[x++]); //输入低位字节数据

                                 

           }

     }

         //写入并显示下半屏幕

         for(i=0;i<32;i++)            

     {                                

           for(j=8;j<16;j++)      

           {            

                                    LCD12864_writebyte(iCmd,0x80|i);//输入行地址

                                 LCD12864_writebyte(iCmd,0x80|j);//输入列地址

                                 LCD12864_writebyte(iDat,ptGDRAM[x++]); //输入高位字节数据      

                                 LCD12864_writebyte(iDat,ptGDRAM[x++]); //输入低位字节数据

                                 

           }

     }

         Delayus(10);

         LCD12864_writebyte(iCmd,LCDb_EXTCMD2);                         //打开绘图显示

         LCD12864_writebyte(iCmd,LCDb_BASCMD);                         //还原回基本指令集模式

}



/*******************************************

函数名称: LCD12864_portini

功    能: 初始化12864液晶用到的IO口

参    数: 无

返回值  : 无

/********************************************/

void LCD12864_portini(void)

{

        LCDb_CTRL_DDR |= BIT(LCDb_RS)|BIT(LCDb_RW)|BIT(LCDb_E)|BIT(LCDb_RST);//配置控制管脚为输出

        LCDb_DATA_DDR |= 0xFF;  //配置数据管脚为输出

        LCDb_SET_RST;                    //不使能复位端

}



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

 函数名称:画面构造

 功能描述:界面1、2、3,图片菜单,反白,标头,16*16(32)图片

 全局变量:无

 参数说明:函数说明

 返回说明:无

 说    明:X坐标每一格每次16点

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

/*反白或显示图片 参数格式:(H)8bit数据,(L)8bit数据,X0坐标(16bit),Y0坐标(1bit),X坐标(16bit),Y坐标(1bit)*/

void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)

{

  uchar i,j;

  for(j=0;j<yl;j++)

  {

    for(i=0;i<xl;i++)

    {

      LCD12864_writebyte(iCmd,0x34);     // 扩展功能

      LCD12864_writebyte(iCmd,y0+j);         // 写Y坐标

      LCD12864_writebyte(iCmd,x0+i);         // 写X坐标

      LCD12864_writebyte(iCmd,0x30);         // 普通功能,基本指令集

      LCD12864_writebyte(iDat,data1);

      LCD12864_writebyte(iDat,data2);

    }

  }

  LCD12864_writebyte(iCmd,0x36);                 // 开绘图显示

}



/*显示字体 参数格式: 显示位置(0x80-0x9f),显示个数,显示内容指针*/

void display_cnasc(uchar dis_bit,uchar num,uchar *cnasc)

{

  LCD12864_writebyte(iCmd,0x30);             // 普通功能

  LCD12864_writebyte(iCmd,dis_bit);             // 写地址

  while(num>0)

  {

    LCD12864_writebyte(iDat,*(cnasc++));

    LCD12864_writebyte(iDat,*(cnasc++));

        num--; 

  }

  Delayus(10);

}



/*图片显示标头*/

void dis_title_pic(void)

{

  display_cnasc(0x80,2,"〓〓");

  display_cnasc(0x86,2,"〓〓");

}





/*显示菜单图片  格式:图片反显(1)或正常显示(0),显示图片的号码*/

void anti_nor_pic(uchar cpl_sign,uchar menu_num)

{

  uchar i,j,x,y;

  x=menu_num*3;                // 计算图片显示坐标

  if(x>6) x--;

  if(menu_num<3) y=16;        //下半屏显示

  else y=8;          // 上半屏显示

  if(cpl_sign==1) 

    display_cnasc(0x82,4,menu_cn[menu_num]);  //显示选择的菜单标题

  for(j=0;j<24;j++)

  {

   for(i=0;i<2;i++)

   {

     LCD12864_writebyte(iCmd,0x34);  // 扩充指令集,关闭绘图显示

     LCD12864_writebyte(iCmd,0x80+y);

     LCD12864_writebyte(iCmd,0x80+x+i);  // 分两次显示16bit

     LCD12864_writebyte(iCmd,0x30);      // 基本指令集

     if(cpl_sign==1)              // 图片反选

     {

           con_disp(~menu_pic[menu_num][j*4+i*2]);

          

       con_disp(~menu_pic[menu_num][j*4+i*2+1]);

           

         }

     else                                          // 正常显示

     {

           con_disp(menu_pic[menu_num][j*4+i*2]);

       con_disp(menu_pic[menu_num][j*4+i*2+1]);

         }

   }

   y++;

   if(y==32&&menu_num<3) {x+=8;y=0;}  // 上下屏切换

  }  

  LCD12864_writebyte(iCmd,0x36);      // 扩充指令集,打开绘图显示  

}





 /*******************************************

 函数名称: LCD12864_initial

 功    能: 12864液晶初始化

 参    数: 无

 返回值  : 无

/********************************************/

void LCD12864_initial(void)

{

        Delayms(100);                                // 等待内部复位

        LCD12864_portini();                        //端口初始化

        LCD12864_writebyte(iCmd, LCDb_FUNCTION_8BIT);        //功能、模式设定

        while(LCD12864_readBF());

        LCD12864_writebyte(iCmd, LCDb_ON);                //打开显示

        while(LCD12864_readBF());        

        LCD12864_clear();                                //清屏        

        while(LCD12864_readBF());

        LCD12864_writebyte(iCmd, LCDb_ENTRY);        // 输入模式设定        

        //clear_dis(); 

        LCD12864_opGDRAM(0x00);

        //LCD12864_writebyte(iCmd,LCDb_CURON);        // 显示光标

    //LCD12864_writebyte(iCmd,LCDb_CURFLA); // 打开光标闪烁

        //LCD12864_writebyte(iCmd,LCDb_C2R);    //光标右移        

 }

 

/****************************************************************************



/***************************************************************************

函数名称: DIS_12864M

功    能: DIS_12864M

参    数: keynum[]--键值数组

返回值  : 无

/********************************************/

void DIS_12864M(void)

 {

   uchar i,j;   

   for(i=0;i<6;i++)  

    {           

    dis_title_pic();     //显示图片菜单                                        

    anti_nor_pic(0,i);                

    anti_nor_pic(1,2);   //后面数字是要显示的图片位置

    }        

    Delayms(2000);                

 }          

/*******************************************

函数名称:main

功    能: Dis_inputkey

参    数: 无

返回值  : 无

/********************************************/

void main(void)

{

 uchar i=0; 

 Board_init();                    //初始化开发板

 LCD12864_initial();          //初始化12864液晶                             

                         //调用显示程序

 while (1) 

  {

  DIS_12864M();    

  }

 }        

  

**********************头文件*********************************

/*******************************************

  文件:AVR_EB1A.H

  功能:定义一些AVR_EB1A开发板上应用程序用到的常量

/******************************************/



#include <iom16v.h>                        //包含型号头文件

#include <macros.h>                        //包含"位"操作头文件



/******************数据类型宏定义******************/

#define uchar unsigned char

#define uint unsigned int



/*******************************************

函数名称: Delayus

功    能: 延时指定微秒(8M晶振)

参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)

返回值  : 无

/********************************************/

void Delayus(uint US)                  

{

 uint i;

 US=US*5/4;                           //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值

 for( i=0;i<US;i++); 

}

/*******************************************

函数名称: Delayms

功    能: 延时指定毫秒(8M晶振)

参    数: MS--延时的毫秒数

返回值  : 无

/********************************************/

void Delayms(uint MS)                  

{

 uint i,j;

 for( i=0;i<MS;i++)

 for(j=0;j<1141;j++);        //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值

}

/*******************************************

函数名称: Board_init

功    能: 初始化实验板,关闭全部功能

参    数: 无

返回值  : 无

/********************************************/

void Board_init(void)

{

        DDRA=0xFF;        //将四个IO口全部配置为输出

        DDRB=0xFF;

        DDRC=0xFF;

        DDRD=0xFF;        

}



/******************12864液晶(4-8线并行传输)常量及操作******************/

#define LCDb_CTRL            PORTD        //12864控制端口定义

#define LCDb_CTRL_DDR            DDRD        //控制端口方向寄存器定义

#define LCDb_RS                           PD4                //定义四个控制引脚

#define LCDb_RW                    PD5

#define LCDb_E                           PD6

#define LCDb_RST            PD7





#define LCDb_L1                0x80        //第一行的地址

#define LCDb_L2                0x90        //第二行的地址

#define LCDb_L3                0x88        //第三行的地址

#define LCDb_L4                0x98        //第四行的地址



#define LCDb_CGRAM_ADDR        0x40        //CGRAM的开始地址

#define LCDb_CGMAX         64        //CGRAM存储的最大字节数



#define LCDb_SET_RS                LCDb_CTRL|=BIT(LCDb_RS)        //四个控制管脚的控制操作

#define LCDb_SET_RW         LCDb_CTRL|=BIT(LCDb_RW)

#define LCDb_SET_E          LCDb_CTRL|=BIT(LCDb_E)

#define LCDb_SET_RST          LCDb_CTRL|=BIT(LCDb_RST)



#define LCDb_CLR_RS                 LCDb_CTRL&=~BIT(LCDb_RS)

#define LCDb_CLR_RW                 LCDb_CTRL&=~BIT(LCDb_RW)

#define LCDb_CLR_E                  LCDb_CTRL&=~BIT(LCDb_E)

#define LCDb_CLR_RST                 LCDb_CTRL&=~BIT(LCDb_RST)



#define LCDb_DO                PORTB        //输出数据总线端口定义

#define LCDb_DI                PINB        //输入数据总线端口定义

#define LCDb_DATA_DDR        DDRB        //数据总线方向寄存器定义

#define LCDb_DATA       0Xf0        //((1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7))

                                    //portB4/5/6/7out,输出数据总线端口定义



#define LCDb_FUNCTION_8BIT        0x38           //液晶模式为8位 

#define LCDb_FUNCTION_4BIT      0x20    //液晶模式为4位



#define LCDb_BASCMD        0x30                // 基本指令集

#define LCDb_CLS        0x01                // 清屏

#define LCDb_HOME        0x02                // 地址返回原点,不改变DDRAM内容

#define LCDb_ENTRY         0x06                // 设定输入模式,光标加,屏幕不移动



#define LCDb_CURON      0x0E                // 显示光标

#define LCDb_CURFLA        0x0F                // 打开光标闪烁

#define LCDb_C2L        0x10                // 光标左移

#define LCDb_C2R        0x14                // 光标右移

#define LCDb_D2L        0x18                // 屏幕左移

#define LCDb_D2R        0x1C                // 屏幕又移

#define LCDb_ON                0x0C                // 打开显示

#define LCDb_OFF        0x08                // 关闭显示



#define LCDb_EXTCMD1        0x34                // 扩充指令集,关闭绘图显示

#define LCDb_EXTCMD2        0x36                // 扩充指令集,打开绘图显示

#define LCDb_EXTCLS        0x01                // 清屏

#define LCDb_REVL1        0x04                // 反显第1行

#define LCDb_REVL2        0x05                // 反显第2行

#define LCDb_REVL3        0x06                // 反显第3行

#define LCDb_REVL4        0x07                // 反显第4行







本贴被 21mcuel 编辑过,最后修改时间:2009-01-14,13:13:04.

作者: sudan1981    时间: 2009-1-14 09:51
显示图片前,要先清下GDRAM,全写0X00。
作者: wormchen    时间: 2009-1-14 10:36
同意3楼
作者: 21mcuel    时间: 2009-1-14 13:10
    我已经说了呀!在写图片之前,写图函数LCD12864_opGDRAM(0x00);已经写0x00了,已经清了GDRAM,还是有杂点,

 换了一个旧的ST7920的 12864液晶(TG12864E-03)还是一样的。

    大家有机会可以试试我上面的这些小图片32*24的显示,是否有噪点?
作者: wormchen    时间: 2009-1-15 09:46
LCD12864_opGDRAM(0x00);一句不行,要在绘图模式下把所有显存空间写0。

算来直接给你代码好了:

/************************************************************************

名称: void ST7920_ClearGDRAM(void)                                                                                

功能: 清除GDRAM数据        

参数:                         

返回: 无                

************************************************************************/

void ST7920_ClearGDRAM(void)

{

        unsigned char i;                

        unsigned char j;

        unsigned char k;

        unsigned char bDx = 0x80;        //GDRAM水平地址

        unsigned char bDy = 0x80;        //GDRAM垂直地址

        for(i = 0; i < 2; i++)        // 在绘图GDRAM中写满屏0x00数据                                                        

        {

                for(j = 0; j < 32; j++)                                                                

                {

                        for(k = 0; k < 8; k++)                                                        

                        {

                                ST7920_WriteCMD(0x34);                                                                                        ST7920_WriteCMD(bDy + j);//先写入垂直地址                                                                                ST7920_WriteCMD(bDx + k);//再写入水平地址

                                ST7920_WriteCMD(0x30);                

                                ST7920_WriteData(0x00);                

                                ST7920_WriteData(0x00);

                        }

                }

                bDx = 0x88;                                                                                                                                        

        }

        ST7920_WriteCMD(0x36);                                                                                

        ST7920_WriteCMD(0x30);        

}

函数上电后调用一次即可。

本贴被 wormchen 编辑过,最后修改时间:2009-01-15,09:49:44.

作者: 21mcuel    时间: 2009-1-15 11:41
  谢谢,昨天已经解决了,是写屏函数问题。需要多写0x00几次。
作者: END12345678    时间: 2009-5-2 19:45
刚买了一个12864
作者: armot    时间: 2009-9-14 09:03
在anti_nor_pic()函数里有个con_disp()参数调用好像不对啊
作者: armot    时间: 2009-9-14 20:42
在anti_nor_pic()函数里有个con_disp()参数调用好像不对啊 麻烦楼主解释一下 我不太明白
作者: elain    时间: 2009-9-15 11:17
mark
作者: wisebaby    时间: 2009-9-15 12:11
写的不错.
作者: 382383706    时间: 2009-11-2 23:29
mark
作者: wayhe    时间: 2010-1-27 13:10
这个绘图区清0程序应该可以给你省点代码。
void LcmClearBMP( void )
{
     Uchar i,j;
     wr_lcd(comm,0x34);      //8Bit扩充指令集,即使是36H也要写两次
     wr_lcd(comm,0x36);      //绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)            //12864实际为256x32
     {
           wr_lcd(comm,0x80|i);      //行位置
           wr_lcd(comm,0x80);        //列位置
           for(j=0;j<32;j++)            //256/8=32 byte
                wr_lcd(dat,0);
     }
}
作者: qilin3    时间: 2010-1-27 13:25
拿下,需要用
作者: lordyeye    时间: 2010-1-27 13:36
mark
作者: 411412    时间: 2010-1-27 16:45
mark
作者: www8818    时间: 2010-1-27 17:44
不管程序就版式来说LZ有一手好"书法" 程序看着让人舒服.有入有出,可读性非常好,赞一个! 界面也很漂亮再赞一个! 问题解决了就只好混分儿了~~~
作者: hqjin87    时间: 2010-4-11 04:55

作者: dubu    时间: 2010-4-11 06:46
mark
作者: thinki    时间: 2010-4-11 10:00
mark
作者: dianqing    时间: 2010-8-21 10:03
顶下!顺便收藏
作者: htgyhgj    时间: 2010-8-22 08:48
lz的图片在哪截的啊
作者: wzxavr    时间: 2010-8-26 11:49
mark
作者: jack_yu    时间: 2010-8-26 13:23
mark!
作者: poet_lee    时间: 2010-8-26 14:48
mark~学习一下
作者: zengchao    时间: 2010-8-30 21:26
必须好的啊
作者: cuikai12345    时间: 2010-8-30 21:46
mark
作者: lininglive    时间: 2010-8-30 21:50
你是不是屏的片选一直拉低了?我记得有个帖子问的是这个ST7920 如果一直片选有效,会出现乱码
作者: kouxiangtang    时间: 2010-8-30 23:01
做的不错!
作者: tcp1985    时间: 2010-10-12 17:10
学习一下
作者: liaogang1314    时间: 2010-10-26 16:06
楼主以及各位高手:
    我一直在琢磨菜单结构,看大家用的大都是结构体,里面把数据和处理数据的函数放在一个结构体里面,我百看也不能理解是怎么实现的? 这个好像是面向对象的程序设计了吧!? 可是我没有学过C++, 对面向对象的程序设计方法不理解? 楼主以及各位高手能不能详细的指导指导我一下啊!?不胜感激!!!!!!!!!!!
作者: fanbinhua    时间: 2010-11-7 20:15
学习
作者: alexshao1978    时间: 2010-11-8 10:26
个人习惯一行行的刷新。即使空白都要写个00进去。
类似的麻皮屏也遇到过,一般都是DDRAM没初始化写00造成的。
作者: laohuang868    时间: 2010-11-22 23:08
ST7920 12864液晶做的图文菜单系统可以显示图案,我也试过了,最后我在百度找到了答案,自己亲自试验了,我看了你的图,12864是能显示中文的,就是因为这个所以才导致了花屏。
解决办法很简单,在初始化的时候出来给液晶写入0x01的命令,还有想液晶整屏写入0x00!
作者: Gloriousle    时间: 2010-12-7 15:44
MARK
作者: kongan    时间: 2011-1-2 19:41
学习
作者: defineme    时间: 2011-3-7 12:33
谢谢,昨天已经解决了,是写屏函数问题。需要多写0x00几次。
-----------------------------------------------------------------------

好像不对吧!每次读写都要忙判别的吧!把忙判别加到读写字节函数里。我是这样认为的。
作者: hpdell    时间: 2011-3-7 17:40
如果盘忙的话,就可以不用延时的,这样可以节省单片机的资源,是单片机的运行速度提高
作者: shuli163love    时间: 2011-4-2 08:57
MARK
作者: qhp777    时间: 2011-4-5 18:01
几个号,以后用的上
作者: enjoyliwenhua    时间: 2011-5-7 11:02
mark,
作者: edaworld    时间: 2011-5-7 11:26
马克
作者: cumtgao    时间: 2011-5-12 13:43
标记
作者: CaineStrong    时间: 2011-5-26 16:48
留爪
作者: lcmdw    时间: 2011-6-4 15:11
mark
作者: zyw4210    时间: 2011-6-17 08:46
回复【2楼】21mcuel
-----------------------------------------------------------------------

好东西,用了两年的液晶可是液晶显示方面还没有弄通,我用1302和12864(带字库)做的电子钟,在调时间的时候不会出现光标,那位有这样的程序发一段看看
作者: wanghg2003    时间: 2011-6-21 20:59
马克一个。
作者: lihp1603    时间: 2011-8-13 14:50
蛋筒,俺移植的一个1602的菜单程序,想的我蛋筒啊,同志们!看到楼主这个,俺才知道,俺有多菜!唉。。。
作者: bdysj    时间: 2011-8-14 15:32
这个程序里con_disp()有点问题,能否解释一下。。或者加正确这个程序里的这个函数
作者: sdqwepoi    时间: 2011-8-15 11:04
mark
作者: namuduocuo    时间: 2011-8-15 11:32
菜鸟一个,来学习的
作者: moyuker    时间: 2011-8-18 16:55
MARK
作者: qq20707    时间: 2011-8-21 10:16
mark
作者: lucya    时间: 2011-9-14 15:44
大家初始化写0x00,这个过程慢不慢啊?我的清屏怎么要5秒左右呢,急死俺了!
是我程序的问题吗?
作者: chenguanghua    时间: 2011-11-3 16:50
好像有看过你的博客 小峰
作者: jxauzhongkewen    时间: 2011-11-4 23:24

作者: dianqi2007013    时间: 2013-10-16 13:24
我也在学习这个菜单程序,




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4