12864汉字液晶显示驱动程序(C)

12864的驱动程序(C51)2007-01-24 22:43//12864汉字液晶显示驱动程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit p_csa=P1^4;
sbit p_csb=P1^5;
sbit p_di=P1^0;
sbit p_rw=P1^1;
sbit p_e=P1^2;
sbit busy=P0^7;
char data mov=0;//滚动显示的变量
char data TIMER=0;//软件延时的全局变量
uchar code image[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x10,0x08,0x04},
{0x04,0x02,0xF2,0x1E,0x02,0x1B,0xE7,0x03,0x07,0x1B,0xE2,0x02,0x02,0x02,0x04,0x04},
{0x08,0x10,0x10,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//64*8左屏幕的一页
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//128*8一页(包括左右屏)
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3C,0x03,0x00,0x00,0x00,0x84,0x46,0xC6},
{0x4E,0x8C,0x1D,0x30,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x1C,0x8C,0x4E,0xC6,0x46},
{0x84,0x00,0x00,0x00,0x00,0x03,0x3C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x80,0x7C,0x1E,0x8E,0x0F,0x0F,0x0F,0x8E,0x1E,0x7C,0x80,0x00,0x00,0x00},//左第二页
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0x28,0x44,0x44,0x44,0x44,0x44,0x4C},
{0x7C,0xCC,0x44,0x44,0x04,0x40,0x44,0x48,0x90,0x60,0x60,0x40,0x40,0x40,0x40,0x00},
{0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x3C,0xC0,0x00,0x00,0x00,0x00,0x01,0x01},
{0x01,0x80,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x81,0x01,0x01},
{0x00,0x00,0x00,0x00,0x00,0xC0,0x3C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x07,0x78,0x80,0x01,0x20,0x28,0x20,0x01,0x80,0x78,0x07,0x00,0x00,0x00},//左第三页
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x04,0x3C,0x44,0x54,0x44,0x3C,0x04},
{0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3C,0x44,0x54,0x44,0x3C,0x04,0x04},
{0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x08,0x08,0x10,0x20},
{0x20,0x40,0x41,0x42,0x42,0x84,0x84,0x84,0x84,0x84,0x42,0x42,0x41,0x40,0x20,0x20},
{0x10,0x08,0x08,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00},//左第四页
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/*"E:\工作文件\51工作\128-64LCD显示\LCD图形2.bmp",0*/

};


// 江(0) 苏(1) 省(2) 激(3) 光(4) 研(5) 究(6) 所(7)
uchar code hz[][16]={
{0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00},
{0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00},/*"江",0*/

{0x04,0x04,0x44,0x44,0x44,0x5F,0x44,0xF4,0x44,0x5F,0x44,0xC4,0x04,0x04,0x04,0x00},
{0x00,0x40,0x4C,0x27,0x10,0x0C,0x07,0x01,0x20,0x40,0x40,0x3F,0x00,0x02,0x0C,0x00},/*"苏",1*/

{0x00,0x10,0x90,0x88,0x86,0xC0,0xC0,0xBF,0xA0,0x90,0x90,0x8A,0x84,0x18,0x00,0x00},
{0x01,0x01,0x00,0x00,0xFF,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0xFF,0x00,0x00,0x00},/*"省",2*/

{0x10,0x21,0x86,0x60,0x7C,0x56,0xD5,0x54,0x7C,0x20,0xF8,0x17,0x90,0x70,0x10,0x00},
{0x04,0x7C,0x43,0x21,0x19,0x07,0x45,0x85,0x7D,0x20,0x13,0x0C,0x33,0x60,0x20,0x00},/*"激",3*/

{0x00,0x40,0x42,0x44,0x5C,0xC8,0x40,0x7F,0x40,0xC0,0x50,0x4E,0x44,0x60,0x40,0x00},
{0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00},/*"光",4*/

{0x02,0xC2,0xF2,0x4E,0xC2,0x02,0x40,0x42,0xFE,0x42,0x42,0x42,0xFE,0x42,0x42,0x00},
{0x01,0x00,0x3F,0x10,0x9F,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},/*"研",5*/

{0x00,0x4C,0x24,0x94,0x84,0x84,0xF5,0x86,0x84,0x84,0x14,0x24,0x44,0x0C,0x04,0x00},
{0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00},/*"究",6*/

{0x00,0xFE,0x12,0x12,0x11,0xF1,0x01,0x00,0xFE,0x22,0x22,0x21,0xE1,0x21,0x21,0x00},
{0x40,0x3F,0x01,0x01,0x81,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0xFF,0x00,0x00,0x00}/*"所",7*/
};

