📄 main.c
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
////////////////////////////////////
//I/O 口定义
sbit CI_GREEN=P1^0;
sbit ZHU_GREEN=P1^1;
sbit CI_ZUO=P1^2;
sbit ZHU_ZUO=P1^3;
sbit CI_RED=P1^4;
sbit ZHU_RED=P1^5;
sbit CI_YELLOW=P1^6;
sbit ZHU_YELLOW=P1^7;
sbit ZHU_LED1=P3^4;
sbit ZHU_LED2=P3^5;
sbit CI_LED1=P3^6;
sbit CI_LED2=P3^7;
////////////////////////////
//位变量定义
bit bFlag10ms;
bit bResponse;
bit bShan;
////////////////////////////
//字节变量定义
uchar ucKey;
uchar ucNextKey;
uchar ucSetState,ucDispState;
uchar ucZhuTime,ucZhuZhuan,ucCiTime,ucCiZhuan;
uchar ucZhuTimeDisp,ucCiTimeDisp;
uchar ucMiaoCount;
uchar ucShanCount;
////////////////////////////
//常量定义
#define SET_KEY 0xee
#define UP_KEY 0xde
#define DOWN_KEY 0xdd
uchar code DISP_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
////////////////////////////
union
{
uchar ucTime0Buf[2];
uint uiTime0;
}intChar;
//函数申明
void intSys();
uchar testKey(void);
uchar readKey();
dealKey(uchar tempkey);
void StateCov(void);
void display();
void dispSM(uchar x,uchar y);
delay();
/////////////////////////////////////////////////////////////////////////
void main(void)
{
uchar temp;
intSys();
while(1)
{
if(bFlag10ms==1)
{
bFlag10ms=0;
temp=testKey();
if(temp!=0xff)
{
ucKey=readKey();
if(ucKey!=0xff)
{
dealKey(ucKey);
}
}
else
{
bResponse=0;
}
if(ucMiaoCount==0)
{
ucMiaoCount=99;
StateCov();
}
else
{
ucMiaoCount--;
}
display();
}
}
}
void timeSer(void) interrupt 1 using 1
{
TH0=intChar.ucTime0Buf[0];
TL0=intChar.ucTime0Buf[1];
bFlag10ms=1;
}
void UARTSer(void) interrupt 4 using 1
{
}
/*********************************************************
*函数名:intSys
*函数功能:系统初始化,包括内存单元、定时器、串行口、中断
*入口参数:无
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void intSys()
{
ucNextKey=0xff;
ucSetState=ucDispState=0;
ucZhuTime=20;
ucZhuZhuan=18;
ucCiTime=15;
ucCiZhuan=12;
ucMiaoCount=99;
ucShanCount=19;
ucDispState=0;
ucCiTimeDisp=ucZhuTime+ucZhuZhuan+6;
ucZhuTimeDisp=ucZhuTime;
P1=0xff;
ZHU_GREEN=0;
CI_RED=0;
ZHU_LED1=0;
ZHU_LED2=0;
CI_LED1=0;
CI_LED2=0;
bResponse=0;
TMOD=0x21;
intChar.uiTime0=0xffff-10000;
TH0=intChar.ucTime0Buf[0];
TL0=intChar.ucTime0Buf[1];
TR0=1;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
ET0=1;
ES=1;
EA=1;
}
/*********************************************************
*函数名:testKey
*函数功能:键盘测试函数,测试键盘是否有键按下
*入口参数:无
*出口参数:返回0xff表示无键按下,否则有键按下
*创建时间:
*创建人:
*修改时间:
**********************************************************/
uchar testKey(void)
{
uchar i;
P0=0xf0;
i=P0;
i=i|0x0f;
return i;
}
/*********************************************************
*函数名:readKey
*函数功能:键盘键值读取函数
*入口参数:无
*出口参数:返回0xff表示无键按下,否则返回对应按键键值
*创建时间:
*创建人:
*修改时间:
**********************************************************/
uchar readKey()
{
uchar i,j;
P0=0xf0;
i=P0;
P0=0x0f;
j=P0;
i=i+j;
if(ucNextKey==i)
{
if(bResponse==0)
{
bResponse=1;
return i;
}
else
return 0xff;
}
else
{
ucNextKey=i;
bResponse=0;
return 0xff;
}
}
/*********************************************************
*函数名:dealKey
*函数功能:键盘键值处理函数
*入口参数:键盘键值
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
dealKey(uchar tempKey)
{
switch(tempKey)
{
case SET_KEY:
{
if(ucSetState==4)
{
ucSetState=0;
ucDispState=0;
ucCiTimeDisp=ucZhuTime+ucZhuZhuan+6;
ucZhuTimeDisp=ucZhuTime;
P1=0xff;
ZHU_GREEN=0;
CI_RED=0;
}
else
{
ucSetState++;
}
break;
}
case UP_KEY:
{
switch(ucSetState)
{
case 0:
{
break;
}
case 1:
{
if(ucZhuTime<80)
ucZhuTime++;
break;
}
case 2:
{
if(ucZhuZhuan<80)
ucZhuZhuan++;
break;
}
case 3:
{
if(ucCiTime<80)
ucCiTime++;
break;
}
case 4:
{
if(ucCiZhuan<80)
ucCiZhuan++;
break;
}
}
break;
}
case DOWN_KEY:
{
switch(ucSetState)
{
case 0:
{
break;
}
case 1:
{
if(ucZhuTime>5)
ucZhuTime--;
break;
}
case 2:
{
if(ucZhuZhuan>5)
ucZhuZhuan--;
break;
}
case 3:
{
if(ucCiTime>5)
ucCiTime--;
break;
}
case 4:
{
if(ucCiZhuan>5)
ucCiZhuan--;
break;
}
default:
break;
}
break;
}
default:
break;
}
}
/*********************************************************
*函数名:stateCov
*函数功能:显示状态转换函数
*入口参数:键盘键值
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void StateCov(void)
{
if(ucSetState==0)
{
switch(ucDispState)
{
case 0: //主通道绿灯状态结束判断
{
if(ucZhuTimeDisp==1)
{
ucDispState++;
ucZhuTimeDisp=3;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 1: //主通道黄灯状态结束判断
{
if(ucZhuTimeDisp==1)
{
ucDispState++;
ucZhuTimeDisp=ucZhuZhuan;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 2: //主通道左转弯绿灯状态结束判断
{
if(ucZhuTimeDisp==1)
{
ucDispState++;
ucZhuTimeDisp=3;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 3: //主通道左转弯绿灯闪烁状态结束判断
{
if(ucZhuTimeDisp==1)
{
ucDispState++;
ucZhuTimeDisp=ucCiTime+ucCiZhuan+6;
ucCiTimeDisp=ucCiTime;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 4: //次通道绿灯状态结束判断
{
if(ucCiTimeDisp==1)
{
ucDispState++;
ucCiTimeDisp=3;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 5: //次通道黄灯状态结束判断
{
if(ucCiTimeDisp==1)
{
ucDispState++;
ucCiTimeDisp=ucCiZhuan;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 6: //次通道左传绿灯状态结束判断
{
if(ucCiTimeDisp==1)
{
ucDispState++;
ucCiTimeDisp=3;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
case 7: //次通道左传绿灯闪烁状态结束判断
{
if(ucCiTimeDisp==1)
{
ucDispState=0;
ucCiTimeDisp=ucZhuTime+ucZhuZhuan+6;
ucZhuTimeDisp=ucZhuTime;
}
else
{
ucZhuTimeDisp--;
ucCiTimeDisp--;
}
break;
}
default:
break;
}
}
}
/*********************************************************
*函数名:display
*函数功能:灯和数码管显示函数
*入口参数:无
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void display()
{
uchar x,y;
if(ucShanCount==0)
{
ucShanCount=19;
bShan=~bShan;
}
else
{
ucShanCount--;
}
switch(ucSetState)
{
case 0:
{
x=ucZhuTimeDisp;
y=ucCiTimeDisp;
switch(ucDispState)
{
case 0:
{
P1=0xff;
ZHU_GREEN=0;
CI_RED=0;
break;
}
case 1:
{
P1=0xff;
ZHU_YELLOW=0;
CI_RED=0;
break;
}
case 2:
{
P1=0xff;
ZHU_ZUO=0;
CI_RED=0;
break;
}
case 3:
{
P1=0xff;
ZHU_ZUO=bShan;
CI_RED=0;
break;
}
case 4:
{
P1=0xff;
ZHU_RED=0;
CI_GREEN=0;
break;
}
case 5:
{
P1=0xff;
ZHU_RED=0;
CI_YELLOW=0;
break;
}
case 6:
{
P1=0xff;
ZHU_RED=0;
CI_ZUO=0;
break;
}
case 7:
{
P1=0xff;
CI_ZUO=bShan;
ZHU_RED=0;
break;
}
default:
break;
}
break;
}
case 1:
{
P1=0xff;
ZHU_YELLOW=0;
CI_YELLOW=0;
ZHU_GREEN=0;
x=ucZhuTime;
y=ucCiTime;
break;
}
case 2:
{
P1=0xff;
ZHU_YELLOW=0;
CI_YELLOW=0;
ZHU_ZUO=0;
x=ucZhuZhuan;
y=ucCiZhuan;
break;
}
case 3:
{
P1=0xff;
ZHU_YELLOW=0;
CI_YELLOW=0;
CI_GREEN=0;
x=ucZhuTime;
y=ucCiTime;
break;
}
case 4:
{
P1=0xff;
ZHU_YELLOW=0;
CI_YELLOW=0;
CI_ZUO=0;
x=ucZhuZhuan;
y=ucCiZhuan;
break;
}
default:
break;
}
dispSM(x,y);
}
/*********************************************************
*函数名:dispSM
*函数功能:数码管显示驱动函数
*入口参数:无
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void dispSM(uchar x,uchar y)
{
uchar i,j;
i=x/10;
j=x%10;
ZHU_LED1=0;
P2=DISP_TAB[i];
ZHU_LED1=1;
delay();
ZHU_LED1=0;
ZHU_LED2=0;
P2=DISP_TAB[j];
ZHU_LED2=1;
delay();
ZHU_LED2=0;
i=y/10;
j=y%10;
CI_LED1=0;
P2=DISP_TAB[i];
CI_LED1=1;
delay();
CI_LED1=0;
CI_LED2=0;
P2=DISP_TAB[j];
CI_LED2=1;
delay();
CI_LED2=0;
}
//////////////////////////////////////////
delay()
{
uint i;
for(i=200;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -