单片机交通灯点阵显示小人代码
时间: 2023-07-27 09:06:58 浏览: 39
以下是一个基于51单片机的交通灯点阵显示小人的代码,你可以根据自己的需要进行修改:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
// 数码管位选信号
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
// 8x8点阵位选信号
sbit X1=P2^5;
sbit X2=P2^6;
sbit X3=P2^7;
// 8x8点阵图案
uchar code smgduan[16][8]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 空白
{0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00}, // 上方绿灯
{0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00}, // 下方绿灯
{0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00}, // 上方黄灯
{0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00}, // 下方黄灯
{0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00}, // 上方红灯
{0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00}, // 下方红灯
{0x00,0x08,0x1C,0x3E,0x7F,0x3E,0x1C,0x08}, // 小人
};
// 延时函数
void delay(uint i)
{
while(i--);
}
// 数码管位选函数
void DigDisplay(uchar num)
{
switch(num)
{
case(0): LSA=0;LSB=0;LSC=0;break;
case(1): LSA=1;LSB=0;LSC=0;break;
case(2): LSA=0;LSB=1;LSC=0;break;
case(3): LSA=1;LSB=1;LSC=0;break;
case(4): LSA=0;LSB=0;LSC=1;break;
case(5): LSA=1;LSB=0;LSC=1;break;
case(6): LSA=0;LSB=1;LSC=1;break;
case(7): LSA=1;LSB=1;LSC=1;break;
}
}
// 8x8点阵位选函数
void LED_X(uchar i)
{
switch(i)
{
case(1): X1=1;X2=0;X3=0;break;
case(2): X1=0;X2=1;X3=0;break;
case(3): X1=1;X2=1;X3=0;break;
case(4): X1=0;X2=0;X3=1;break;
case(5): X1=1;X2=0;X3=1;break;
case(6): X1=0;X2=1;X3=1;break;
case(7): X1=1;X2=1;X3=1;break;
}
}
// 显示函数
void smg_display()
{
uchar i,j;
for(i=1;i<9;i++)
{
LED_X(i);
for(j=0;j<8;j++)
{
P0=smgduan[i][j];
delay(100);
P0=0x00;
}
}
}
void main()
{
uchar i=0;
while(1)
{
DigDisplay(0); // 显示0,即关闭数码管
smgduan[1][1]=0x18; // 上方绿灯
smgduan[6][1]=0x18; // 下方红灯
smg_display();
delay(1000);
DigDisplay(0);
smgduan[2][1]=0x18; // 上方黄灯
smgduan[5][1]=0x18; // 下方黄灯
smg_display();
delay(1000);
DigDisplay(0);
smgduan[3][1]=0x18; // 上方红灯
smgduan[4][1]=0x18; // 下方绿灯
smg_display();
delay(1000);
for(i=0;i<3;i++)
{
DigDisplay(i+1); // 显示1~3,即显示小人在不同位置
smgduan[7][i]=0x3C; // 小人
smg_display();
delay(500);
smgduan[7][i]=0x00; // 清除小人
}
}
}
```
需要注意的是,该代码只是一个简单的示例,实际应用中你需要根据具体需求进行修改。