- 打卡等级:偶尔看看III
- 打卡总天数:41
- 最近打卡:2024-11-09 21:53:17
中级会员
- 积分
- 450
|
分享学习过程也是一种进步,自己给你自己出题目然后去完成,不断夯实基础,非常有成就感。
// @神自不凡 2022/7/12 新手报到第四例
// 1.共阳极8个LED接P7端口,每个LED接限流电阻430Ω,公共正极接VCC,低电平点亮,高电平熄灭。
// 2.P7^0=LED1,P7^1=LED2,P7^2=LED3,P7^3=LED4,P7^4=LED5,P7^5=LED6,P7^6=LED7,P7^7=LED8.
// 3.采用开发板STM32G12K128,设置频率35MHz
/* 4.实现功能:位移效果,LED1亮灭一次各持续0.5秒,然后LED2亮灭2次各持续0.5秒,
再然后LED3亮灭3次各持续0.5秒,以此类推直到LED8亮灭8次各持续0.5秒,
在之后保持全灭2S,程序循环执行LED的亮灭过程.
#include <STC32G.H>
#include <config.h>
#include <delay.h>
u8 x,y;//x控制位移,y控制亮灭次数
void main()
{
WTST= 0; //设置等待时间为0个时钟,CPU运行速度最快
P7M0=0x00; P7M1=0x00; //设置P7口为准双向
while(1)
{
for(x=0;x<8;x++) //第一个for循环
{
P7=~(0x01<<x); //赋值0x01=0000 0001 取反=1111 1110
delayms(500); //LED亮保持0.25S
P7=0xff; //LED灭
delayms(500); //LED灭保持0.25S 这样就完成1次亮灭的操作过程
//过程见解如下:
/* 当x=1 程序完成一个for循环第一次,这时LED1已经执行了亮灭一次0.5s的操作了,
然后进入到第二个for循环
初值y为0,满足条件y<x,执行y自加1,得到y为1,不满足条件y<x
就不会再次执行LED1亮灭一次的操作。然后退出第二个for循环,
这样就是看到的效果LED1亮灭一次然后到LED2亮灭的操作。
(由于单片机运行速度非常快LED1亮灭完成再到LED2执行亮灭,间隔不一定是0.5s
可能是0.5000001s或者0.4999998啥的,单片机频率有误差,延时有误差,所以忽略不计)
当x=2 程序完成第一个for循环第二次,LED1亮灭1次一次完成了,这时赋值然后左移2位,变成1111 1101,
这时LED2执行了亮灭第一次0.5s的操作了,
然后进入到第二个for循环,初值y为0,满足条件y<x,执行y自加1,得到y为1,
就会再次执行LED2亮灭一次的操作。这时LED2就执行了亮灭2次的操作,
在次执行y自加1,得到y为2,不满足y<x,就会退出第二个for循环,
这样就是看到效果LED2亮灭2次的操作。
当x=3 程序完成第一个for循环第三次,LED1亮灭1次完成了,LED2亮灭2次完成了,
这时赋值然后左移3位,变成1111 1011,这时LED3执行了亮灭第一次0.5s的操作了,
然后进入到第二个for循环,初值y为0,满足条件y<x,执行y自加1,得到y为1,
就会再次执行LED3亮灭一次的操作。这时LED3就执行了亮灭2次的操作,
再次执行y自加1,得到y为2,满足y<x,
又在次执行LED3亮灭一次的操作。这时LED3就执行了亮灭3次的操作,
在次执行y自加1,得到y为3,不满足y<x,就会退出第二个for循环,
这样就是看到效果LED3亮灭3次的操作。
|
|
|
直到x=8完成,LED8亮灭8次的操作。
*/
for(y=0;y<x;y++) //第二个for循环
{
P7=~(0x01<<x);
delayms(500);
P7=0xff;
delayms(500); //LED亮灭的操作过程
}
}
P7=0xff; //0xff=1111 1111高电平熄灭所有LED
delayms(1500); //由于LED8第八次熄灭持续了0.5s,所以LED全灭保持1.5s就会得到要求的2s全熄灭
}
}
|
|