设STM32芯片管脚A0到A7各接一个发光二极管,发光二极管负极接地;管脚B0为一输入管脚,内部接下拉电阻。当管脚B0接3.3V电压管脚时,8个发光二极管流水灯显示;当管脚B0浮空时,流水灯暂停。编写程序完成上述功能,汇编,C均可。(芯片型号f103 c8t6)请提供代码,最好带注释
1条回答 默认 最新
- soar3033 2021-11-11 12:14关注
#include"stm32f10x.h" void GPIO_Init() { GPIO_InitTypeDef GPIO_InitStruct; //GPIOA时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIOB时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //初始化PA0 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//输出 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽模式 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//没有上拉下拉 GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PB0 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//输入 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉(也就是PB0不接3.3V的时候是0) GPIO_Init(GPIOB, &GPIO_InitStruct); } int main() { u8 b = 0x0f;//流水灯初始为00001111(0为灭,1为亮) GPIO_Init(); while (1) { if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1) //读取PB0,如果为1(即接了3.3V) { if (b&0x80)//如果b的最高位为1 { b <<= 1;//b的各位左移1位 b |= 0x01;//b的最低位置1(举例:当b为11110000,则b先变为11100000,然后变为11100001.实现循环) } else { b <<= 1; } if (b&0x80)//如果移位后最高位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_7);//PA7亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_7);//PA7灭灯 } if (b & 0x40)//如果移位后第6位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_6);//PA6亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_6);//PA6灭灯 } if (b & 0x20)//如果移位后第5位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_5);//PA5亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_5);//PA5灭灯 } if (b & 0x10)//如果移位后第4位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_4);//PA4亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_4);//PA4灭灯 } if (b & 0x08)//如果移位后第3位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_3);//PA3亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_3);//PA3灭灯 } if (b & 0x04)//如果移位后第2位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_2);//PA2亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_2);//PA2灭灯 } if (b & 0x02)//如果移位后第1位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_1);//PA1亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_1);//PA1灭灯 } if (b & 0x01)//如果移位后第0位为1 { GPIO_SetBits(GPIOA, GPIO_Pin_0);//PA0亮灯 } else//否则 { GPIO_ResetBits(GPIOA, GPIO_Pin_0);//PA0灭灯 } } for (int i = 0; i < 60000; i++)//延时 { for (int j = 0; j < 200; j++); } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 WPF动态创建页面内容
- ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
- ¥15 SQL数据库操作问题
- ¥100 关于lm339比较电路出现的问题
- ¥15 Matlab安装yalmip和cplex功能安装失败
- ¥15 加装宝马安卓中控改变开机画面
- ¥15 STK安装问题问问大家,这种情况应该怎么办
- ¥15 关于罗技鼠标宏lua文件的问题
- ¥15 halcon ocr mlp 识别问题
- ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线