📄 spjianrong.bak
字号:
/*高连才自己的液晶驱动程序*/
/*fnPR1(列,行,0x21);光标设置*/
/**************************************
通讯协议
FF x y code
1 1 1 2(高位低位)
FD * 背光开关
FE * 表示光标定位
FF * 显示字符
数据处理完成后发送0X66
**************************************/
#include <absacc.h>
#include <reg52_p.h>
#define uchar unsigned char
#define uint unsigned int
#define LCMDW XBYTE[0x8000]/* 数据口*/
#define LCMCW XBYTE[0x8100]/* 命令口*/
#define flashaddress5555 0x5555
#define flashaddress2AAA 0x2AAA
#define CSLCD P35=0,P13=1;P16=1/* 选通液晶*/
#define CS512A P35=1,P13=0;P16=1
#define CS512B P35=1,P13=1;P16=0
#define flashreset 0xf0
sbit A18=P1^2;
sbit A17=P1^1;
sbit A16=P1^0;
unsigned char glcj,fengming;
unsigned char rddata;
unsigned int page,glc;
unsigned long address;
unsigned int lowaddress;
uchar xx;
uchar yy;
uchar glcx,glcy;
uchar uart[5];
uchar ut=0;
uchar flag_ful=0;
void s();
void cls(void);
void delay_time(uint delay);
unsigned char F29040read();
void dispch(uchar x,uchar y,uint high,uint low);
char dispchk[32];
void fnST01(void) /* 状态位STA1,STA0判断(读写指令和读写数据)*/
{CSLCD;while((LCMCW&0x03)!= 0x03);}
//void fnST2(void) /* 状态位ST2判断(数据自动读状态)*/
//{CSLCD;while((LCMCW&0x04)!= 0x04);}
void fnST3(void) /* 状态位ST3判断(数据自动写状态)*/
{CSLCD;while((LCMCW&0x08)!= 0x08);}
//void fnST6(void) /* 状态位ST6判断(屏读/屏拷贝状态)*/
//{CSLCD;while((LCMCW&0x40)!= 0x40);}
void fnPR1(uchar uPar1,uchar uPar2,uchar uCmd) /* 写双参数的指令*/
{
fnST01();
LCMDW = uPar1;
fnST01();
LCMDW = uPar2;
fnST01();
LCMCW = uCmd;
}
void fnPR11(uchar uPar1,uchar uCmd) /* 写单参数的指令*/
{
fnST01();
LCMDW = uPar1;
fnST01();
LCMCW = uCmd; //GLC0925
}
void fnPR12(uchar uCmd) /* 写无参数的指令*/
{
fnST01();
LCMCW = uCmd; //GLC0925
}
void fnPR13(uchar uData) /* 写数据*/
{
fnST3();
LCMDW = uData;
}
//void fnPR2(void) /*读数据*/
//{
// fnST01();
// rddata=LCMDW;
//}
/*清屏*/
void cls(void)
{
/*uint*/uchar i=0,j=0x20;
fnPR1(0x00,0x00,0X24); /*置地址指针*/
fnPR12(0XB0); /*自动写 */
clear: fnPR13(0x0); /*写数据*/
i--;if(i!=0)goto clear;
j--;if(j!=0)goto clear;
fnPR12(0XB2); /*自动写结束*/
fnPR1(0x00,0x00,0X24); /*重置地址指针*/
}
/*LCM 初始化*/
void fnLCMInit(void)
{
fnPR1(0x00,0x00,0X40); /*文本显示区首地址*/
fnPR1(0x20,0x00,0X41); /*文本显示区宽度*/
fnPR1(0x00,0x08,0X42); /*图形显示区首地址*/
fnPR1(0x20,0x00,0X43); /*图形显示区宽度*/
fnPR12(0XA7); /*光标形状*/
fnPR12(0X80); /*显示方式设置*/
fnPR12(0X9f); /*显示开关设置*/
}
void dispchar(uchar x,uchar y,uchar gcode,uchar attr)
{
uint temp;
temp=y*0x20+x;
y=(uchar)(temp%256);
x=(uchar)(temp/256);
fnPR1(y,x,0x24);
fnPR11(gcode,0xc4);
x=x+8;
fnPR11(x,0x24);
attr=attr;
// fnPR11(attr,0xc4);
}
void dispch(uint high,uint low)
{
uint temp,i;
uchar j,x,y;
x=xx;y=yy;
// address=(high-0xa1)*94+(low-0xa1);
address=(high-0xa2)*94+(low-0xa1);
address=address*32;
for(i=0;i<32;i++){dispchk[i]=F29040read();address++;}
// temp=y*0x20+x;
// x=(uchar)(temp&0x00ff);
// y=(uchar)(temp>>8);
// y+=8;
x=0;y=8;
i=0;
for(j=0;j<2;j++)
{fnPR1(x,y,0x24);
fnPR11(dispchk[i],0xc0);
fnPR11(dispchk[i+2],0xc0);
fnPR11(dispchk[i+4],0xc0);
fnPR11(dispchk[i+6],0xc0);
fnPR11(dispchk[i+8],0xc0);
fnPR11(dispchk[i+10],0xc0);
fnPR11(dispchk[i+12],0xc0);
fnPR11(dispchk[i+14],0xc0);
fnPR11(dispchk[i+16],0xc0);
fnPR11(dispchk[i+18],0xc0);
fnPR11(dispchk[i+20],0xc0);
fnPR11(dispchk[i+22],0xc0);
fnPR11(dispchk[i+24],0xc0);
fnPR11(dispchk[i+26],0xc0);
fnPR11(dispchk[i+28],0xc0);
fnPR11(dispchk[i+30],0xc0);
i+=2;
CY=0;
x+=0x20;
y+=(uchar)(CY);
}
glcx=x;glcy=y;
xx+=2;
if(xx>28){yy+=16;xx=0;}
if(yy>112)yy=0;
}
void sysinit()
{
fnLCMInit();
cls();
/*设置波特率产生*/
RCAP2L=0xDC; /*11.0592MHz 计数初值FFDC可得到9600的波特率*/
RCAP2H=0xFF;
TL2=0xDC;
TH2=0xFF;
T2CON=52;
SCON=0x50;
ES=1;
TH0=0x00;
TL0=0x00;
IP=0;
ET0=1;
TMOD=0x1;
EA=1;
TR0=1;
P14=0;
}
void F29040reset()
{XBYTE[0000]=flashreset;/*块的任意地址写入0XF0都会初始化块*/
}
void selectpage() /*给出一个地址,自动送出页面地址,且返回页内偏移地址*/
{
lowaddress=(unsigned int)(address&0xFFFF);
page=(uchar)(address>>16);
switch(page)
{/*********选择第一块29F040即512B**/
case 0x0: CS512B;A18=0;A17=0;A16=0;break;
case 0x1: CS512B;A18=0;A17=0;A16=1;break;
case 0x2: CS512B;A18=0;A17=1;A16=0;break;
case 0x3: CS512B;A18=0;A17=1;A16=1;break;
case 0x4: CS512B;A18=1;A17=0;A16=0;break;
case 0x5: CS512B;A18=1;A17=0;A16=1;break;
case 0x6: CS512B;A18=1;A17=1;A16=0;break;
case 0x7: CS512B;A18=1;A17=1;A16=1;break;
/*********选择第二块29F040即512A**/
case 0x8: CS512A;A18=0;A17=0;A16=0;break;
case 0x9: CS512A;A18=0;A17=0;A16=1;break;
case 0xA: CS512A;A18=0;A17=1;A16=0;break;
case 0XB: CS512A;A18=0;A17=1;A16=1;break;
case 0XC: CS512A;A18=1;A17=0;A16=0;break;
case 0XD: CS512A;A18=1;A17=0;A16=1;break;
case 0XE: CS512A;A18=1;A17=1;A16=0;break;
case 0XF: CS512A;A18=1;A17=1;A16=1;break;
}
}
unsigned char F29040read() /*向flash读一个字节,写入之前请调用F29040_reset*/
{
unsigned char ret;
//F29040reset();
selectpage();
F29040reset();
ret=XBYTE[lowaddress];
return(ret);
}//END
void main()
{unsigned int t;
unsigned char i,j;
CSLCD;
delay_time(50);
sysinit();
i=0xb0;
dispch(0xb0,0xb1);
//for(j=0;j<1;j++){dispch(0xA3,i);i++;if(i>0xb9)i=0xb0;}
SBUF=0X66;
LOOP://if(flag_ful){flag_ful=0;
// t=uart[0]+uart[1]+uart[2]+uart[3]+uart[4];
// if(t==0x04fb)cls();
// else{if(uart[3]==0xFF)dispchar(uart[1],uart[2],uart[4],0x00);/*显示字符*/
// if(uart[3]==0xFE)fnPR1(uart[1],uart[2],0x21);/*光标置位*/
// if(uart[3]==0xFD)P17=~P17;
// if(uart[3]==0xFC)P17=0;
// if(uart[3]<0xF8)dispch(uart[1],uart[2],uart[3],uart[4]);
// }
// SBUF=0X66;
// }
goto LOOP;
}
void ct0() interrupt 1 using 1 /*每1ms采集一次传感器数据*/
{
TH0=0x00;
TL0=0x00;
P34=!P34;
TR0=1;
if(fengming<10)fengming++;
if(fengming>5)P14=1;
}
void s() interrupt 4 using 2
{
if(RI){RI=0;
if(ut==0){if(SBUF==0XFF){uart[ut]=0xFF;ut++;}}
else {uart[ut]=SBUF; ut++;
if(ut==5){ut=0;flag_ful=1;}
}
}
if(TI)TI=0;
}
void delay_time(uint delay) /* 延时子程序,基本延时单元为1ms */
{ /* 该程序段能完成延时delay个ms */
uint j;
uchar i;
for (j=0;j<delay;j++)
for (i=0;i<125;i++); /* 一个基本延时单元 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -