📄 tlights.c
字号:
#include<reg52.h>
sfr WDT=0xC0;
sbit P0_0=0x80;
sbit P0_1=0x81;
sbit P0_2=0x82;
sbit P0_3=0x83;
sbit P0_4=0x84;
sbit P0_5=0x85;
sbit P0_6=0x86;
sbit P0_7=0x87;
sbit P2_0=0xA0;
sbit P2_1=0xA1;
sbit P2_2=0xA2;
sbit P2_3=0xA3;
sbit P2_4=0xA4;
sbit P2_5=0xA5;
sbit P2_6=0xA6;
sbit P2_7=0xA7;
sbit P3_0=0xB0;
sbit P3_1=0xB1;
sbit P3_2=0xB2;
sbit P3_3=0xB3;
sbit P3_4=0xB4;
sbit P3_5=0xB5;
sbit P3_6=0xB6;
sbit P3_7=0xB7;
void Delay5Ms(void) //5ms延时
{
TMOD=0X01;
TH0=0xEE;
TL0=0x00;
EA=0;
ET0=0;
TF0=0;
TR0=1;
while(TF0!=1);
}
void Delay1s(void) //1s延时
{
unsigned char i;
for(i=0;i<150;i++){
Delay5Ms();
}
}
unsigned char left=0,straight=0,right=0;
void keyscan(){ //键盘扫描程序
P0=0xFF; //第一列 左转
P0_4=0;
if(P0_0==0){
left=3;}
if(P0_1==0){
left=8;}
if(P0_2==0){
left=15;}
if(P0_3==0){
left=25;}
P0=0xFF; // 第二列 直行
P0_5=0;
if(P0_0==0){
straight=3;}
if(P0_1==0){
straight=8;}
if(P0_2==0){
straight=15;}
if(P0_3==0){
straight=25;}
P0=0xFF; //第三列 右转
P0_6=0;
if(P0_0==0){
right=3;}
if(P0_1==0){
right=8;}
if(P0_2==0){
right=15;}
if(P0_3==0){
right=25;}
}
unsigned char duanshi(unsigned char cls) //根据车流量判断显示时间
{
if(0<=cls&&cls<=5) return(13); //为了方便原来 30
if(6<=cls&&cls<=10) return(17); //为了方便原来 60
if(11<=cls&&cls<=20) return(20);
else return(25); //为了方便原来 85
}
unsigned char maxium(unsigned char i,unsigned char j) //左右转时选择最大车流量的时间
{
if(i>=j) return(i);
else return(j);
}
void showtime(unsigned int times,unsigned int PP,unsigned char fx) //显示倒计时,并且时刻进行键扫描 fx:0表示南北方向 1表示东西方向 3为 //两个方向
{
unsigned char xima[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int s, g,i,j;
if(fx==0){for(i=times;0<=i&&i<86;i--){
s=i/10; //取显示时间十位数
g=i%10; //取显示时间个位数
for(j=0;j<100;j++){
P2=PP&0xF8;
P1=xima[s];
Delay5Ms();
P2=PP&0xF4;
P1=xima[g];
Delay5Ms();
keyscan();
}
}
}
if(fx==1){
for(i=times;0<=i&&i<86;i--){
s=i/10; //取显示时间十位数
g=i%10; //取显示时间个位数
for(j=0;j<100;j++){
P2=PP&0xF2;
P1=xima[s];
Delay5Ms();
P2=PP&0xF1;
P1=xima[g];
Delay5Ms();
keyscan();
}
}
}
if(fx==3){
for(i=times;0<=i&&i<86;i--){
s=i/10; //取显示时间十位数
g=i%10; //取显示时间个位数
for(j=0;j<50;j++){
//P2=PP&0xF8;
P2=PP&0xF2;
P1=xima[s];
Delay5Ms();
// P2=PP&0xF4;
P2=PP&0xF1;
P1=xima[g];
Delay5Ms();
keyscan();
P2=PP&0xF8;
P1=xima[s];
Delay5Ms();
P2=PP&0xF4;
P1=xima[g];
Delay5Ms();
keyscan();
}
//keyscan();
}
}
}
void main()
{
unsigned char time,max;
unsigned char i;
WDT=0x00;
IE=0x00;
keyscan();
do{
P2_4=0x00; //南北直行 1
P2_5=0x01;
P2_6=0x00;
P2_7=0x01;
P3=0xA9;
time=duanshi(straight);
showtime(time,0xAF,0);
straight=0;
keyscan();
P1=0xFF;
for(i=0;i<3;i++){ //黄灯闪烁
P3_0=0;
P3_1=0;
Delay1s();
P3_0=1;
P3_1=1;
Delay1s();
}
keyscan();
P3=0x66; //东西左右转 2
P2_4=0x01;
P2_5=0x00;
P2_6=0x00;
P2_7=0x01;
max=maxium(left,right);
time=duanshi(max);
showtime(time,0x9F,3);
left=0; right=0;
keyscan();
P1=0xFF;
for(i=0;i<3;i++){ //黄灯闪烁
P2_4=0;
P2_5=0;
P3_2=0;
P3_3=0;
P3_6=0;
P3_7=0;
Delay1s();
P2_4=1;
P2_5=1;
P3_2=1;
P3_3=1;
P3_6=1;
P3_7=1;
Delay1s();
}
keyscan();
P3=0x9A; //东西直行 3
P2_4=0x00;
P2_5=0x01;
P2_6=0x00;
P2_7=0x01;
time=duanshi(straight);
showtime(time,0xAF,1);
straight=0;
keyscan();
P1=0xFF;
for(i=0;i<3;i++){ //黄灯闪烁
P3_4=0;
P3_5=0;
Delay1s();
P3_4=1;
P3_5=1;
Delay1s();
}
keyscan();
P3=0xA6; //南北左右转 4
P2_4=0x01;
P2_5=0x00;
P2_6=0x01;
P2_7=0x00;
max=maxium(left,right);
time=duanshi(max);
showtime(time,0x5F,3);
left=0; right=0;
keyscan();
P1=0xFF;
for(i=0;i<3;i++){ //黄灯闪烁
P2_4=0;
P2_5=0;
P2_6=0;
P2_7=0;
P3_2=0;
P3_3=0;
Delay1s();
P2_4=1;
P2_5=1;
P2_6=1;
P2_7=1;
P3_2=1;
P3_3=1;
Delay1s();
}
keyscan();
}while(1) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -