哪位高手帮我看懂十二页的代码,主要问题是要用C语言在At89s52单片机上实现对自行车行驶时的路程和速度的显示,这里有用C语言写好的代码,前面还有一些1602LCD的一些输入,不是太能看懂,那位高手能帮我看懂具体的流程,然后能告诉我路程的输出到LCD上的具体的过程,要描述出在经过每个函数的及重要函数参数的过程和作用,最好详细点,分数不够我再加,谢谢各位高手了,程序比较长,分为几部分给出了在线等。
#include
#define uchar unsigned char
/****************************************************************
引脚定义:
P20=SW1 时钟设置时更改“时”,直径设置时更改十位
P21=SW2 时钟设置时更改“分”的十位,直径设置时更改个位
P22=SW3 时钟设置时更改“分”的个位
P23=Enter 确认更改设置
P32=Disp 正常工作时更改显示模式
****************************************************************************/
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P32=P3^2;
sbit RS=P3^7;
sbit RW=P3^6;
sbit E=P3^5;
sbit busy=P1^7;
/****************************************************************
变量定义:
i 延时变量
qsls 圈数临时变量,用于判断里程显示选用m还是km作为单位
qs 圈数
sj 累计行驶时间,单位为秒
totallc 累计里程
pjsd 平均速度
ssji 定时器T1 20ms中断次数,用于计算速度等
sji 本次速度对应的20ms中断次数
sjiold 上次速度对应的20ms中断次数
aa 加速度
sd2 当前速度
mxsd 用于更新最大速度
mxsd2 最大速度对应的20ms次数
tc 轮胎周长
*s 字符串显示子程序字符指针
line 字符串显示子程序列数
row 字符串显示子程序行数
com 写控制字
dat 显示码字
gw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的个位
sw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的十位
bw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的百位
qw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的千位
ww 累计里程、累计时间的万位
sww 累计里程、累计时间的十万位
ssj 定时器T0 50ms中断次数,每20次sj加1
cgw 当前时间(时钟)的个位
csw 当前时间(时钟)的十位
cbw 当前时间(时钟)的百位
cqw 当前时间(时钟)的千位
cww 当前时间(时钟)的万位
csww 当前时间(时钟)的十万位
cww2 当前时间(时钟)的辅助万位
MODE 显示模式
tr1 轮胎设置变量1(十位)
tr2 轮胎设置变量2(个位)
****************************************************************************/
unsigned int i,qsls;
unsigned long qs,sj,totallc,pjsd,ssji,sji,sjiold,aa,sd2,mxsd,mxsd2,tc;
uchar *s,line,row,com,dat,gw,sw,bw,qw,ww,sww,ssj,cgw,csw,cbw,cqw,cww,csww,cww2,MODE,tr1,tr2;
/***********************************void wait()*****************************
该函数的作用是对LCD进行检测,看LCD是否处于忙的状态.当bflag=1时表示忙,
此时不可以向LCD进行读写操作.而当busy=0时,表示可以向它读写数据.
****************************************************************************/
void wait()
{P1=0xff;
RW=1; RS=0;
do{E=0;E=1;}while(busy==1);
}
/**************************************void dispone()*******************************
该函数的作用是向LCD写入数据并显示出来.
***********************************************************************************/
void dispone(dat)
{P1=dat;
RW=0; RS=1;
E=0; E=1;
wait();
}
/**********************************void wrcom()*******************************
该函数的作用是向LCD写入控制字.
******************************************************************************/
void wrcom(com)
{P1=com;
RW=0; RS=0;
E=0; E=1;
wait();
}
/***************************************void init_LCD()*******************************
该函数的作用是初始化LCD.
*****************************************************************************************/
void init_LCD()
{wrcom(0x01);
wrcom(0x06);
wrcom(0x38);
wrcom(0x0c);
}
/****************************************void dispmore()********************************
该函数的作用是向LCD写入一串数据,并把数据串显示出来.
******************************************************************************************/
void dispmore(line,row,uchar dat[],i) //格式为dispmore(第几行,第几列,开始要显示的字符地址,显示几个字符);
{uchar com;
s=dat;
if(line==1)
{com=0x80+row-1;
wrcom(com);
while((i--)!=0&&com<=0x8f)
{dispone(*s);
com++;
s++;
}
}
else
{com=0xc0+row-1;
wrcom(com);
while((i--)!=0&&com<=0xcf)
{dispone(*s);
com++;
s++;
}
}
}
/****************************************void ttimep()********************************
累计行驶时间数据处理及显示子程序
******************************************************************************************/
void ttimep()
{
sww=sj/36000;
ww=sj%36000/3600;
qw=sj%3600/600;
bw=sj%600/60;
sw=sj%60/10;
gw=sj%10;
wrcom(0xc1);
dispone('T');
dispone('i');
dispone('m');
dispone('e');
dispone(' ');
dispone(' ');
dispone(sww+0x30);
dispone(ww+0x30);
dispone(':');
dispone(qw+0x30);
dispone(bw+0x30);
dispone(':');
dispone(sw+0x30);
dispone(gw+0x30);
}