{ unsigned char i=250; //延时 while(i--);
SelectScreen(0);
SetOnOff(0); //关显示 //ClearScreen(0);//清屏 SelectScreen(0);
SetOnOff(1); //开显示 SelectScreen(0);
SetStartLine(0); //开始行:0 }
//8*8汉字显示函数
void z88(unsigned char lin,unsigned char column,unsigned char *w, unsigned int address) { unsigned char i;
if(column>16) {return;}
if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上 ,每列一个字节 else {
SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上 column=column & 0x07; //防止越界 }
SetLine(lin);
SetColumn(column<<3);//colum×8 0-64 for(i=0;i<8;i++) WriteByte(w[address+i]); }
//8*16汉字显示函数
void z816(unsigned char lin,unsigned char column,unsigned char *p,unsigned int m) {
lin=lin<<1;
z88(lin,column,p,m*16);
z88(lin+1,column,p,m*16+8); }
//16×16汉字显示函数
void z1616(unsigned char lin,unsigned char column,unsigned char *p,unsigned int m) //lin(页)=16,8格=column(列,不是y),m为第几个汉字,所有汉字的字模都写在一个数组中。 {
lin=lin<<1; //lin*2,一个汉字占两页 z88(lin,column,p,m*32);
z88(lin,column+1,p,m*32+8); z88(lin+1,column,p,m*32+16); z88(lin+1,column+1,p,m*32+24); }
//单总线温度读取
void ds18s20readtemperature(void)
{
char temp_lsb,temp_msb; char ctemperature; z1616(1,0,a,0); z1616(1,2,a,1); z1616(1,8,a,9); z816(1,4,b,13); ds18s20reset();
ds18s20writebyte(0xcc); ds18s20writebyte(0x44); ds18s20delay(5); ds18s20reset();
ds18s20writebyte(0xcc); ds18s20writebyte(0xbe); ds18s20delay(5);
temp_lsb=ds18s20readbyte(); temp_msb=ds18s20readbyte(); if(temp_msb==0) {
temp_lsb>>=1; z816(1,5,b,16); } else {
z816(1,5,b,15);
ctemperature=temp_lsb=((-1)*temp_lsb); temp_lsb>>=1; }
ctemperature=temp_lsb; ctemperature/=10;
z816(1,6,b,ctemperature); temp_lsb%=10;
z816(1,7,b,temp_lsb); }
//时钟读秒寄存器 uchar dumiaojicunqqi() {
uchar d;
writebyteds1302(0xbf); d=readbyteds1302(); resetds1302(); return(d); }
//时钟寄存器内容显示函数 void ds1302display() {
uchar sec,min,hrs,c; z1616(0,0,a,2); z1616(0,2,a,3); z816(0,4,b,13); z816(0,7,b,13); z816(0,10,b,13); resetds1302();
writebyteds1302(0xbf); sec=readbyteds1302(); c=sec&0x0f; z816(0,12,b,c); c=(sec&0x70); c>>=4;
z816(0,11,b,c);
min=readbyteds1302(); c=min&0x0f; z816(0,9,b,c); c=(min&0x70); c>>=4;
z816(0,8,b,c);
hrs=readbyteds1302(); c=hrs&0x0f; z816(0,6,b,c); c=(hrs&0x30); c>>=4;
z816(0,5,b,c); resetds1302(); }
//读秒的低4位
uchar shizhongdumiao() {
uchar sec; resetds1302();
writebyteds1302(0xbf); sec=readbyteds1302(); resetds1302(); sec&=0x0f; return(sec); }
//速度
float sudu()
{
float a; TR0=0; a=TL0; TL0=0; TR0=1;
a*=1.1304;//0.314*3.6km/h return(a); }
//显示速度
void xianshisudu(float e) {
unsigned int c,d,f; z1616(2,0,a,4); z1616(2,2,a,1); z816(2,4,b,13); z816(2,7,b,14); z816(2,9,b,17); z816(2,10,b,10); z816(2,11,b,12); z816(2,12,b,18); e*=10; f=d=c=e; c/=100;//十位 z816(2,5,b,c); d%=100; d/=10;
z816(2,6,b,d); f%=10;
z816(2,8,b,f); }
//显示里程
void xianshilicheng(float i) {
unsigned long int c,d,e,f,g,h; z1616(3,0,a,5); z1616(3,2,a,6); z816(3,4,b,13); z816(3,11,b,10); c=d=e=f=g=h=i; h/=100000; c%=10000; c/=10000; d%=10000;
d/=1000; e%=1000; e/=100; f%=100; f/=10; g%=10;
z816(3,5,b,h); z816(3,6,b,c); z816(3,7,b,d); z816(3,8,b,e); z816(3,9,b,f); z816(3,10,b,g); }
//外部中断函数,按键就中断
void anjianzhuanhuan() interrupt 0 {
qq=(!qq); }
//串口中断 ,接收计算机传过来的数据 void chuanko() interrupt 4 {
while(RI==0); pp=SBUF; RI=0;
if(pp==8)//如果传过来的为8,则关串口中断 ES=0; }
//主函数 void main() {
uchar i=0,m,q,*p,o=0; unsigned int n=0x0000; float j,k,l; union {
uchar chbuf[4];
float fbuf;
}floa_data;
P3=0xff; IT0=1; EX0=1; EA=1;