|
按鍵1切換長短時間,按鍵2增加時間,按鍵3夜間模式所有黃燈閃爍
#include<reg51.h>
#define uint unsigned int;
#define uchar unsigned char;
void DigitalTube(); //數(shù)碼管顯示函數(shù)
void InterruptT0(); //內部中斷0
sbit P10 = P1^0; //紅綠燈引腳的初始化
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6; //數(shù)碼管使能控制
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit K22 = P2^2; //按鍵22
sbit K23 = P2^3;
sbit K24 = P2^4;
sbit dula = P2^5;
uint LedBuf[10] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
}; //0~9的數(shù)字顯示共陽
uint Kflag = 1; //按鍵24的標志
uint LedNumNS = 27; //南北的數(shù)字顯示
uint LedNumEW = 30; //東西的數(shù)字顯示
uint i = 0;
uint j = 0;
uint j1 = 0;
uint k = 0;
uint g = 0;
uint z = 0;
int r=0; //計數(shù)及狀態(tài)的變量
uint LedTime1 = 30;
uint LedTime2 = 27;
uint LedTime3 = 30;
uint LedTime4 = 27;
uint Kf22 = 1; //按鍵前一個狀態(tài)的值
uint Kf23 = 1;
uint Kf24 = 1;
uint KSta24 = 1; //按鍵的當前值
uint KSta23 = 1;
uint KSta22 = 1;
uchar Kflag22 = 0; //按鍵22的switch函數(shù)參數(shù)
void main()
{
EA = 1; //開總中斷
ET0 = 1; //開內部中斷0
TR0 = 1;
TMOD = 0x01; //方式1
TH0 = 0xFC;
TL0= 0x67; //1ms中斷
P1 = 0xEE; //
while(1)
{
DigitalTube(); //數(shù)碼管顯示
}
}
void InterruptT0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67; //1ms中斷
i++;
k++;
KSta24 = K24; //按鍵K24 夜間模式
if(Kf24 != KSta24) //按鍵有動作
{
if(Kf24 == 1) //按鍵按下
{
Kflag = !Kflag;
}
Kf24 = KSta24;
}
KSta23 = K23; //按鍵K23 增減時長
if(Kf23 != KSta23) //按鍵有動作
{
if(Kf23 == 1) //按鍵按下
{
// LedTime = LedTime +2;
LedTime1 = LedTime1 +5; //32 34 36 38 30
LedTime2 = LedTime2 +5; //25 23 21 19 17
LedTime3 = LedTime3 +5;
LedTime4 = LedTime4 +5;
if(LedTime1 >=60)
{
LedTime1 = 10;
LedTime2 = 7;
LedTime3 = 10;
LedTime4 = 7;
}
LedNumEW = LedTime1;
LedNumNS = LedTime2;
}
Kf23= KSta23;
}
KSta22 = K22; //按鍵K22 某方向長時間紅燈
if(Kf22 != KSta22) //按鍵有動作
{
if(Kf22 == 1) //按鍵按下
{
Kflag22 ++;
if(Kflag22>= 3)
{
Kflag22 = 0;
}
switch(Kflag22)
{
case 1:
LedTime1 = 60;
LedTime2 = 57; //case2
LedTime3 = 30;
LedTime4 = 27; //case1
LedNumEW = LedTime1;
LedNumNS = LedTime2;
break;
case 2:
LedTime1 = 30;
LedTime2 = 27; //case2
LedTime3 = 60;
LedTime4 = 57; //case1
LedNumEW = LedTime1;
LedNumNS = LedTime2;
break;
}
}
Kf22 = KSta22;
}
if(j >= 200)
{
j = 0;
j1++;
}
if(i >= 1000)
{
i = 0;
LedNumNS--; //27
LedNumEW--; //30
switch(g)
{ //剛開始東西紅 南北綠
case 0: //********2
if(LedNumEW == 3) //*****3
{
P14 = ! P14; //綠燈滅
if(Kf24 == Kflag) P15 = ! P15; //黃燈亮
LedNumNS = 3;
}
if(LedNumEW == 0)
{
LedNumNS = LedTime3; // 30東西綠南北紅的時間
LedNumEW = LedTime4; // 27
P12 = ! P12; //東西綠燈亮
P10 = ! P10; //東西紅燈滅
P13 = ! P13; //nanbei紅燈亮
if(Kf24 == Kflag)
P15 = ! P15; //南北黃燈滅
g = 1;
}
break;
case 1: //******4
if(LedNumNS == 3) //黃燈亮
{
P12 = !P12;
P11 = !P11;
LedNumEW = 3;
}
if(LedNumNS == 0) //********5
{
LedNumEW = LedTime1;//重新賦值
LedNumNS = LedTime2;
if(Kf24 == Kflag) P11 = !P11; //南北黃燈滅
P10 = !P10; //dongxi紅燈亮
P14 = !P14;
P13 = !P13;
g = 0;
}
break;
}
if(Kf24 != Kflag) //夜間模式
{
r=0;
g=0;
if(j1 % 2 == 0)
{
P11 = ! P11;
P15 = ! P15;
} //所有方向黃燈閃爍
}
}
}
void DigitalTube() //數(shù)碼管
{
switch(z)
{
case 0: //第一個數(shù)碼管顯示數(shù)字
P0 =0xFF; //防止數(shù)字顯示混亂
dula = 1;
P0 = LedBuf[LedNumEW / 10]; //十位
P20 = 0;
P17 = 0;
P21 = 0;
P16 = 1;
dula = 0;
z++;
break;
case 1: //第二個數(shù)碼管亮
P0 =0xFF;
dula = 1;
P0 = LedBuf[LedNumEW % 10]; //個位
P16 = 0;
P20 = 0;
P21 = 0;
P17 = 1;
dula = 0;
z++;
break;
case 2: //第三個數(shù)碼管亮
P0 =0xFF;
dula = 1;
P0 = LedBuf[LedNumNS / 10]; //十位
P21 = 0;
P16 = 0;
P17 = 0; //關閉2
P20 = 1; //使能第3個數(shù)碼管
dula = 0;
z++; //進入3
break;
case 3: //第四個數(shù)碼管亮
P0 =0xFF;
dula = 1;
P0 = LedBuf[LedNumNS % 10]; //個位
P20 = 0; //第三個關閉
P16 = 0;
P17 = 0;
P21 = 1; //使能第四個數(shù)碼管
dula = 0;
z = 0; //進入0
break;
default:break;
}
}
|
-
12.jpg
(261.15 KB, 下載次數(shù): 106)
下載附件
2020-6-4 18:24 上傳
|