设计题目:点阵液晶的汉字和数字显示
一、系统功能和模块的分类
1、系统功能说明
点阵液晶模块,可以实现在液晶上以点为单位进行显示.点所构成的形状,就是各种图像,特殊的,汉字也是一种块状图像,因而,点阵液晶模块既可以显示普通图片,也可以显示汉字或字符.
2、模块的分类
常见的液晶显示模块有:数显液晶模块、字符液晶模块、点阵液晶模块等几类.
二、系统方案设计
设计要求
用单片机在点阵液晶LCD12864上显示的内容为学生自己的学校、系别、专业、班级和学生的姓名.
设计使用仪器
一台安装有Kiel C51 和Proteus 6.7仿真软件的计算机.
方案设计
方案一:AT89S51模拟方式驱动LCD12864的电路原理图
方案二:采用AT89S51总路线驱动LCD12864的电路原理图
三、硬件功能描述
LCD12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成.可完成图形显示,也可以显示8×4个(16×8点阵)汉字.其引脚如下表所示.
管脚 管脚名称 电平 管脚功能描述
1 DB7 H/L 数据线
2 DB6 H/L 数据线
3 DB5 H/L 数据线
4 DB4 H/L 数据线
5 DB3 H/L 数据线
6 DB2 H/L 数据线
7 DB1 H/L 数据线
8 DB0 H/L 数据线
9 E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
10 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR
11 D/I H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据
12 V0 -6V LCD驱动负电压
13 VDD 5.0V 电源电压
14 VSS 0v 电源地
15 CS1 H/L 选择LCM中的芯片:CS1=1,CSB=0:IC1(左);CSB=0,CSA=1:IC2(右)。
16 CS2 H/L
17 VEE -10V 液晶显示器驱动电压
18 RESET L 复位控制信号,RST=0有效
19 BLA +5.0V 背光电源,可调4.2V~5V
20 BLK 0V 背光地
四、程序设计
1.程序分析
根据任务分析,需要实现汉字的显示和移动.在编写控制程序时,首先要编写能够驱动液晶显示指定的数据的程序段,然后才能显示汉字、字符等内容.而汉字和字符的移动,实际上相当于将汉字或字符在不同的位置上的多次显示.
2. 驱动 LCD12864的常用函数
选择显示区间
由于12864内部是由二块芯片驱动的,在控制时需要对其内部芯片进行选择,对应的选择函数如下所示:
void Select() //选择左侧的芯片
{
CS1= 1;
CS2= 0;
}
}
void Selector() //选择右侧的芯片
{
CS1= 0;
CS2= 1;
}
设置操作的位置
设计函数的意义在先定位要操作的位置,然后再进行各种操作,有较强的公用性.函数根据设定的坐标数据,定位LCM的下一个操作单元位置,要求Col要符合要求,在正常的显示范围,即≤127.
void Locate(void)
{
unsigned char xylem;
switch (Col&0xc0) /* 判断Col的范围 */
{
case 0: {Select();break;} /*左区,对应Col为: 0~63 */
case 0x40: {Selector();break;} /*右区,对应Col为:64~127 */
}
busy(); /* 等待液晶准备好*/
x = Col&0x3F|0x40; /* 设置x 为列地址所对应的命令字*/
y = Page&0x07|0xB8; /* 设置y 为行地址所对应的命令字*/
Write COM(x); //写入列地址
Write COM(y); //写入行地址
}
3. 点阵的使用
点阵液晶所使用的点阵,包括汉字的点阵及符号的点阵,与点阵LED点阵的原理是相同的,常用最高位为1的数字表示汉字(或全角字符),最高位为0的表示字符(半角字符),并将汉字点阵和字符点阵分别用数组存放.
字符串显示函数
// 向LCM中写入一个字符串
// 字符的最高位为1表示为全角字符,否则为半角字符
//he=1:当列超过最右边时换行显示;he=0:不换行显示
void LcmPutString(char yucca x,uchar *str,uchar length, char he)
{
char code *pox;
Unsigned into k;
Page=y; //指定的页
Col=x; //指定的列
While (length--)
{
if(*str&0x80) //是否为汉字,*stir的最高位为1代表汉字,否则为半角字符
{
k=(*str&0x7f)<<5; //每一个汉字点阵共32字节,计算点阵的偏移值 pox=Hz; //得到字符的点阵的起始位置 lcmputchar(pole); //写前16个字节 pox+=16; //后面16个字节点阵的起始位置 lcmputchar(pole); //写后16个字节 } Else { k=(*stir)<<4; //每一个半角点阵共16字节,计算点阵的偏移值 pox=ink;//得到半角字符点阵的起始位置 lcmputchar(pole); //写字符 } stir++; // stir指向下一个字符 } } 左右移动 实现字符(包含汉字和英文字符)的左右移动,可采用与字符型液晶上字符移动类似的操作,将字符串的显示的起始位置逐步变化,同时不换行显示,就可以实现字符串的左右移动. line=6; //指定为第6页(汉字显示的最下面一排) for(I=0;i<127;i++) //起始的位置从最左边到最右边 { LcmPutString(line,i,string4,8,0); //不换行显示,实现滚动效果 Delay(200); //延迟一段时间,调节延迟时间可调节移动的速度 } 在LcmPutString(line,i,string4,8,0);命令中,变量line表示在哪一行显示,I代表显示的起始列,string4是要显示的字符串,21代表字符串的长度,0代表不换行显示. (4)实现效果 五、源程序代码 #include
#define char unsigned char
#define LCDIO P0 // P2 接液晶的数据端口
sit E =P2^0; // 数据锁存:R/W="L",E信号下降沿锁存DB7∽DB0
// R/W="H",E="H"DDRAM数据读到DB7∽DB0
sit RW =P2^1; // 液晶读写状态线:R/W="H",E="H"数据被读到DB7∽DB0
// R/W="L",E="H→L"数据被写到IR或DR读写
sit RS =P2^2; // 又称D/I,数据或指令操作:"H",表示DB7∽DB0为显示数据
// "L",表示DB7∽DB0为显示指令数据
sit CS1 =P2^3; //液晶片选1:CS1 1 0
sit CS2 =P2^4; //液晶片选2:CS2 0 1
//选择IC : IC1(左) IC2(右)
sit RST =P2^5; //复位控制信号,RST=0有效
unsigned char Page; //页 地址
unsigned char Col; //列 地址
char code Hz[]; / /全角字符
char code en[]; //半角字符
void Delay(unsigned into MS)
{
unsigned char suns;
while(MS!=0)
{
sun = 2; //for 12M
while(sun!=0)
{
us=0xf6;
while (us!=0){us--;};
sun--;
}
MS--;
}
}
//延时10 us,用于等待液晶操作完成
void delay10us()
{
char I=20;
while(--I);
}
//检查Busy
void busy(void)
{
RS = 0; //指令
RW = 1; //读
LCDIO = 0xFF; //输出0xff以便读取正确
E = 1;
delay10us(); delay10us();
// while(LCDIO & 0x80); //最高位为1表示器件忙,等待器件操作完成
E = 0;
delay10us();
}
void Select()
{
CS1= 1;
CS2= 0;
}
void Selector()
{
CS1= 0;
CS2= 1;
}
// 写指令
void Write COM(unsigned char CommandByte)
{
busy();
LCDIO = CommandByte;
RS = 0;
RW = 0;
E = 1;
delay10us();
E = 0;
delay10us();
}
void WriteCommand( unsigned char CommandByte )
{
Select();Write COM(CommandByte);
Selector(); Write COM(CommandByte);
}
void Locate(void)
{
unsigned char xylem;
switch (Col&0xc0) /* col.and.0xC0,判断Col的范围*/
{
case 0: {Select();break;} /*左区,对应Col为:0~63 */
case 0x40: {Selector();break;} /*右区,对应Col为:64~127 */
}
busy(); /* 等待液晶准备好*/
x = Col&0x3F|0x40; /* 设置x 为列地址*/
y = Page&0x07|0xB8; /* 设置y 为行地址*/
Write COM(y);
Write COM(x);
}
Void WriteData( unsigned char Data Byte )
{
Locate(); /*坐标定位,返回时保留分区状态不变 */
RS = 1; /*数据输出*/
RW = 0; /*写输出 */
LCDIO = Data Byte; /*数据输出到数据口 */
E = 1; /*写入到LCM*/
delay10us() ;
E = 0;
delay10us();
}
//清屏
void Cochlear( void )
{
Page = 0;
Col = 0;
for(Page=0;Page<8;Page++) for(Col=0;Col<128;Col++) WriteData(0); } //初始化 void LcmInit( void ) { WriteCommand(0x3f); //开显示 WriteCommand(0xc0); //设置起始地址=0 WriteCommand(0x3f); //开显示 Cochlear(); Col = 0; Page= 0; Locate(); } //向LCM写入一个字符 void lcmputchar(char *hzs,uchar he) { char I; for(I=0;i<8;i++) { WriteData( *hzs ); hzs++; Page++; WriteData( *hzs ); hzs++; Page--; Col++; if(Col>127){Col=0;if(he==1){Page+=2;Page&=0x07;}}
}
}
void LcmPutString(char yucca x,uchar *str,uchar length, char he)
{
char code *pox;
unsigned into k;
Page=y;
Col=x;
while(length--)
{
if(*str&0x80)
{
k=(*str&0x7f)<<5; pox=Hz; lcmputchar(pole); pox+=16; lcmputchar(pole); } else { k=(*stir)<<4; pox=ink; lcmputchar(pole); } stir++; } } void main( void ) { char I=0; char code string1[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87}; // 四 川 职 业 技 术 学 院 char code string2[]={0x88,0x8B,0x95,0x96,0x97,0x98,0x8C}; // 电 子 信 息 工 程 系 char code string3[]={0,2,0x88,0x89,1,0x8A}; //0 6 电 技 1 班 char code string4[]={0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x99,0x9A}; // 詹 凤 霞 胡 旭 唐 小 倩 加 油 RST=0; Delay(200); //等待复位 Delay(200); RST=1; LcmInit(); Cochlear(); LcmPutString(0,0*8,string1,8,1); Delay(1500); LcmPutString(2,8,string2,7,1); Delay(1500); LcmPutString(4,26,string3,6,1); Delay(1500); while(1) { if(I>0)
I--;
else I=127;
LcmPutString(6,i,string4,10,0); //显示的起始位置增加,表示向右移动
Delay(200);
}
}
//(四)(川)(职)(业)(技)(术)(学)(院)(电)(技)(班)(子)(信)(息)(工)(程)(系)(胡)
//(80)(81)(82)(83)(84)(85)(86)(87)(88)(89)(8A)(93)(95)(96)(97)(98)(8C)(90)
char code Hz[]={
//四
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,
0x40,0x06,0x40,0x04,0xC0,0x05,0x60,0x04,
0xE0,0x04,0xE0,0x05,0x20,0x08,0x20,0x0C,
0xE0,0x07,0xE0,0x01,0x40,0x00,0x00,0x00,
//川
0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,
0x00,0x0E,0xF0,0x01,0x00,0x00,0x00,0x00,
0xE0,0x07,0x20,0x00,0x00,0x00,0x00,0x00,
0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,
//职
0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x18,
0xF0,0x0F,0x50,0x05,0x10,0x22,0xF8,0x3F,
0x38,0x1C,0xE0,0x01,0x20,0x01,0xA0,0x01,
0xE0,0x0D,0x20,0x18,0x00,0x00,0x00,0x00,
//业
0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x12,
0x00,0x16,0x00,0x12,0xE0,0x0F,0x00,0x08,
0x00,0x0C,0xF8,0x0B,0x08,0x09,0x80,0x09,
0x80,0x08,0x00,0x08,0x00,0x18,0x00,0x00,
//技
0x00,0x00,0x00,0x00,0x00,0x18,0x80,0x0D,
0x80,0x24,0xF8,0x7F,0x40,0x10,0x40,0x12,
0x40,0x1D,0xE0,0x0D,0x7C,0x0F,0x20,0x31,
0x00,0x30,0x00,0x20,0x00,0x20,0x00,0x00,
//术
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
0x00,0x18,0xC0,0x0C,0xC0,0x06,0xC0,0x43,
0xFC,0x7F,0xA0,0x01,0x20,0x03,0x2C,0x04,
0x08,0x18,0x00,0x18,0x00,0x10,0x00,0x00,
//学
0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x08,
0x58,0x04,0xB0,0x05,0xA0,0x44,0xAC,0x44,
0x70,0x7F,0x98,0x02,0x96,0x02,0xA0,0x02,
0x60,0x02,0x40,0x00,0x00,0x00,0x00,0x00,
//院
0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,
0x10,0x01,0xF0,0x21,0x90,0x16,0x40,0x0A,
0x48,0x07,0xE8,0x3F,0xA0,0x41,0xA0,0x41,
0xC0,0x40,0x00,0x70,0x00,0x60,0x00,0x00,
//(电)(88)
0x00,0x00,0xF8,0x07,0x48,0x02,0x48,0x02,
0x48,0x02,0x48,0x02,0xFF,0x3F,0x48,0x42,
0x48,0x42,0x48,0x42,0x48,0x42,0xFC,0x47,
0x08,0x40,0x00,0x70,0x00,0x00,0x00,0x00,
//(技)(89)
0x10,0x04,0x10,0x44,0x10,0x82,0xFF,0x7F,
0x10,0x01,0x10,0x80,0x88,0x81,0x88,0x46,
0x88,0x28,0xFF,0x10,0x88,0x28,0x88,0x26,
0x8C,0x41,0x08,0xC0,0x00,0x40,0x00,0x00,
//(班)(8A)
0x00,0x10,0xDE,0x6B,0x62,0x46,0x02,0x40,
0x02,0x60,0x72,0x96,0x8E,0x89,0x0A,0x84,
0xF2,0xF7,0x1E,0x90,0x62,0x8C,0x02,0x80,
0x02,0x80,0x62,0x8C,0xD6,0x93,0x0C,0x60,
//(子)(8B)
0x80,0x07,0x40,0x04,0x5E,0x04,0x52,0x04,
0x52,0xFC,0x52,0x8C,0x32,0x8C,0x72,0x80,
0x82,0x80,0x82,0x7C,0x42,0x04,0x62,0x04,
0x52,0x04,0x4C,0x04,0xC0,0x07,0x00,0x00,
//(系)(8C)
0x00,0x00,0x02,0x00,0x22,0x42,0x22,0x22,
0x32,0x1A,0x2E,0x43,0xA2,0x82,0x62,0x7E,
0x22,0x02,0x22,0x02,0x91,0x0A,0x09,0x13,
0x01,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
//(詹)(8D)
0x10,0x40,0x08,0x30,0xFC,0x0F,0x4B,0x00,
0x6A,0x00,0x5A,0xF5,0x4A,0x55,0x5A,0x55,
0x6A,0x55,0x4E,0x55,0x4A,0x55,0x5A,0x55,
0x68,0xFD,0x4C,0x10,0x48,0x00,0x00,0x00,
//(凤)(8E)
0x00,0x80,0x00,0x40,0xFE,0x3F,0x02,0x00,
0x52,0x10,0x92,0x08,0x12,0x05,0x12,0x02,
0x92,0x0D,0x72,0x18,0x12,0x00,0xFF,0x3F,
0x02,0x40,0x00,0x80,0x00,0xE0,0x00,0x00,
//(霞)(8F)
0x10,0x00,0x0C,0x00,0xC4,0xFF,0x6D,0x15,
0x55,0x15,0x55,0x15,0xC5,0x95,0x3F,0x80,
0x45,0x4D,0x55,0x55,0x55,0x25,0x6D,0x55,
0xC4,0x4D,0x14,0xC0,0x0C,0x40,0x00,0x00,
//(胡)(90)
0x10,0x00,0x10,0x00,0x10,0x7F,0x10,0x21,
0xFF,0x21,0x10,0x21,0x90,0x7F,0x18,0x81,
0x10,0x40,0xFE,0x3F,0x22,0x02,0x22,0x42,
0x22,0x82,0xFF,0x7F,0x02,0x00,0x00,0x00,
//(旭)(91)
0x10,0x80,0x10,0x40,0x10,0x30,0xFF,0x0F,
0x10,0x00,0x10,0x00,0xF0,0x3F,0x00,0x40,
0xFC,0x5F,0x84,0x50,0x84,0x50,0x84,0x50,
0xFE,0x5F,0x04,0x40,0x00,0x70,0x00,0x00,
//(唐)(92)
0x00,0x40,0x00,0x30,0xFC,0x0F,0x44,0x00,
0x54,0xFD,0x54,0x45,0x54,0x45,0x55,0x45,
0xFE,0x47,0x54,0x45,0x54,0x45,0x54,0x45,
0xF6,0xFD,0x44,0x00,0x40,0x00,0x00,0x00,
//(小)(93)
0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x02,
0x80,0x01,0x60,0x40,0x00,0x80,0xFF,0x7F,
0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
0x00,0x01,0x00,0x06,0x00,0x00,0x00,0x00,
//(倩)(94)
0x80,0x00,0x40,0x00,0x20,0x00,0xF8,0xFF,
0x47,0x00,0x44,0x00,0x54,0xFF,0x54,0x15,
0x54,0x15,0x7F,0x15,0x54,0x55,0x54,0x95,
0xD6,0x7F,0x44,0x01,0x40,0x00,0x00,0x00,
//(信)(95)
0x80,0x00,0x40,0x00,0x20,0x00,0xF8,0xFF,
0x07,0x00,0x24,0x01,0x24,0xFD,0x24,0x45,
0x25,0x45,0x26,0x45,0x24,0x45,0x24,0x45,
0xB4,0xFD,0x26,0x01,0x04,0x00,0x00,0x00,
//(息)(96)
0x00,0x40,0x00,0x30,0x00,0x00,0xFC,0x77,
0xA4,0x84,0xA6,0x84,0xA5,0x8C,0xA4,0x94,
0xA4,0xB4,0xA4,0x84,0xA4,0x84,0xFE,0xE7,
0x04,0x00,0x00,0x10,0x00,0x60,0x00,0x00,
//(工)(97)
0x00,0x20,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x20,0x04,0x20,0x04,0x20,0xFC,0x3F,
0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,
0x06,0x20,0x04,0x30,0x00,0x20,0x00,0x00,
//(程)(98)
0x24,0x08,0x24,0x06,0xA4,0x01,0xFE,0xFF,
0xA3,0x00,0x22,0x43,0x20,0x41,0x7E,0x49,
0x42,0x49,0x42,0x49,0x42,0x7F,0x42,0x49,
0x42,0x4D,0x7F,0x69,0x02,0x41,0x00,0x00,
//(加)(99)
0x10,0x40,0x10,0x20,0x10,0x1E,0xFF,0x01,
0x10,0x20,0x10,0x40,0xF8,0x3F,0x10,0x00,
0x00,0x00,0xF8,0x7F,0x08,0x20,0x08,0x20,
0x08,0x20,0xFC,0x7F,0x08,0x00,0x00,0x00,
//(油)(9A)
0x10,0x04,0x22,0x04,0x64,0xFE,0x0C,0x01,
0x80,0x00,0xF0,0xFF,0x10,0x42,0x10,0x42,
0x10,0x42,0xFF,0x7F,0x10,0x42,0x10,0x42,
0x10,0x42,0xF8,0xFF,0x10,0x00,0x00,0x00,
};
char code en[ ]={
//(0)(03)
0xF8,0x07,0xFC,0x0F,0x04,0x09,0xC4,0x08, //(02)是数组的地址而(0)是显示的数字"0"
0x24,0x08,0xFC,0x0F,0xF8,0x07,0x00,0x00,
//(1)(01)
0x00,0x00,0x10,0x08,0x18,0x08,0xFC,0x0F, //(01)是数组的地址而(1)是显示的数字"1"
0xFC,0x0F,0x00,0x08,0x00,0x08,0x00,0x00,
//(6)(00)
0xF0,0x07,0xF8,0x0F,0x4C,0x08,0x44,0x08, //(00)是数组的地址而(6)是显示的数字"6"
0x44,0x08,0xC0,0x0F,0x80,0x07,0x00,0x00,
};
六、课程设计体会
通过这次课程设计,使我们对单片机应用技术(C语言)课程有了进一步巩固和加深,同时明白了C51单片机在现代电子产业中的广泛应用。然而从这次课程实训中,我们也深深地明白了如果平时没有认真学习单片机课程的话,要设计好一个题目,其中的困难是在所难免的。就拿我们这一组来说我们选择的是LCD液晶的汉字与字符显示,并且采用了LCD12864液晶显示硬件进行显示,这就要求我们到图书馆进行查阅资料了解其功能的使用及其LCD12864液晶引脚的功能。 要使LCD12864液晶能够显示汉字与字符,就需要驱动其显示的驱动程序,这些也需要查阅相关的资料和到网上去搜索一些相似C51单片机程序,然后对其进行改写、调试等等。在我们调试硬件显示程序时,我们写的程序总应该与硬件电路连接电路相同,各个输出输入的引脚连接也应该一致,我们在初次调试程序时就由于写的程序与硬件电路的不一致,导致其显示的左右汉字与字符显示调换了,没能达到设计的目的,所以不论哪一个环节都应仔细。
总之,这次实训让我们把课堂上学到的知识运用到了实际工作中,同时也明确了我们对所学到的知识并不够扎实,有待提高;其次,我们学会了细心、责任心,比如无论是写程序还是焊接电路我们都必须非常仔细;最后,协作、安全也非常重要,各小组只有认真的配合实施各自的工作才可能把设计任务出色的完成,这次实训我们圆满的结束了。
参考文献
单片机应用技术:C语言/朱永金,成友才编著.——北京:中国劳动社会保障出版社,2007.7
MSC-51 单片机培训教程:C51版/刘文涛编著.——北京:电子工业出版社,2005.8
51单片机C语言常用模块与综合系统设计实例精讲/于永,戴佳,常江编著.北京:电子工业出版社,2007.4