|
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*定义1602读写使能端口*/
- sbit rw=P2^1;
- sbit rs=P2^0;
- sbit en=P2^2;
- sbit b=P0^7;
- sbit gl=P1^0;
- void lcd_init(); //lcd设置函数
- void wr_com(uchar command); //命令函数
- void wr_data(uchar data0); //数据函数
- void lcd_clear(); //清屏函数
- void lcd_set(); //屏幕设置函数
- void busy(); //测忙函数
- void display(); //启动前显示函数
- void printstring(uchar *s);
- void display1(); //启动后显示函数
- void key1(); //启动前按键
- sbit K=P3^0;
- sbit K1=P3^1;
- sbit K2=P3^5; //开始计价
- sbit K3=P3^3; //模式选择(行程/等待)
- sbit K4=P3^4; //复位
- sbit g=P2^7;
- sbit aa=P2^3; //运行
- sbit bb=P2^4; //等待
- sbit cc=P2^5; //暂停
- //sbit led_run=P3^0;
- //sbit led_await=P3^1;
- //sbit led_stop=P3^2;
- bit f_start;
- bit jump_in;
- bit jump_out;
- void key(); //启动后按键
- /*定义液晶显示地址数组*/
- uchar codetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x70};
- uchar dispbuf[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uchar dispbuf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uchar v,v1;
- uchar i,m=0;
- void init();
- void chuli();
- void chuli1();
- void delay(uchar t); //延时函数
- void clear(); //终止函数
- void set(uchar x);
- void set1(uchar y);
- uchar command;
- uchar count,count1;
- uchar second,minite,second1,minite1;
- unsigned int tt,tt1;
- unsigned char value1=70,value2=17,value3=15; //value1=起步价,value2=超出每公里价格,value3=等待价格
- unsigned int money;
- void main()
- {
- // Init_Timer1(); //定时器中断函数
- EX0=1;//开外部中断0
- IT0=1;//采用跳变沿触发方式
-
- init();
- lcd_init();
- while(1)
- {
- key1();
- chuli();
- display();
- if(jump_in==1)
- {
- jump_in=0;
- lcd_init();
- while(1)
- {
- key();
- chuli1();
- display1();
- if(jump_out==1)
- {
- lcd_init();
- jump_out=0;
- clear();
- break;
- }
- }
- }
- }
- }
- void clear(){
- TR0=0;
- TR1=0;
- money=0;
- second=0;
- second1=0;
- minite=0;
- minite1=0;
- value1=70;
- value2=17;
- value3=15;
- //led_run=1;
- //led_await=1;
- //led_stop=1;
- v=0;
- v1=0;
- for(i=0;i<15;i++)
- {
- dispbuf[ i]=0;[ i]
- dispbuf1[ i]=0;[ i]
- }
- m=0;
- }
- void init() //中断定时
- {
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- ET0=1;
- ET1=1;
- EA=1;
- TR0=0;
- TR1=0;
- }
- void t0_(void) interrupt 1 using 0 //中断1模式0 用来计时 秒、分
- {
- count++;
- if(count==20)
- {
- count=0;
- second++;
- if(second==60)
- {
- second=0;
- minite++;
- if(minite==99)
- {
- minite=0;
- }
- }
- }
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- dispbuf1[0]=m/10;
- dispbuf1[1]=m%10;
- dispbuf1[2]=second/10;
- dispbuf1[3]=second%10;
- }
- void t1_(void) interrupt 3 using 3 //中断3模式3用来计时 秒、分
- {
- count1++;
- if(count1==20)
- {
- count1=0;
- second1++;
- if(second1==60)
- {
- second1=0;
- minite1++;
- if(minite1==99)
- {
- minite1=0;
- }
- }
- }
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- dispbuf1[4]=minite1/10;
- dispbuf1[5]=minite1%10;
- dispbuf1[6]=second1/10;
- dispbuf1[7]=second1%10;
- }
-
- void lcd_init()
- {
- wr_com(0x3c);
- wr_com(0x06);
- wr_com(0x0c);
- wr_com(0x01);
- }
- void wr_com(uchar command) //命令
- {
- busy();
- rs=0;
- rw=0;
- P0=command;
- en=1;
- en=0;
- }
- void wr_data(uchar data0) //数据
- {
- busy();
- rs=1;
- rw=0;
- P0=data0;
- en=1;
- en=0;
- }
- void busy() //测忙函数
- {
- while(1)
- {
- en=0;
- rs=0;
- rw=1;
- P0=0xff;
- en=1;
- if(b!=1)break;
- }
- en=0;
- }
- void chuli() //分离出百位十位个位
- {
- dispbuf[0]=value1/100%10;
- dispbuf[1]=value1/10%10;
- dispbuf[2]=value1%10;
- dispbuf[3]=value2/100%10;
- dispbuf[4]=value2/10%10;
- dispbuf[5]=value2%10;
- dispbuf[6]=value3/100%10;
- dispbuf[7]=value3/10%10;
- dispbuf[8]=value3%10;
- }
- void display() //初始显示函数
- {
- set(0);
- printstring("step :");
- wr_data(table[dispbuf[0]]);
- wr_data(table[dispbuf[1]]);
- printstring(".");
- wr_data(table[dispbuf[2]]);
- set(16);
- printstring("mileage :");
- wr_data(table[dispbuf[3]]);
- wr_data(table[dispbuf[4]]);
- printstring(".");
- wr_data(table[dispbuf[5]]);
- set1(0);
- printstring("await:");
- wr_data(table[dispbuf[6]]);
- wr_data(table[dispbuf[7]]);
- printstring(".");
- wr_data(table[dispbuf[8]]);
- set1(16);
- printstring("run : ");
- wr_data(table[dispbuf1[0]]);
- wr_data(table[dispbuf1[1]]);
- printstring(":");
- wr_data(table[dispbuf1[2]]);
- wr_data(table[dispbuf1[3]]);
- }
- void chuli1()
- {
- if(f_start==1)
- {
- tt=minite*60+second;
- tt1=minite1;
- if(m<=3)
- {money=value1+value3*tt1;}
- if(m>3)
- {money=value1+value2*(m-3)+value3*tt1;}
- }
- elseif(f_start==0)
- {
- money=0;
- }
- dispbuf1[8]=money/100%10;
- dispbuf1[9]=money/10%10;
- dispbuf1[10]=money%10;
- }
- void display1() //运行后显示函数
- {
- set(0);
- printstring("run: ");
- // wr_data(table[m]);
- wr_data(table[dispbuf1[0]]);
- wr_data(table[dispbuf1[1]]);
- // printstring(":");
- // wr_data(table[dispbuf1[2]]);
- // wr_data(table[dispbuf1[3]]);
- set(14);
- printstring("await:");
- wr_data(table[dispbuf1[4]]);
- wr_data(table[dispbuf1[5]]);
- printstring(":");
- wr_data(table[dispbuf1[6]]);
- wr_data(table[dispbuf1[7]]);
- set1(0);
- printstring("sum is: ");
- wr_data(table[dispbuf1[8]]);
- wr_data(table[dispbuf1[9]]);
- printstring(".");
- wr_data(table[dispbuf1[10]]);
- }
- void printstring(uchar *s) //输出显示函数
- {
- while(*s)
- wr_data(*s++);
- }
- void key() //启动按键
- {
- if(K3==0)
- {
- delay(50); //延时消抖动
- if(K3==0)
- {
- while(K3==0);
- v1++;
- if(v1==4) v1=1;
- }
- }
- switch(v1)
- {
- case1:f_start=1;TR0=1;TR1=0;/*led_run=0;led_await=1;led_stop=1*/;aa=0;bb=1;cc=1;break; //运行
- case2:TR0=0;TR1=1;/*led_run=1;led_await=0;led_stop=1*/;aa=1;bb=0;cc=1;break; //等待
- case3:TR0=0;TR1=0;/*led_run=1;led_await=1;led_stop=0*/;aa=1;bb=1;cc=0;break; //暂停
- }
- if(K4==0) //跳出运行
- {
- delay(50);
- if(K4==0)
- {
- while(K4==0);
- jump_out=1;
- }
- }
- }
- void delay(uchar t)
- {
- while(--t);
- }
- void set(uchar x)
- {
- command=0x80+x;
- wr_com(command);
- }
- void set1(uchar y)
- {
- command=0xc0+y;
- wr_com(command);
- }
- void key1() //初始调节按键
- {
- if(K==0)
- {
- delay(100);
- if(K==0)
- {
- while(K==0);
- v++;
- if(v==4) v=0;
- }
- }
- switch(v)
- {
- case 0:break;
- case1:if(K1==0){while(K1==0);value1=value1+10;}break;
- case 2:if(K1==0){while(K1==0);value2=value2+5;}break;
- case3:if(K1==0){while(K1==0);value3=value3+5;}break; }
- if(K2==0)
- {
- delay(50);
- if(K2==0)
- {
- while(K2==0);
- jump_in=1;
- }
- }
- }
- void mode( ) interrupt 0 //外部中断0控制选位
- {
- m++;
- }
复制代码
|
|