51单片机RA8835驱动320X240问题,请老师们指点一下
时间:10-02
整理:3721RD
点击:
刚上电显示正常,20秒后出现乱码,程序驱动240x160显示正常,设置改动如下,请老师们不吝赐教,感激不尽啊!/*******************************************************
延时程序
*******************************************************/
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
/*******************************************************
定义指令代码、参数
*******************************************************/
#define systemset 0x40 //初始化设置,后续8字节参数串systemset_P8[]
uchar code systemset_P8[] = {0x30, 0x87, 0x87, 0x27, 0x3f, 0xef, 0x28, 0x00};
//P1 P2 P3 P4 P5 P6 P7 P8
#define scroll 0x44 //设定显示起始地址和显示范围,后续10字节参数串scroll_P10[]
#define basepart1 0x00
#define basepart2 0x28
#define basepart3 0x50
#define basepart4 0x00
uchar code
scroll_P10[] = { 0x00, basepart1, 0xf0, //第一显示区RAM,10KB,160行
0x00, basepart2, 0xf0, //第二显示区RAM,10KB,160行
0x00, basepart3, //第三显示区RAM,10KB
0x00, basepart4}; //第四显示区RAM,32KB
#define sleepin 0x53 //休闲模式设置 后续参数:无
#define csrdirr 0x4c //光标向右方向移动 后续参数:无
#define csrdirl 0x4d //光标向左方向移动 后续参数:无
#define csrdiru 0x4e //光标向上方向移动 后续参数:无
#define csrdird 0x4f //光标向下方向移动 后续参数:无
#define dispoff 0x58 //显示关闭 后续参数1字节
#define dispon 0x59 //显示状态打开 后续参数1字节
#define hdotscr 0x5a //点位移量设置 后续参数1字节
#define ovlay 0x1b //显示合成设置 后续参数1字节
#define cgramadr 0x5c //CGRAM首地址设置 后续参数2字节
#define csrform 0x5d //光标形状设置 后续参数2字节
#define csrw 0x46 //设置光标地址 后续参数2字节
#define csrr 0x47 //读出光标地址 后续参数2字节
#define mwrite 0x42 //显示数据写入 后续参数N字节
#define mread 0x43 //显示数据读取 后续参数N字节
#define busy 0x40 //忙信号D6 0100 0000
#define AP (systemset_P8[6])//一行所占显示存储单元的字节数
#define width 32 //图像宽度大小
#define height 96 //图像高度大小
/*******************************************************
写指令代码
*******************************************************/
void write_cmd(unsigned char cmd)
{
cs = 0;
rd = 1;
P1 = cmd;
a0 = 1; //指令
wr = 0; //上升沿写入
wr = 1;
cs = 1;
}
/*******************************************************
写指令参数、显示数据
*******************************************************/
void write_dat(unsigned char dat)
{
cs = 0;
rd = 1;
P1 = dat;
a0 = 0; //数据
wr = 0; //上升沿写入
wr = 1;
cs = 1;
}
/*******************************************************
读出数据
*******************************************************/
/*uchar read_dat(void)
{
uchar temp=0;
cs = 0;
a0 = 1;
wr = 1;
rd = 0;
temp = P1;
rd = 1;
cs = 1;
return (temp);
}
/*******************************************************
液晶清屏, 10KB RAM 清零
part = 0 清所有显示区 32KB RAM
part = 1 清显示区1
part = 2 清显示区2
part = 3 清显示区3
part = 4 清显示区4
*******************************************************/
void lcd_cls(uchar part)
{
uint i = 10240; //10240 = 0x2800 10KB RAM
write_cmd(csrw); //写入光标地址
write_dat(0x00); //先写低八位
if(part == 1) write_dat(0x00); //显示区1
else if(part == 2) write_dat(basepart2);//显示区2
else if(part == 3) write_dat(basepart3);//显示区3
else if(part == 4) write_dat(basepart4);//显示区4
else {i = 32768; write_dat(0x00);} //所有显示区 32KB RAM
write_cmd(csrdirr); //光标向右方向移动
write_cmd(mwrite); //显示数据写入
while(i--) write_dat(0x00);//写入0
}
/*******************************************************
开启显示
*******************************************************/
void show_on(void)
{
write_cmd(dispon); //显示状态开启
write_dat(0x57); //显示图像,光标1Hz闪烁
}
/*******************************************************
关闭显示
*******************************************************/
void show_off(void)
{
write_cmd(dispoff); //显示状态关闭
write_dat(0x57); //显示图像,光标1Hz闪烁
}
/*******************************************************
光标定位
x横坐标: 0~39 240/8=40
y纵坐标: 0~29 240/8=30 文本调用
*******************************************************/
/*void locate_xy1(uchar x, uchar y)
{
uint addr;
addr =(uint)(y) * AP + x;
write_cmd(csrw); //写入光标地址
write_dat((uchar)(addr & 0xff)); //先写低八位
write_dat((uchar)(addr >> 8)); //后写高八位
}
/*******************************************************
光标定位
x横坐标: 0~319 320
y纵坐标: 0~239 240
图层2 点线圆调用
*******************************************************/
/*void locate_xy2(uint x, uchar y)
{
uint addr;
addr = (uint)(y) * AP + x /8;
write_cmd(csrw); //写入光标地址
write_dat((uchar)(addr & 0xff)); //先写低八位
write_dat((uchar)(addr >> 8) + basepart2); //后写高八位
}
/*******************************************************
光标定位2
x横坐标: 0~319 320
y纵坐标: 0~239 240
图层2 汉字图形调用
*******************************************************/
void locate_xy22(uint x, uchar y)
{
uint addr;
addr = (uint)(y) * AP + x;//AP=240/8=30=0X1E
write_cmd(csrw); //0x46 //设置光标地址 写入光标地址
write_dat((uchar)(addr & 0xff)); //先写低八位
write_dat((uchar)(addr >> 8) + basepart2); //后写高八位
}
/**********************************************************************
液晶初始化
***********************************************************************/
void lcd_init(void)
{
uchar i;
// reset=0;
// delay(10);
// reset=1;
write_cmd(systemset);//初始化设置0x40
for(i=0;i<8 ;i++)
write_dat(systemset_P8[i]);
write_cmd(scroll); //设定显示起始地址和显示范围0x44
for(i=0;i<10;i++)
write_dat(scroll_P10[i]);
write_cmd(hdotscr); //点位移量设置
write_dat(0x00); //不移动
write_cmd(ovlay); //显示合成设置
write_dat(0x00); //二重合成,文本显示,逻辑或
show_off(); //关闭显示
lcd_cls(0); //液晶清屏,32KB RAM 清零
show_on(); //开启显示
}
延时程序
*******************************************************/
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
/*******************************************************
定义指令代码、参数
*******************************************************/
#define systemset 0x40 //初始化设置,后续8字节参数串systemset_P8[]
uchar code systemset_P8[] = {0x30, 0x87, 0x87, 0x27, 0x3f, 0xef, 0x28, 0x00};
//P1 P2 P3 P4 P5 P6 P7 P8
#define scroll 0x44 //设定显示起始地址和显示范围,后续10字节参数串scroll_P10[]
#define basepart1 0x00
#define basepart2 0x28
#define basepart3 0x50
#define basepart4 0x00
uchar code
scroll_P10[] = { 0x00, basepart1, 0xf0, //第一显示区RAM,10KB,160行
0x00, basepart2, 0xf0, //第二显示区RAM,10KB,160行
0x00, basepart3, //第三显示区RAM,10KB
0x00, basepart4}; //第四显示区RAM,32KB
#define sleepin 0x53 //休闲模式设置 后续参数:无
#define csrdirr 0x4c //光标向右方向移动 后续参数:无
#define csrdirl 0x4d //光标向左方向移动 后续参数:无
#define csrdiru 0x4e //光标向上方向移动 后续参数:无
#define csrdird 0x4f //光标向下方向移动 后续参数:无
#define dispoff 0x58 //显示关闭 后续参数1字节
#define dispon 0x59 //显示状态打开 后续参数1字节
#define hdotscr 0x5a //点位移量设置 后续参数1字节
#define ovlay 0x1b //显示合成设置 后续参数1字节
#define cgramadr 0x5c //CGRAM首地址设置 后续参数2字节
#define csrform 0x5d //光标形状设置 后续参数2字节
#define csrw 0x46 //设置光标地址 后续参数2字节
#define csrr 0x47 //读出光标地址 后续参数2字节
#define mwrite 0x42 //显示数据写入 后续参数N字节
#define mread 0x43 //显示数据读取 后续参数N字节
#define busy 0x40 //忙信号D6 0100 0000
#define AP (systemset_P8[6])//一行所占显示存储单元的字节数
#define width 32 //图像宽度大小
#define height 96 //图像高度大小
/*******************************************************
写指令代码
*******************************************************/
void write_cmd(unsigned char cmd)
{
cs = 0;
rd = 1;
P1 = cmd;
a0 = 1; //指令
wr = 0; //上升沿写入
wr = 1;
cs = 1;
}
/*******************************************************
写指令参数、显示数据
*******************************************************/
void write_dat(unsigned char dat)
{
cs = 0;
rd = 1;
P1 = dat;
a0 = 0; //数据
wr = 0; //上升沿写入
wr = 1;
cs = 1;
}
/*******************************************************
读出数据
*******************************************************/
/*uchar read_dat(void)
{
uchar temp=0;
cs = 0;
a0 = 1;
wr = 1;
rd = 0;
temp = P1;
rd = 1;
cs = 1;
return (temp);
}
/*******************************************************
液晶清屏, 10KB RAM 清零
part = 0 清所有显示区 32KB RAM
part = 1 清显示区1
part = 2 清显示区2
part = 3 清显示区3
part = 4 清显示区4
*******************************************************/
void lcd_cls(uchar part)
{
uint i = 10240; //10240 = 0x2800 10KB RAM
write_cmd(csrw); //写入光标地址
write_dat(0x00); //先写低八位
if(part == 1) write_dat(0x00); //显示区1
else if(part == 2) write_dat(basepart2);//显示区2
else if(part == 3) write_dat(basepart3);//显示区3
else if(part == 4) write_dat(basepart4);//显示区4
else {i = 32768; write_dat(0x00);} //所有显示区 32KB RAM
write_cmd(csrdirr); //光标向右方向移动
write_cmd(mwrite); //显示数据写入
while(i--) write_dat(0x00);//写入0
}
/*******************************************************
开启显示
*******************************************************/
void show_on(void)
{
write_cmd(dispon); //显示状态开启
write_dat(0x57); //显示图像,光标1Hz闪烁
}
/*******************************************************
关闭显示
*******************************************************/
void show_off(void)
{
write_cmd(dispoff); //显示状态关闭
write_dat(0x57); //显示图像,光标1Hz闪烁
}
/*******************************************************
光标定位
x横坐标: 0~39 240/8=40
y纵坐标: 0~29 240/8=30 文本调用
*******************************************************/
/*void locate_xy1(uchar x, uchar y)
{
uint addr;
addr =(uint)(y) * AP + x;
write_cmd(csrw); //写入光标地址
write_dat((uchar)(addr & 0xff)); //先写低八位
write_dat((uchar)(addr >> 8)); //后写高八位
}
/*******************************************************
光标定位
x横坐标: 0~319 320
y纵坐标: 0~239 240
图层2 点线圆调用
*******************************************************/
/*void locate_xy2(uint x, uchar y)
{
uint addr;
addr = (uint)(y) * AP + x /8;
write_cmd(csrw); //写入光标地址
write_dat((uchar)(addr & 0xff)); //先写低八位
write_dat((uchar)(addr >> 8) + basepart2); //后写高八位
}
/*******************************************************
光标定位2
x横坐标: 0~319 320
y纵坐标: 0~239 240
图层2 汉字图形调用
*******************************************************/
void locate_xy22(uint x, uchar y)
{
uint addr;
addr = (uint)(y) * AP + x;//AP=240/8=30=0X1E
write_cmd(csrw); //0x46 //设置光标地址 写入光标地址
write_dat((uchar)(addr & 0xff)); //先写低八位
write_dat((uchar)(addr >> 8) + basepart2); //后写高八位
}
/**********************************************************************
液晶初始化
***********************************************************************/
void lcd_init(void)
{
uchar i;
// reset=0;
// delay(10);
// reset=1;
write_cmd(systemset);//初始化设置0x40
for(i=0;i<8 ;i++)
write_dat(systemset_P8[i]);
write_cmd(scroll); //设定显示起始地址和显示范围0x44
for(i=0;i<10;i++)
write_dat(scroll_P10[i]);
write_cmd(hdotscr); //点位移量设置
write_dat(0x00); //不移动
write_cmd(ovlay); //显示合成设置
write_dat(0x00); //二重合成,文本显示,逻辑或
show_off(); //关闭显示
lcd_cls(0); //液晶清屏,32KB RAM 清零
show_on(); //开启显示
}
刚上电
20秒后
帮顶