*********************************************************************/ #include //包含头文件 #include //直接访问8051不同存储区的宏定义 #include "anstdio.h" // #include //数学文件 #include //编译器产生产生固有代码如_NOP_ //液晶采用的是128×64点阵,大汉字16×16,小字母6×8【行列】一行能显示8个汉字和21个小字母 #define LCDWC ((char xdata *) 0xC004) // 定义液晶WC的起始地址 #define LCDWD ((char xdata *) 0xC005) //定义液晶WD的起始地址 #define LCDRS ((char xdata *) 0xC006) //定义液晶RS的起始地址 #define LCDRD ((char xdata *) 0xC007) //定义液晶RD的起始地址 sbit a0=ACC^0; //定义ACC的位,利用ACC操作速度最快 const char code clrstr[]={0x20,0x20,0x20,0x20,0x20, // 清屏OX20是空格 0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0};//16个空格 extern bit modify; //修改状态位 extern char xdata daa[6]; //光标修改缓冲区 extern char xdata CurX,CurY; //光标位置 unsigned char read_status(char k) //读取状态///// return LCDRS[k*4]; //每位有4个字节 } void write_command(unsigned char c,char k) //写入命令// /////////////// { LCDWC[k*4]=c;//每位有4个字节 } void chk_busy(void) //检查空闲// /// { unsigned char c; while(ACC=(read_status(0)&0xf0))//LCDRS(0)&11110000? { ACC&=0x20;//0010 0000 OX20是空格 if (ACC)//ACC=1 write_command(0x3f,0);//把问号写在LCDRS(0)? } while(c=(read_status(1)&0xf0))//LCDRS(4)&11110000? { if ((c&0x20)!=0) write_command(0x3f,1);//把问号写在LCDRS(4) } } unsigned char read_data(char k) //读取数据// ////// { chk_busy(); return LCDRD[k/64*4];//为什么是64 } void write_data(unsigned char c,char k) //写数据// //// { chk_busy(); LCDWD[k/64*4]=c; } void write_col(unsigned char y) //写入控制// ///////////// { chk_busy(); if (y<64) { write_command(0x40+y,0); write_command(0x40,1); } else//Y》=64 { write_command(0x40,0); write_command(0x40+y%64,1); } } extern void wchar(aa,line,lum) //大写字符串输出// ///////// unsigned char aa,line,lum; { unsigned char i,j,k,x,y; unsigned char code *pos; chk_busy(); x=line*2; if ((aa&0x80)==0) { pos=chzmk+(int)(aa-0x20)*16; k=8; } else { pos=cczmk+(int)(aa&0x7f)*32; k=16; } for (i=0;i<2;i++) { write_command(0xb8+x,0); write_command(0xb8+x,1); x++; y=(lum*8)%128; write_col(y); for (j=0;j14) { if (((c&0x80)!=0)||(y>15)) { y=0; x++; } } } } extern void putch(c,x,y) //小字符输出// ////// unsigned char c,x,y; { unsigned char i,col; unsigned char code *pos; chk_busy(); write_command(0xb8+x,0); write_command(0xb8+x,1); col=(y*6)%128; write_col(col); pos=lcdot+(int)(c-0x20)*6; for (i=0;i<6;i++) write_data(*pos++,col++); } extern void dissmall(str,x,y) //小写输出// //////////// unsigned char *str,x,y; { char c,i; i=0; while (1) { c=str[i++]; if (c==0)break; putch(c,x,y); y++; if (y>20) { y=0; x++; } } } extern void clrscr(char k) //清屏// /////// { char i; for (i=k;i<4;i++)//四行 wchst(clrstr,i,0);//大写输出 } extern void initlcd() //初始化液晶// ////////////// { LCDWC[0]=0x3F; LCDWC[4]=0x3F; chk_busy(); LCDWC[0]=0xC0; chk_busy(); LCDWC[4]=0xC0; } extern void curonoff(x,y,mode) //光标的状态// /////////// char x,y; bit mode; { char i,j,col; j=x*2+1; chk_busy(); write_command(0xb8+j,0); write_command(0xb8+j,1); col=(y*8)%128; write_col(col); read_data(col); for (i=0;i<4;i++) daa[i]=read_data(col++)&0x3f; col-=4; chk_busy(); write_command(0xb8+j,0); write_command(0xb8+j,1); write_col(col); for (i=0;i<4;i++) { if (mode) write_data(daa[i]|0xc0,col++); else write_data(daa[i],col++); } } extern void MovCur(x,y) //移动光标// //////////// char x,y; { curonoff(CurX,CurY,0); CurX=x%4; CurY=y%16; curonoff(CurX,CurY,1); } extern void curonoff1(x,y,mode)//小光标闪烁 /////////////// char x,y; bit mode; { char i,col; col=(y*6)%128; chk_busy(); write_command(0xb8+x,0); write_command(0xb8+x,1); write_col(col); read_data(col); for (i=0;i<4;i++) daa[i]=read_data(col++)&0x7f; col-=4; chk_busy(); write_command(0xb8+x,0); write_command(0xb8+x,1); write_col(col); for (i=0;i<4;i++) { if (mode) write_data(daa[i]|0x80,col++); else write_data(daa[i],col++); } } extern void movcur1(x,y) //移动小光标// ////////////// char x,y; { curonoff1(CurX,CurY,0); CurX=x%8; CurY=y%21; curonoff1(CurX,CurY,1); } extern void scroline(numline) //大滚屏// ////// //////// unsigned char numline; { unsigned char xdata datar[64]; unsigned char i,j,k,l,n; n=numline; for (k=0;k1;l--) { chk_busy(); LCDWC[4*i]=0x40; chk_busy(); LCDWC[4*i]=0xB8+l; chk_busy(); LCDWC[4*i]=0xC0; chk_busy(); datar[0]=LCDRD[4*i]; for (j=0;j<64;j++) { chk_busy(); datar[j]=LCDRD[4*i]; } chk_busy(); LCDWC[4*i]=0x40; chk_busy(); LCDWC[4*i]=0xB8+l+1; chk_busy(); LCDWC[4*i]=0xC0; for (j=0;j<64;j++) { chk_busy(); LCDWD[4*i]=datar[j]; } } } } /* extern void jbsqt(float x[],float y[],char n,float a[]) { char i; float xdata xx,yy,e,f,q,u,p; xx=yy=0.0; for (i=0;i<=n-1;i++) { xx=xx+x[i]/n; yy=yy+y[i]/n; } e=0.0;f=0.0;u=0.0; for (i=0;i<=n-1;i++) { q=x[i]-xx; e=e+q*q; p=y[i]-yy; u=u+p*p; f=f+q*(y[i]-yy); } a[0]=f/e; a[1]=yy-a[0]*xx; a[2]=f/sqrt(e*u); return; }*/