附录 系统程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0 //数据口
#define delay_msNOP(); {_nop_();_nop_();_nop_();_nop_();};
sbit lcdrs=P2^7;
sbit lcdrw=P2^6;
sbit lcden=P2^5;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
sbit ledr=P2^4;
sbit ledg=P2^3;
sbit beep=P2^0;
int t0,s1num,t1,shur;
uchar code str1[]="speed:000km/h";
uchar code str2[]="max:000km/h";
uint tmp1,pinlv;
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--); //延时函数 //定义IO 口
}
void Check_Busy()
{
lcdrs=0;
lcdrw=1;
lcden=1;
P0=0xff;
while((P0&0x80)==0x80);//忙则等待 lcden=0;
}
void write_com(uchar cmd) //写命令 {
Check_Busy(); //LCD1602忙检测
lcdrs = 0;
lcdrw = 0;
LCD_data = cmd; lcden = 1;
delay_msNOP();
lcden = 0;
}
void write_date(uchar dat) //写数据 {
Check_Busy();
lcdrs = 1;
lcdrw = 0;
LCD_data = dat;
lcden = 1; delay_msNOP();
lcden = 0;
}
void write_str(uchar *p)
{
}
void diyihang(uint z)
{
}
void dierhang(uint z)
{
}
void init_1602( )
{
delay_ms(40); //液晶初始化 z--; write_com(0x80+0x40+z); //写第二行 z--; write_com(0x80+z); //写第一行 while(*p) write_date(*p++);
write_com(0x38); //基本指令操作 delay_ms(5);
write_com(0x38); //基本指令操作 delay_ms(1);
write_com(0x0c); //显示开,关光标 delay_ms(5);
write_com(0x01); //清除LCD 的显示内容
delay_ms(5);
}
void keyscan( )
{
if(s1==0) { delay_ms(10); if(s1==0) { while(!s1); s1num++; TR0=0; if(s1num==1) { } dierhang(9); write_com(0x0f); //s1功能切换键 //按键检测 write_com(0x06); diyihang(3); write_str(str1); dierhang(3); write_str(str2); //游标自动右移,整体画面不移动 if(s1num==2) { } if(s1num==3) { } dierhang(7); dierhang(8);
} } { } s1num=1; dierhang(9); if(s2==0) { } if(s3==0) { //确定键 delay_ms(10); if(s2==0) { } while(!s2); s1num=0; write_com(0x0c); TR0=1; //加键 delay_ms(10); if(s3==0) { while(!s3); if(s1num==1) { } shur++; if(shur>=999)shur=999; write_date('0'+shur%10); dierhang(9);
} } { } if(s1num==3) { } shur+=100; if(shur>=999)shur=999; write_date('0'+shur/100); dierhang(7); shur+=10; if(shur>=999)shur=999 write_date('0'+shur%100/10); dierhang(8); if(s4==0) { //减键 delay_ms(20); if(s4==0) { while(!s4); if(s1num==1) { } if(s1num==2) { shur--; if(shur=
}
} } } if(shur=
void leddisplay()
{
//LED显示函数 if( pinlv>=shur) { } else if(pinlv
void init_time0()
{
}
void main()
{
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(t0==20) { //T0中断子程序 init_1602(); init_time0(); while(1) { } keyscan(); leddisplay(); //主函数 TMOD=0x11; //设置定时器0,1工作模式 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //开总中断 //定时器T0初始化 ET0=1;//开T0中断 TR0=1;//启动定时器T0 EX1=1;//开外部中断 IT1=1;//负跳沿触发
pinlv=tmp1;
EX1=0;
diyihang(9);
write_date('0'+pinlv/100); write_date('0'+pinlv%100/10); write_date('0'+pinlv%10); t0=0;
TR0=1;
tmp1=0;
EX1=1;
}
}
void zhongduan1() interrupt 2 {
tmp1++;
}
//INT1中断子程序
附录 系统程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0 //数据口
#define delay_msNOP(); {_nop_();_nop_();_nop_();_nop_();};
sbit lcdrs=P2^7;
sbit lcdrw=P2^6;
sbit lcden=P2^5;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
sbit ledr=P2^4;
sbit ledg=P2^3;
sbit beep=P2^0;
int t0,s1num,t1,shur;
uchar code str1[]="speed:000km/h";
uchar code str2[]="max:000km/h";
uint tmp1,pinlv;
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--); //延时函数 //定义IO 口
}
void Check_Busy()
{
lcdrs=0;
lcdrw=1;
lcden=1;
P0=0xff;
while((P0&0x80)==0x80);//忙则等待 lcden=0;
}
void write_com(uchar cmd) //写命令 {
Check_Busy(); //LCD1602忙检测
lcdrs = 0;
lcdrw = 0;
LCD_data = cmd; lcden = 1;
delay_msNOP();
lcden = 0;
}
void write_date(uchar dat) //写数据 {
Check_Busy();
lcdrs = 1;
lcdrw = 0;
LCD_data = dat;
lcden = 1; delay_msNOP();
lcden = 0;
}
void write_str(uchar *p)
{
}
void diyihang(uint z)
{
}
void dierhang(uint z)
{
}
void init_1602( )
{
delay_ms(40); //液晶初始化 z--; write_com(0x80+0x40+z); //写第二行 z--; write_com(0x80+z); //写第一行 while(*p) write_date(*p++);
write_com(0x38); //基本指令操作 delay_ms(5);
write_com(0x38); //基本指令操作 delay_ms(1);
write_com(0x0c); //显示开,关光标 delay_ms(5);
write_com(0x01); //清除LCD 的显示内容
delay_ms(5);
}
void keyscan( )
{
if(s1==0) { delay_ms(10); if(s1==0) { while(!s1); s1num++; TR0=0; if(s1num==1) { } dierhang(9); write_com(0x0f); //s1功能切换键 //按键检测 write_com(0x06); diyihang(3); write_str(str1); dierhang(3); write_str(str2); //游标自动右移,整体画面不移动 if(s1num==2) { } if(s1num==3) { } dierhang(7); dierhang(8);
} } { } s1num=1; dierhang(9); if(s2==0) { } if(s3==0) { //确定键 delay_ms(10); if(s2==0) { } while(!s2); s1num=0; write_com(0x0c); TR0=1; //加键 delay_ms(10); if(s3==0) { while(!s3); if(s1num==1) { } shur++; if(shur>=999)shur=999; write_date('0'+shur%10); dierhang(9);
} } { } if(s1num==3) { } shur+=100; if(shur>=999)shur=999; write_date('0'+shur/100); dierhang(7); shur+=10; if(shur>=999)shur=999 write_date('0'+shur%100/10); dierhang(8); if(s4==0) { //减键 delay_ms(20); if(s4==0) { while(!s4); if(s1num==1) { } if(s1num==2) { shur--; if(shur=
}
} } } if(shur=
void leddisplay()
{
//LED显示函数 if( pinlv>=shur) { } else if(pinlv
void init_time0()
{
}
void main()
{
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(t0==20) { //T0中断子程序 init_1602(); init_time0(); while(1) { } keyscan(); leddisplay(); //主函数 TMOD=0x11; //设置定时器0,1工作模式 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //开总中断 //定时器T0初始化 ET0=1;//开T0中断 TR0=1;//启动定时器T0 EX1=1;//开外部中断 IT1=1;//负跳沿触发
pinlv=tmp1;
EX1=0;
diyihang(9);
write_date('0'+pinlv/100); write_date('0'+pinlv%100/10); write_date('0'+pinlv%10); t0=0;
TR0=1;
tmp1=0;
EX1=1;
}
}
void zhongduan1() interrupt 2 {
tmp1++;
}
//INT1中断子程序