⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spjianrong.bak

📁 液晶兼容0701
💻 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 + -