电路图
C语言程序
#include
#define uint unsigned int
#define uchar unsigned char
//共阳数码管编码表
uchar code table[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//函数声明
void delay(uint time); //延时函数
void display(uchar w); //
uchar getKey(); //读取键盘的数值
void delay0_5s();
void delay5s();
//主程序
void main()
{
uchar keyValue;
TMOD=0x10;
while(1)
{
keyValue = getKey(); //读取键盘值
display(keyValue); //数码管显示&LED亮灭
}
}
void delay(uint time)
{
uint i,j;
for(i = 0; i for(j = 0; j<110; ++j);
}
void display(uchar w)
{
int l,h;
//按键1按下,复位
if (w==0)
{
P1=0X00;
P0=0xff;
P3=0xff;
}
//按键2按下,交通灯正常运行
if(w==1)
{
unsigned char k;
P1=0x09; //东西绿灯亮5秒&南北红灯亮
delay5s();
for(k=0;k<5;k++) //东西黄灯闪烁&南北红灯
{
P1=0x11; //东西黄灯亮&南北红灯亮
delay0_5s();
P1=0x01; //东西黄灯灭&南北红灯亮
delay0_5s();
}
P1=0x24; //东西红灯亮&南北绿灯亮5秒
delay5s();
for(k=0;k<5;k++) //东西红灯&南北黄灯闪烁
{
P1=0x22; //东西红灯&南北黄灯亮
delay0_5s();
P1=0x20; //东西红灯&南北黄灯灭
delay0_5s();
}
}
//按键3按下, 东西绿灯亮&南北红灯亮
if(w==2)
{
P1=0X09;
}
//按键4按下,东西红灯亮&南北绿灯亮
if(w==3)
{
P1=0x24;
}
// 按键5按下,数码管60s计时
if (w==4)
{
for (l=0;l<6;l++)
{
P0=table[l];
for(h=0;h<10;h++)
{
P3=table[h];
delay0_5s();
delay0_5s();
}
}
}
//按键6按下所有路口绿灯;
if(w==5)
{
P1=0X0C;
}
//按键7按下所有路口黄灯;
if(w==6)
{
P1=0X12;
}
//按键8按下所有路口黄灯;
if(w==7)
{
P1=0X21;
}
}
uchar getKey()
{
uchar x , y ;
uchar result;
// 计算行数X的值
P2 = 0x0f; // 从P2口输出,写P2口
if (P2 != 0x0f)// 从P2口输入,P2口
{
// 读出的不是0x0f说明有按键被按下
delay(20);
// 判断在哪一行
switch (P2)
{
case 0x0e: x = 0; break;
case 0x0d: x = 1; break;
case 0x0b: x = 2; break;
case 0x07: x = 3; break;
default: break;
}
delay(10);
// 计算列数y的值
P2 = 0xf0;
if (P2 != 0xf0)
{
delay(20);
switch (P2)
{
case 0xe0:y = 0; break;
case 0xd0: y = 1;break;
case 0xb0: y = 2; break;
case 0x70: y = 3; break;
default: break;
}
// 计算出结果,确定哪个按键按下
}
}
result = x * 4 + y;
return result;
}
void delay0_5s() //0.5秒延时
{
unsigned char i;
for(i=0;i<10;i++)
{
TH1=0X3C;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}
void delay5s() //5秒延时
{
unsigned char i;
for(i=0;i<50;i++)
{
TH1=0X3C;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}