51单片机RA8835驱动320X240问题,请老师们指点一下

2019-07-15 20:57发布

刚上电显示正常,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();           //开启显示
}

刚上电 刚上电
20秒后 20秒后
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。