📄 chengxu.c
字号:
#include<reg52.h>
#include<head.h>
/************************************************************/
void main()
{
init(); //系统初始化
settime();//设置时间
TR0=1;//开定时器中断
for(;;)
{
time_update();//时间更新
x=key_board();//扫描键盘
function_key(x);//判断键值
lucheng_update();//里程更新
full_day_info();//显示总共里程以及停车次数
space_update();//速度更新
}
}
/************************************************************/
void chushihua(void) //1602初始化
{ date = 0;
xiem(0x38,0);
delay(20);
xiem(0x38,0);
delay(20);
xiem(0x38,0);
delay(20) ;
xiem(0x38,1);
xiem(0x08,1);
xiem(0x01,1);
xiem(0x06,1);
xiem(0x0C,1);
}
/************************************************************/
void init(void) //系统初始化
{
chushihua();
dingshichushihua();
xiestring(10,0,time_chushihua);
xiechar(0,0,codee[12]);
xiechar(1,0,codee[10]);
xiechar(4,0,codee[0]);
xiechar(5,0,codee[10]);
xiechar(6,0,codee[0]); //显示速度
/***********************************/
xiechar(0,1,codee[14]);
xiechar(1,1,codee[12]);
xiechar(2,1,codee[13]);
xiechar(6,1,codee[(uint)((xiao_lucheng-(uint)xiao_lucheng)*10)]);
xiechar(5,1,codee[10]);
xiechar(4,1,codee[(uint)(xiao_lucheng)%10]);
if((uint)(xiao_lucheng)/10!=0)
xiechar(3,1,codee[(uint)(xiao_lucheng)/10]);//显示当前低于1公里的路程
}
/************************************************************/
void settime(void)
{
uchar i=0,j=0;
uchar time[4]={10,11,13,14};
for(;;)
{RXD=0;for(;;)
{ x=key_board();
if((x!=3)&&(x!=7)&&(x!=11)&&(x!=12)&&(x!=14)&&(x!=15))//注意\\和&&之间的区别
{
function_key(x);
if(key==10)break;
xiechar(time[i++],0,codee[key]);delay(100);
if(i==1)hour+=key*10;
if(i==2)hour+=key;
if(i==3)minute+=key*10;
if(i==4)minute+=key;
if(i==4)i=0;
}
if(x==12)
{
xiestring(10,0,time_chushihua);
i=0;hour=0;minute=0;
}
if(x==15)break;
}
if(x==15)break;
}
}
/************************************************************/
void xies(uint pp0)
{duz();rs=1;rw=0;date=pp0;e=0;e=0;e=1;}
/************************************************************/
void xiechar(uint x,uint y,uchar zifu)
{y&=0x01;x&=0x1f;
if (y) x |= 0x40;
x |= 0x80;
xiem(x,0);xies(zifu) ;
}
/************************************************************/
void xiem(uint pp0,uint busy)reentrant
{
if(busy) duz();date=pp0;
rs=0;rw=0;
e=0;e=0;e=1;
}
/************************************************************/
uint duz(void)
{
uint st;
date=0;rs=0;rw=1;e=0;delay(20);e=1;
st=((date)&(0x80));while (st);return date;
}
/************************************************************/
void xiestring(unsigned int x,unsigned int y,unsigned char *string) //向1602写字符串
{ unsigned char len;
len = 0;
y &= 0x1;
x &= 0xF;
while (string[len]!='\0')
{
if (x <0xF)
{
xiechar(x, y, string[len]);
len++;
x++;
}
else {y=1;x=0;}
}
}
/************************************************************/
void delay(uint i) //延时程序
{uint j;
for(;i>0;i--)
for(j=300;j>0;j--);}
/************************************************************/
void dingshichushihua() //中断初始化
{
EA=1;IT0=1;
ET0=1;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256; //产生50ms
TMOD=0X01;
}
/************************************************************/
void time(void)interrupt 1//定时中断子函数
{u++;
time_for++;
if(u==1200){u=0;minute++;}//1分钟到
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
}
/************************************************************/
uchar key_board(void)//非常完善的键盘程序,可以满足现在键盘的所有要求!!!
{
uchar a,b,c,d,m,i=0,keyb,tab[4]={0x7f,0xbf,0xdf,0xef};
uint j;a=0x7f;
if(tt==1)
{
P2=P2&0x0f;
if(P2!=0x0f)goto tiaochu;
}
tt=0;
for(;;)
{
P2=a;a=P2;b=a;c=a;
b=b&0x0f;c=c&0x0f;
if(b==0x0f)
{for(j=0;j<500;j++)
{ P2=a;a=P2;d=a;d=d&0x0f;
if( d!=0x0f)
{ if(d==0x0e)m=0;if(d==0x0d)m=4;if(d==0x0b)m=8;if(d==0x07)m=12;tt=1;
goto lable;
}
i++;a=tab[i];if(i==4){i=0;a=0x7f; }
}
tiaochu:keyb=17;return(keyb);break;
}
else
{if(c==0x0e)m=0;if(c==0x0d)m=4;if(c==0x0b)m=8;if(c==0x07)m=12;tt=1;
lable:keyb=m+3-i;return(keyb);
break;
}
}
}
/************************************************************/
void function_key(uchar m)
{
switch(m)
{
case 0:key=7;break;
case 1:key=8;break;
case 2:key=9;break;
case 3:get_bus();break;//开车
case 4:key=4;break;
case 5:key=5;break;
case 6:key=6;break;
case 7:out_bus();break;//停车
case 8:key=1;break;
case 9:key=2;break;
case 10:key=3;break;
case 11:break;
case 12:break;
case 13:key=0;break;
case 15:break;
case 17:key=10;break;
default:break;
}
}
/************************************************************/
/************************************************************/
void time_update(void)//时间更新
{
if(minute==60){hour++;minute=0;}
if(hour==24){hour=0;minute=0;}
xiechar(14,0,codee[minute%10]);
xiechar(13,0,codee[minute/10]);
xiechar(11,0,codee[hour%10]);
xiechar(10,0,codee[hour/10]);
}
/************************************************************/
void get_bus(void) //开车
{
EX0=1;//开外部中断开始计路程
waibu_cishu=0;
}
/************************************************************/
void out_bus(void)//停车
{
int m_s,n_s;
EX0=0; //关外部中断停止计路程
m_s=(uint)xiao_lucheng;
n_s=(uint)((xiao_lucheng-m_s)*10);
tingche_cishu++;//停车次数自动加一
}
/************************************************************/
void waibu1(void)interrupt 0 //外部中断子函数
{
TR0=0;
waibu_cishu++;
sk=1;
xiao_lucheng+=((double)1/10);
if(xiao_lucheng==10)
{xiao_lucheng=0.0;full_lucheng++;}
TR0=1;
}
/************************************************************/
void lucheng_update(void)//10以下路程
{
int m_s,n_s;
m_s=(uint)xiao_lucheng;//取整数部分
n_s=(uint)((xiao_lucheng-m_s)*10);//取小数部分
xiechar(6,1,codee[n_s]);
xiechar(4,1,codee[m_s%10]);
if(m_s/10!=0)
xiechar(3,1,codee[m_s/10]);
}
/************************************************************/
void full_day_info(void) //整个路程和停车次数的信息
{
if(full_lucheng/1000!=0)
xiechar(8,1,codee[full_lucheng/1000]);
if(full_lucheng/100%10!=0)
xiechar(9,1,codee[full_lucheng/100%10]);
if(full_lucheng%100/10!=0)
xiechar(10,1,codee[full_lucheng%100/10]);
xiechar(11,1,codee[full_lucheng%10]);
if(tingche_cishu/10!=0)
xiechar(13,1,codee[tingche_cishu/10]);
xiechar(14,1,codee[tingche_cishu%10]);
}
/************************************************************/
void space_update(void) //速度更新
{
if(sk==1)
{zheng_space=36*20/time_for;//计算速度的整数部分
float_space=((36*20%time_for)*10)/time_for;//计算速度的小数部分
xiechar(6,0,codee[float_space]);
xiechar(2,0,codee[zheng_space/100]);
xiechar(3,0,codee[zheng_space/10%10]);
xiechar(4,0,codee[zheng_space%10]);
sk=0;time_for=0; }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -