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