//网址:w(0) w(1) w(2) .(3) j(4) s(5) l(6) a(7) s(8) e(9) r(10) .(11) c(12) n(13)
uchar code zf[][16]={
{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},/*"w",0*/

{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},/*"w",1*/

{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},/*"w",2*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",3*/

{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},/*"j",4*/

{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",5*/

{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"l",6*/

{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20},/*"a",7*/

{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",8*/

{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},/*"e",9*/

{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},/*"r",10*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,

0x00,0x00,0x00,0x00,0x00},/*".",11*/

{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},/*"c",12*/

{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"n",13*/

};


/*忙判别*/
void lcd_busy(void)
{
p_di=0;
p_rw=1;
P0=0xff;//读数据
while (1)
{ p_e=1;
if (!busy) break;//忙标志为0了,则跳出循环
p_e=0;
} //比汇编灵活,汇编类似于用if判断,自己做循环
p_e=0;
}
/*设置xy*/
void set_xy(uchar x,uchar y)
{
if (x>=64)
{p_csa=0;p_csb=1;x=x-64;}//调整x值
else
{p_csb=0;p_csa=1;}//如果超过一页了则换屏显示,一页一共64行
lcd_busy();//不忙了,再送数据
p_di=p_rw=0;P0=0x40|x;p_e=1;p_e=0;//送的地址是用最左边的地址和x按位或而取得
lcd_busy();
p_di=p_rw=0;P0=0xb8|y;p_e=1;p_e=0;//送页地址采用同样的方法
}
//写数据子程序
void lw(uchar x,uchar y,uchar dd)
{
set_xy(x,y);
lcd_busy();
p_di=1;p_rw=0;P0=dd;p_e=1;p_e=0;
}
/*显示初始化子程序*/
void lcd_init(void)
{
uchar x,y;
/*开显示*/
p_e=p_di=p_rw=0;//写指令,使能清0
p_csa=p_csb=0;//片选清0
p_csa=1;P0=0x3f;p_e=1;p_e=0;p_csa=0;//写左屏幕,开显示
p_csb=1;P0=0x3f;p_e=1;p_e=0;p_csb=0;//写右屏幕,开显示
/*0行开始显示*/
p_csa=1;lcd_busy();p_di=p_rw=0;P0=0xc0;p_e=1;p_e=0;p_csa=0;//左屏幕从0行开始显示
p_csb=1;lcd_busy();p_di=p_rw=0;P0=0xc0;p_e=1;p_e=0;p_csb=0;//右屏幕从0行开始显示
for (y=0;y<8;y++)
{
for (x=0;x<128;x++) lw(x,y,0);//清屏幕
}
}

//显示汉字,fb==1:反白显示,x为列,y为页,p为指针(数据的地址)
void disp_hz(uchar x,uchar y,char *p,uchar fb)
{
uchar i,dd;
for (i=0;i<16;i++)//i为一个字的宽度.
{
dd=*(p+i);//取要显示的数据
if (fb) dd=255-dd;//反白就是让它每个位取反
lw(x+i,y,dd);
dd=*(p+16+i);//让它取下一行数组里的数
if (fb) dd=255-dd;
lw(x+i,y+1,dd);
}
}

//显示字符,fb==1:反白显示
void disp_zf(uchar x,uchar y,char *p,uchar fb)
{
uchar i,dd;
for (i=0;i<8;i++)//i为一个字的宽度.
{
dd=*(p+i);//取要显示的数据
if (fb) dd=255-dd;//反白就是让它每个位取反
lw(x+i,y,dd);
dd=*(p+8+i);//让它取下一行数组里的数
if (fb) dd=255-dd;
lw(x+i,y+1,dd);
}
}
//显示图象128*32,fb==1:反白显示
void disp_image(uchar x,uchar y,uchar *p,uchar fb)
{
uchar i,dd;
for (i=0;i<64;i++)//i为一个字的宽度.
{
dd=*(p+i);//取要显示的数据
if (fb) dd=255-dd;//反白就是让它每个位取反
lw(x+i,y,dd);
dd=*(p+128+i);//让它取下一行数组里的数
if (fb) dd=255-dd;
lw(x+i,y+1,dd);
dd=*(p+256+i);//取要显示的数据
if (fb) dd=255-dd;//反白就是让它每个位取反
lw(x+i,y+2,dd);
dd=*(p+384+i);//让它取下一行数组里的数
if (fb) dd=255-dd;
lw(x+i,y+3,dd);
}
}
/*延时子程序*/
void delay()
{
data uint i,j;
for(i=0;i<255;i++)
{for(j=0;j<

255;j++);}
}

/*滚动子程序*/
mov_line(char i)
{
p_csa=1;lcd_busy();p_di=p_rw=0;P0=0xc0|i;p_e=1;p_e=0;p_csa=0;//左屏幕从i行开始显示
p_csb=1;lcd_busy();p_di=p_rw=0;P0=0xc0|i;p_e=1;p_e=0;p_csb=0;//右屏幕从i行开始显示
}
/*采用中断*/
void timer0() interrupt 1 using 0
{//T/C0中断服务程序入口
//一个中断时间太短了,我们采用软件延时,利用一个全局变量TIMER来控制时间长短.
TIMER++;
if(TIMER==255){
mov+=1;
if(mov==64) mov=0;
mov_line(mov);
}
TH0=-(1/256);
TL0=-(1%256);//装载记数初值
}

/*主程序,本人的第一个C51程序!*/
void main()
{
uchar i,j,k,p_i,p_k,p_ii;//i为列,j为页,k为二维数组的行,p_i,p_ii为切换左右屏幕显示的变量,p_k为取字模位置的变量调整
lcd_init(); //初始化LCD
TMOD=0x01;//定时器方式1
TH0=-(1/256);
TL0=-(1%256);//装载记数初值
EA=1;
ET0=1;//开中断,但是还没开定时器
/*先左屏幕显示,再通过+64而切换到右屏幕显示*/
for(p_i=p_ii=p_k=0;p_i<=64&&p_k<=1;p_i+=64,p_ii+=56,p_k++)
{
for(i=j=k=0;k<=6&&i<=48;k+=2,i+=16)
{
disp_hz(i+p_i,j,&hz[k+8*p_k][0],0);
}//显示汉字
for(i=8,j=2,k=0;k<=7&&i<=56;k++,i+=8)
{
disp_zf(i+p_ii,j,&zf[k+7*p_k][0],0);
}//显示字母,空一个字母来显示

disp_image(p_i,4,&image[4*p_k][0],0);
//显示图象
}
TR0=1;//启动定时器
do{}while(1);//等待中断
}


相关文档
最新文档