#include"zimo.h"
#include <reg52.h> //头文件
//液晶信号控制引脚定义
sbit DI=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit E=P2^0; // 读\写使能
sbit CS1=P2^4; // 片选1
sbit CS2=P2^3; // 片选2
//以下是外面是数组说明
extern unsigned char code ziku[];
extern uchar code picture[][64];
extern uchar code Hzk[][32];
unsigned int number=0,mstcnt=0;
//自己定义函数说明
void delay(uint ms);
//以下为基本操作程序
////*******************************//
//液晶判忙函数********************//
//*******************************//
void checkstate() //判断液晶是否忙
{
unsigned char dat;
DI=0; //指令模式
RW=1; //读控制器
do
{
P1=0x00;
E=1;
dat=P1;
E=0;
dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
}while(!(dat==0x00));
}
//**********************************//
// I/O口向液晶控制器写命令函数*******//
//***********************************//
void writecommand(unsigned char command) //写命令
{
checkstate();
RW=0;
P1=command;
E=1; //要注意这个些数据或者命令写入液晶控制器都是下降延的
E=0;
}
//************************************************//
//******I/O口向液晶控制器写数据函数****//
//***********************************************//
void writedate(unsigned char date) //写数据
{
checkstate();
DI=1; RW=0;
P1=date;
E=1; E=0;
}
//*********************************
//***清屏幕************
///*******************************
void cleanscreen() //清屏
{
unsigned char page,i;
for(page=0xb8;page<0xc0;page++) //一共写8页
{
writecommand(page);
writecommand(0x40); //将控制器指针拉回到第0列
for(i=0;i<64;i++) //写64列数据,每列为一个字节
{writedate(0x00);//(8个位纵向组成一个页)
//delay(10);
}
}
}
//*************************//
//*****液晶片选函数******//
//***********************//
void choosescreen(unsigned char NO) //选择屏幕
{
switch (NO)
{
case 0: //选择2片(左右两片)
CS1=0;
CS2=0;
break;
case 1://选择左片液晶
CS1=0;
CS2=1;
break;
case 2:
CS1=1;//选择右片液晶
CS2=0;
break;
default:
break;
}
}
//*********************//
//******初始化函数**** //
//********************//
void lce_init(void)
{
writecommand(0xc0); //显示起始为0页
writecommand(0x3f); //开启液晶
}
//*************************************************//
//按照序号显示汉字程序
//count 为要显示的汉字的序号
//**按照数组中次序依次显示32个汉字。在两块液晶上面
//**************
void display(unsigned char count)
{
unsigned int i,m;
choosescreen(1); //左块液晶
writecommand(0xb8); //页指针指向第0页
writecommand(0x40); //列指针指向第0列
for(i=0;i<count*16;i++)
{
if(i!=0&&i%16==0) //一个汉字在控制器缓寸上占据16*16空间
m++; //下个汉字
switch (i)
{
case 64: //这里有两块液晶公八页,这里是要确定下一个汉字到底在
//哪块液晶的哪一页起始,列都是从0开始所以写(0x40)
choosescreen(2);
writecommand(0xb8);
writecommand(0x40);
break;
case 128:
choosescreen(1);
writecommand(0xba);
writecommand(0x40);
break;
case 192:
choosescreen(2);
writecommand(0xba);
writecommand(0x40);
break;
case 256:
choosescreen(1);
writecommand(0xbc);
writecommand(0x40);
break;
case 320:
choosescreen(2);
writecommand(0xbc);
writecommand(0x40);
break;
case 384:
choosescreen(1);
writecommand(0xbe);
writecommand(0x40);
break;
case 448:
choosescreen(2);
writecommand(0xbe);
writecommand(0x40);
break;
default:
break;
}
writedate(*(ziku+i+m*16));//数组元素的访问的一种写法
//下面的语句等价的
//writedate(ziku[i+(m*16)]);
}
choosescreen(1);
writecommand(0xb9); //页指针指向下一页,送下半个汉字的字模数据
writecommand(0x40);//列归零
m=0;
for(i=0;i<count*16;i++)
{
if(i!=0&&i%16==0)
m++;
switch (i)
{
case 64:
choosescreen(2);
writecommand(0xb9); //这段程序和上面那段类似就页加一就可以
writecommand(0x40);
break;
case 128:
choosescreen(1);
writecommand(0xbb);
writecommand(0x40);
break;
case 192:
choosescreen(2);
writecommand(0xbb);
writecommand(0x40);
break;
case 256:
choosescreen(1);
writecommand(0xbd);
writecommand(0x40);
break;
case 320:
choosescreen(2);
writecommand(0xbd);
writecommand(0x40);
break;
case 384:
choosescreen(1);
writecommand(0xbf);
writecommand(0x40);
break;
case 448:
choosescreen(2);
writecommand(0xbf);
writecommand(0x40);
break;
default:
break;
} //
writedate(*(ziku+i+m*16+16));
//下面的语句等价的
//writedate(ziku[i+(m*16)]);
}
m=0;
}
//*****************************************************************/
//功能:在B液晶上显示汉字程序///////////////////////////
//参数说明:adds:字库内序号 nb:要显示的汉字的个数(1~4个)
// x:显示起始列 y:显示起始页(0~6) style: 显示风格(白或荫?
/*******************************************************************/
wr_hz_b(uchar adds,uchar nb,uchar x,uchar y,uchar style)
{
uchar i,j;
choosescreen(2); //选择B块液晶
for(j=adds;j<adds+nb;j++)
{
writecommand(0x40+16*x);
//write_comd_b(0x40+16*x);
// write_comd_b(0xb8+y);
writecommand(0xb8+y);
for(i=0;i<16;i++)
//显示的风格设置(背景设置)
if(style==1)
//write_data_b(~Hzk[j][i]);
writedate(~Hzk[j][i]);
else
//write_data_b(Hzk[j][i]);
writedate(Hzk[j][i]);
//下半个汉字
//write_comd_b(0x40+16*x); //调整指针位置 列回到起始处
//write_comd_b(0xb8+y+1); //页向下一页
writecommand(0x40+16*x);
writecommand(0xb8+y+1);
for(i=16;i<32;i++) //显示一个汉字的剩余16个字节数据
if(style==1)
//write_data_b(~Hzk[j][i]);
writedate(~Hzk[j][i]);
else
//write_data_b(Hzk[j][i]);
writedate(Hzk[j][i]);
x++; //一个汉字完了后列也要向后16列了
}
}
/**********************************************/
/*名称:图片显示
/*功能: 在左半块或者右半块显示64*64的指定图片
/*********************************************/
void disp_pic_a_or_b(uchar fu,uchar pos)
{
uchar i,j;
if(pos==0)//选择左块
{
for(j=0;j<8;j++)
{
choosescreen(1);
writecommand(0x40); //这段程序和上面那段类似就页加一就可以
writecommand(0xb8+j);
//write_comd_a(0x40);
//write_comd_a(0xb8+j);
for(i=0;i<64;i++)
// write_data_a(picture[8*fu+j][i]);
writedate(picture[8*fu+j][i]); //写数据
}
}
else
{
for(j=0;j<8;j++)
{
choosescreen(2);
writecommand(0x40); //这段程序和上面那段类似就页加一就可以
writecommand(0xb8+j);
//write_com
评论7
最新资源