#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar com; //命令字
uchar dat; //数据字
sbit CSA = P1^4; //*cs-1*/
sbit CSB = P1^3; //*cs-2*/
sbit RS = P1^2; //*rs*/
sbit RW = P1^1; //*r/w*/
sbit EN = P1^0; //*enable*/
void ReadStatus() //*判断"忙"状态*/
{
uchar busy;
uchar temp;
RS = 0; //*读时序控制1; RS=0表示进行的是指令操作*/
RW = 1; //*读时序控制2; RW=1表示进行的是读操作*/
do
{
P0 = 0xff; //*P0作输入*/
EN = 1; //*读时序控制3; 使能信号置高*/
busy = P0; //*P0代表端口1的内容*/
EN = 0; //*读时序控制4; 使能信号置低*/
temp=busy&0x80;
}while (temp!=0);
}
void WrLeftCom() //*左屏写命令*/
{
CSA = 0; //选中左屏,0有效;
CSB = 1; //右屏不被选中,1无效;
ReadStatus();
RS = 0;
RW = 0;
P0 = com; //*com表示命令的内容*/
EN = 1;
EN = 0;
}
void WrRightCom() //*写右屏命令*/
{
CSA = 1;
CSB = 0;
ReadStatus();
RS = 0;
RW = 0;
P0 = com;
EN = 1;
EN = 0;
}
void WrLeftData() //*左屏写数据*/
{
CSA = 0;
CSB = 1;
ReadStatus();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
uchar RdLeftData() //读数据
{
uchar dat;
CSA = 0;
CSB = 1;
ReadStatus();
RS = 1; //*读时序控制1; RS=1表示进行的是数据操作*/
RW = 1; //*读时序控制2; RW=1表示进行的是读操作*/
P0 = 0xff; //*P0作输入*/
EN = 1; //*读时序控制3; 使能信号置高*/
dat = P0;
EN = 0; //*读时序控制4; 使能信号置低*/
return(dat);
}
void WrRightData() //*右屏写数据*/
{
CSA = 1;
CSB = 0;
ReadStatus();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
uchar RdRightData() //读数据
{
uchar dat;
CSA = 1;
CSB = 0;
ReadStatus();
RS = 1; //*读时序控制1; RS=1表示进行的是数据操作*/
RW = 1; //*读时序控制2; RW=1表示进行的是读操作*/
P0 = 0xff; //*P0作输入*/
EN = 1; //*读时序控制3; 使能信号置高*/
dat = P0;
EN = 0; //*读时序控制4; 使能信号置低*/
return(dat);
}
void ClrFullScr() //清全屏
{
uchar page=0;
uchar column=0;
for(page=0;page<8;page++)
{
com =(0xb8 + page); //页地址设置
WrLeftCom();
WrRightCom();
com =0x40; //列地址设置
WrLeftCom();
WrRightCom();
for( column=0; column<64; column++) //RAM清"0"
{
dat =0x00; //由于列地址在操作完后会自动加1,
//因此只用设置初地址就行了
WrLeftData();
WrRightData(); //RAM清0就是在所在单元写上数据0
}
}
}
void LCDInit() //液晶初始化
{
com =0xc0; //显示从第0行开始
WrLeftCom();
WrRightCom();
com =0x3F ; //液晶显示开关打开
WrLeftCom();
WrRightCom();
ClrFullScr(); //清全屏
}
void Display88Dot(uchar Row, uchar Col, uchar* Lib, uint Addr) //Display a 8*8 dot array;
{ //Row:0~7 Col:0~15
uchar OffsetCol = 0;
Addr <<= 3;
if((Row>7)||(Col>15)) //防止越界
return;
else if(Col>7)
{
com = 0xb8 + Row;
WrRightCom();
Col -= 8;
Col <<= 3;
com = 0x40 + Col;
WrRightCom();
for(OffsetCol=0; OffsetCol<8; OffsetCol++)
{
dat = Lib[OffsetCol + Addr];
WrRightData();
}
}
else
{
com = 0xb8 + Row;
WrLeftCom();
Col <<= 3;
com = 0x40 + Col;
WrLeftCom();
for(OffsetCol=0; OffsetCol<8; OffsetCol++)
{
dat = Lib[OffsetCol + Addr];
WrLeftData();
}
}
}
main()
{
LCDInit();
}
评论0