12864点阵液晶显示实验
-------------------------------------------------------------------------------------------------------------------------------------
[实验要求]
利用128X64
点阵液晶显示屏显示图片,字符,汉字,实现其基本显示功能。
[实验目的]
掌握128X64
点阵液晶显示的原理。
注意:关于液晶的操作说明请用户查看光盘元件资料下的YM12864J液晶资料。
[硬件电路]
[源代码]
//TX-1B实验板12864液晶测试程序
//测试驱动液晶的程序.
在指定的位置显示汉字
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code lcd_lattice16_16[]; //几个函数声明
unsigned char code lcd_letter_8_16[];
void
display_8_16(uchar,uchar,uchar);
void
displaycoslight(uchar);
unsigned char code lcd_lattice_coslight[15][320];
sbit
CS1=P3^0; //液晶左半屏选择
sbit
CS2=P3^1; //液晶右半屏选择
sbit
RS=P3^5; //写数据或命令选择
sbit
E=P3^4; //液晶使能
bit
dot_not; //反白标志
void
wrst_le(uchar date) //写左部分状态字
{
CS1=1;
CS2=0;
RS=0;
E=1;
P0=date;
E=0;
}
void
wrst_ri(uchar date) //写右部分状态字
{
CS1=0;
CS2=1;
RS=0;
E=1;
P0=date;
E=0;
}
void
wrda_le(uchar date) //写左部分数据
{
CS1=1;
CS2=0;
RS=1;
E=1;
P0=date;
E=0;
}
void
wrda_ri(uchar date) //写右部分数据
{
CS1=0;
CS2=1;
RS=1;
E=1;
P0=date;
E=0;
}
void
lcdinit() //初始化
{
wrst_le(0x3f);
wrst_ri(0x3f); /*display on*/
}
void
displaycls(uchar background) //1清白屏,0清成黑屏
{
uchar i;
uchar j;
lcdinit();
wrst_le(0xc0);
wrst_ri(0xc0) ; //设置显示起始行
for(i=0;i<8;i++)
{
wrst_le(0xb8|i); //设置页地址
wrst_le(0x40|0); //设置列地址
for(j=0;j<64;j++)
{
if (background==0)
{
wrda_le(0xff);//清成白屏
}
else
{
wrda_le(0);//清成黑屏
}
}
}
for(i=0;i<8;i++)
{
wrst_ri(0xb8|i);//设置页地址
wrst_ri(0x40|0);//设置列地址
for(j=0;j<64;j++)
{
if (background==0)
{
wrda_ri(0xff);//清成白屏
}
else
{
wrda_ri(0);//清成黑屏
}
}
}
}
void
displayword(uchar lcdrow,uchar lcdline,uchar wordnumber)
{ //在指定的列和行显示一个汉字
uchar
i;
uint
j;
if(lcdline<64)
{
lcdinit();
wrst_le(0xc0);
wrst_le(0xb8|lcdrow); //设置页地址
wrst_le(0x40|lcdline); //设置列地址
j=(wordnumber-1)*32;
for(i=0;i<32;i++)
{
if(dot_not==1) wrda_le(~lcd_lattice16_16[i+j]);
else wrda_le(lcd_lattice16_16[i+j]);
if(i==15)
{
lcdinit();
wrst_le(0xb8|(lcdrow+1)); //设置页地址
wrst_le(0x40|lcdline); //设置列地址
}
}
}
else
{
lcdinit();
wrst_ri(0xc0); //设置显示起始行
wrst_ri(0xb8|lcdrow); //设置页地址
wrst_ri(0x40|(lcdline-64)); //设置列地址
j=(wordnumber-1)*32;
for(i=0;i<32;i++)
{
if(dot_not==1)wrda_ri(~lcd_lattice16_16[i+j]);
else wrda_ri(lcd_lattice16_16[i+j]);
if(i==15)
{
wrst_ri(0xb8|(lcdrow+1)); //设置页地址
wrst_ri(0x40|(lcdline-64));//设置列地址
}
}
}
}
void
display_8_16(uchar lcdrow,uchar lcdline,uchar datanumber)
{ //在指定的列和行显示一个字符
uchar i;
uint j;
if(lcdline<64)
{
wrst_ri(0xc0);
wrst_ri(0xb8|lcdrow);//设置页地址
wrst_ri(0x40|lcdline);//设置列地址
j=datanumber;
j=(16*j);
for(i=0;i<16;i++)
{
if(dot_not) {wrda_ri(~lcd_letter_8_16[i+j]);}
else {wrda_ri(lcd_letter_8_16[i+j]);}
if(i==7)
{wrst_ri(0xb8|(lcdrow+1));//设置页地址
wrst_ri(0x40|lcdline);//设置列地址
}
}
}
else if(lcdline<122)
{
wrst_le(0xc0);//设置显示起始行
wrst_le(0xb8|lcdrow);//设置页地址
if(lcdline<121)
{
wrda_le(0x40|(lcdline-64));//设置列地址
}
j=datanumber*16;
for(i=0;i<16;i++)
{
if(dot_not)
{
wrda_le(~lcd_letter_8_16[i+j]);
}
else {wrda_le(lcd_letter_8_16[i+j]);}
if(i==7)
{wrst_le(0xb8|(lcdrow+1));//设置页地址
wrst_le(0x40|(lcdline-64));//设置列地址
}
}
}
}
void
displaycoslight(uchar which_bmp) //显示一幅图像函数
{
uchar i;
uchar j;
wrst_le(0xc0);
wrst_ri(0xc0);/*设置显示起始行*/
for(i=1;i<6;i++)
{
wrst_ri(0xb8|i);/*设置页地址*/
wrst_ri(0x40|32);/*设置列地址*/
for(j=0;j<32;j++)
{
wrda_ri(lcd_lattice_coslight[which_bmp][(64*(i-1))+j]);
}
wrst_le(0xb8|i);/*设置页地址*/
wrst_le(0x40|00);/*设置列地址*/
for(j=32;j<64;j++)
{
wrda_le(lcd_lattice_coslight[which_bmp][(64*(i-1))+j]);
}
}
}
/***********************************************************/
unsigned char code lcd_lattice_coslight[15][320]={
/*--调入了一幅图像:
/*-- 宽度x高度=64x40
--*/
//编码略
};
///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
unsigned char code lcd_letter_8_16[]=
{
/*-- 文字:
0 -- 0 --*/
/*-- 宋体12;
此字体下对应的点阵为:宽x高=8x16
--*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,
0x20,0x20,0x10,0x0F,0x00,//其余字库略
};
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
unsigned char code lcd_lattice16_16[]={
/*-- 文字1:
简
--*/
/*-- 宋体12;
此字体下对应的点阵为:宽x高=16x16
--*/
0x10,0x08,0xC7,0x12,0x26,0x8A,0x82,0xAA,0xA4,0xA3,
0xA2,0x26,0x2A,0xE2,0x02,0x00,0x00,0x00,0xFF,0x00,0x00,
0x1F,0x12,0x12,0x12,0x12,0x1F,0x40,0x80,0x7F,0x00,0x00
//其余字库略
};
void
main()
{
displaycls (1); //清屏
displayword(2,16*0,1); //简易信号发生器
displayword(2,16*1,2);
displayword(2,16*2,3);
displayword(2,16*3,4);
displayword(2,16*4,5);
displayword(2,16*5,6);
displayword(2,16*6,7);
displayword(4,16*1,8); //我最爱毕业设计
displayword(4,16*2,9);
displayword(4,16*3,10);
displayword(4,16*4,11);
displayword(4,16*5,12);
displayword(4,16*6,13);
displayword(4,16*7,14);
while(1);
}
|