数码管的使用看这里→STM32-4位数码管动态显示0~9999
源码和仿真下载https://download.csdn.net/download/jzkj201/85445794
目录
1.现象说明当有行人过马路的时候,按下按钮,黄灯闪烁5次,人行道变绿灯,车行道变红灯,并进行15S倒计时
2.使用的STM32F103R8C8芯片,可以参考资源内部的配置文件,来进行配置其他STM32的芯片 3.可扩展为十字路口的红绿灯
这里的程序用的HAL库编写
代码
按键
用中断来触发按键
//这里的按键用的中断来触发的
int key=0;//中断标记
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断处理函数
{
key=1;
}
延迟函数的目的是为了帮助数码管实现快刷,可以利用定时器来完成。
void delay(int time)//延时函数
{
uint16_t k,l;
for(k=0;k<time;k++)
{
for(l=0;l<=k;l++)
{;;;;;}
}
}
相关灯的亮灭
这里是通过给对应端口写高低电平实现的亮灭,可以使用位操作来简化代码
位操作:
基本位操作运算符:与运算:&;或运算:|;取反: ~;异或: ^;左移: <<;右移: >>
//人行道
void Sidewalk_Red(){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
}
void Sidewalk_Yellow(){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,1);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
}
void Sidewalk_Green(){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
}
//车行道
void Road_Red(){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,1);
}
void Road_Yellow(){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,1);
}
void Road_Green(){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,0);
}
数码管显示倒计时
//数码管显示
void display(uint8_t num1){
uint8_t SEC_tab_cc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示
uint8_t WEI_tab[]={0x0e,0x0d,0x0b,0x07};//数码管选段
uint8_t Number_for_show;
uint8_t shi,ge;
while (1)
{
shi=num1/10;
ge=num1%10;
uint8_t Disp_tab[]={0xff,0xff,shi,ge};
for(int i=0;i<50;i++){//显示时间
for(uint8_t i=0;i<4;i++)
{
Number_for_show=Disp_tab[i];
GPIOA->ODR=(GPIOA->ODR&0xffffff00)|SEC_tab_cc[Number_for_show]|WEI_tab[i]<<8;
GPIOA->ODR=(GPIOA->ODR&0xfffff0ff)|WEI_tab[i]<<8;
delay(100);//快刷,消影
}
}
break;
}
}
主函数
int j;
if (key==1){
HAL_Delay(3000);
for(j=5;j>0;j--){
Sidewalk_Yellow();
Road_Yellow();
GPIOA->ODR=0x00;//关闭数码管
HAL_Delay(1000);
}
Sidewalk_Green();
Road_Red();
for(j=15;j>=0;j--){
display(j);
}
for(j=5;j>0;j--){
Sidewalk_Yellow();
Road_yellow();
GPIOA->ODR=0x00;//关闭数码管
HAL_Delay(1000);
}
key=0;
}
else
{
GPIOA->ODR=0x00;
Road_green();
Sidewalk_Red();
}