#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
delay(uint i){while(--i);}
//12864引脚及常数定义
#define lcdDatPort P0 /* LCD12864 数据线 */
sbit cs2= P2^3; /* 右屏片选,高电平有效 */
sbit cs1= P2^4; /* 左屏片选,高电平有效 */
sbit en = P2^5; /* 读,写使能,高电平有效,下沿锁定数据 */
sbit rw = P2^6; /* 1读\0写 */
sbit rs = P2^7; /* 1数据\0指令 */
#define addX0 0xB8 /* x地址(0页) */
#define addY0 0x40 /* y地址(0列) */
#define addZ0 0xC0 /* Z地址(0行开始显示) */
#define lcdDispON 0x3F /* 开显示命令 */
/** LCM忙检测 **/
busy12864(){
lcdDatPort=0xff; //口线置1,防止干扰
rs=0; rw=1; //置“命令、读”模式
en=1;
//while(lcdDatPort&0x80); //忙等待,ISIS仿真没有忙信号
en=0;
delay(1);
}
/** 写命令 参数:comDat为要发送的命令 **/
WriteCom(uchar comDat){
busy12864(); //忙,则等待
rs=0;rw=0; //置“命令、写”模式
lcdDatPort=comDat;en=1;en=0;//送出命令,并使之有效
}
/** 写数据 参数:dat为要发送的数据 **/
WriteDat(uchar dat){
busy12864(); //忙,则等待
rs=1;rw=0; //置“数据、写”模式
lcdDatPort=dat;en=1;en=0; //送出数据,并使之有效
}
/** 将一字节数据dat写到r行,c列 **/
WriteObjDat(uchar r,uchar c,uchar dat){
if(c<64)cs1=1,cs2=0; //选择左屏
else cs1=0,cs2=1,c-=64; //选择右屏
WriteCom(addX0+r);
WriteCom(addY0+c);
WriteDat(dat);
}
/** 读当显示数据 **/
uchar ReadDat(uchar r,uchar c){
uchar temp;
if(c<64)cs1=1,cs2=0; //选择左屏
else cs1=0,cs2=1,c-=64; //选择右屏
WriteCom(addX0+r);
WriteCom(addY0+c);
busy12864();
lcdDatPort=0xFF;
rs=1;rw=1;
en=1;en=0;delay(1); //读空操作
en=1;temp=lcdDatPort;en=0;//正式读数据
return temp;
}
//清屏函数
void clrLCD(){
uchar i,j;
cs1=cs2=1; //同时选中左右屏
for(i=0;i<8;i++){ //共8页
WriteCom(addX0+i); //光标到i页
WriteCom(addY0); //光标到页首
for(j=0;j<64;j++)WriteDat(0); //写0清屏
}
}
/** 初始化12864 **/
Init12864(){
WriteCom(lcdDispON); //开显示
WriteCom(addZ0); //设置显示起始行
clrLCD(); //清屏
}
/** 画一个点 **/
//画点数据
uchar code dotDat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//画点函数,r行号(0~63),c列号(0~127),add=1,画点,add=0删除点
showDot(uchar r,uchar c,bit add){
if(add)WriteObjDat(r/8,c,ReadDat(r/8,c)|dotDat[r%8]);
else WriteObjDat(r/8,c,ReadDat(r/8,c)&(~dotDat[r%8]));
}
/** 画矩形,参数:r1,c1,左上角行列号,r2,c2右下角行列号 **/
rect(uchar r1,uchar c1,uchar r2,uchar c2){
uchar i;
for(i=r1;i<=r2;i++){showDot(i,c1,1);showDot(i,c2,1);}
for(i=c1;i<=c2;i++){showDot(r1,i,1);showDot(r2,i,1);}
}
void main(){
Init12864(); //初始化
rect(10,20,40,90); //画第一个矩形
rect(20,40,60,110); //画第二个矩形,与第一个交叠
while(1);
}
|