求助!!!!!12864液晶显示有问题,大侠们来帮我看一下~~~
[复制链接]
我用的是OCM12864-3,程序是显示“欢迎使用”四个字在液晶正中。
程序烧入单片机以后都没问题,当我把电源拔下再插,多试几次,也没有问题。但是!过了3~5分钟,我再上电,“欢迎”这两个字就往上移动了一行,真不知道为什么,郁闷啊! 附程序
#define disp_off 0x3E
#define disp_on 0x3F
#define e PTP_PTP2 //读写使能
#define e_d DDRP_DDRP2
#define rw PTP_PTP4 //Write or Read,H:read,L:write
#define rw_d DDRP_DDRP4
#define rs PTP_PTP7 //Data or Instrument Select,H:写数据,L:写指令
#define rs_d DDRP_DDRP7
#define cs2 PTJ_PTJ6 //cs1=H,选择左半屏
#define cs2_d DDRJ_DDRJ6
#define cs1 PTM_PTM4 //cs2=H,选择右半屏
#define cs1_d DDRM_DDRM4
/***********************汉字显示字库**********************************/
unsigned char huan[32]={0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00 } ;//"欢"字字库
unsigned char yin[32] ={0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00};//"迎"字字库
unsigned char shi[32]={0x40,0x20,0xF8,0x07,0x04,0xF4,0x14,0x14,
0x14,0xFF,0x14,0x14,0x14,0xF6,0x04,0x00,
0x00,0x00,0xFF,0x00,0x80,0x43,0x45,0x29,
0x19,0x17,0x21,0x21,0x41,0xC3,0x40,0x00} ;//"使"字字库
unsigned char yong[32]={0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,
0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,
0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,
0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00};//"用"字字库
/**********************************************************************/
/***************函数声明*************************************************/
void Disp (unsigned char state); //控制屏幕的开关
void lcd_write (unsigned char data); //底层写操作
void delay(unsigned int loop_times); //延时程序
void lcd_wbyte(unsigned char DATA) ; //写一个字节程序
void page(unsigned char p_data); //选择页
void list (unsigned char l_data); //选择列
void row(unsigned char r_data); //选择显示首行
void lcd_clear(void); //清全屏
void lcd_Word(unsigned char p_Data,unsigned char l_Data,unsigned char lcd_Word[]);//任意页,任意列,写一个16*16的字。
/************************************************************************/
void main(void)
{
DDRT = 0xFF;
e_d = 1;
rw_d = 1;
rs_d = 1;
cs1_d = 1;
cs2_d = 1;
delay(3000);
Disp(0x3e);
delay(3000);
lcd_clear();
Disp(disp_on);
delay(3000);
lcd_Word(0x03,8,&huan[0]);
lcd_Word(0x03,40,&yin[0]);
lcd_Word(0x03,72,&shi[0]);
lcd_Word(0x03,104,&yong[0]);
for(;;)
{
;
}
}
void lcd_Word(unsigned char p_Data,unsigned char l_Data,unsigned char lcd_Word[])
{
unsigned char i;
if(l_Data>63)
{
l_Data-=63;
cs1 = 0;
cs2 = 1;
Disp(disp_on);
} else
{
cs1 = 1;
cs2 = 0;
Disp(disp_on);
}
page(p_Data);
list(l_Data);
for(i=0;i<16;i++)
{
lcd_wbyte(lcd_Word);
}
p_Data+=1;
page(p_Data);
list(l_Data);
for(i=0;i<16;i++)
{
lcd_wbyte(lcd_Word[i+16]);
}
}
void lcd_clear(void)
{
unsigned char clr;
unsigned char x,y;
cs1=0;
cs2=1;
list(0x00);
row(0x00);
clr = 0;
x = 0;
y = 0;
for(x=0;x<8;x++)
{
page(x);
for(y=0;y<64;y++)
{
lcd_wbyte(clr);
}
}
cs1=1;
cs2=0;
for(x=0;x<8;x++)
{
page(x);
for(y=0;y<64;y++)
{
lcd_wbyte(clr);
}
}
}
void Disp (unsigned char state) //控制屏幕的开关
{
rs = 0;
rw = 0;
lcd_write(state);
}
void lcd_wbyte(unsigned char DATA) //写一个字节程序
{
rs = 1;
rw = 0;
lcd_write(DATA);
}
void page(unsigned char p_data) //选择页
{
rs = 0;
rw = 0;
p_data+=0xB8;
lcd_write(p_data);
}
void list (unsigned char l_data) //选择列
{
rs = 0;
rw = 0;
l_data+=0x40;
lcd_write(l_data);
}
void row(unsigned char r_data) //选择显示首行
{
rs = 0;
rw = 0;
r_data+=0xc0;
lcd_write(r_data);
}
void lcd_write (unsigned char data) //底层写操作
{
PTT = data;
e =0;
delay(4);
e = 1;
delay(4);
e = 0;
}
[ 本帖最后由 mowei23 于 2012-8-5 13:32 编辑 ]
|