一、流水灯
1.让PA0输出低电平,其他管脚输出高电平,对PA0这个管脚所对应的寄存器(GPIOA)对应的bite位(GPIOA_PIN_O写入o.其他的管脚所对应的位,写高电平.
//第1个灯亮
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_SET);
//延时500ms
HAL_Delay(500);
//让第2个灯亮
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_SET);
//延时500ms
HAL_Delay(500);
//让第3个灯亮
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3,GPIO_PIN_SET);
//延时500ms
HAL_Delay(500);
//让第4个灯亮
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_1,GPIO_PIN_SET);
//延时500ms
HAL_Delay(500);
2、通过改变BITE
用一个uint16_t表示管脚。当x=0x0001,那就表示0号管脚,当x=0x0002,那就表示1号管脚,当x=0x0003,那就表示2号管脚…以此类推。
通过左移动一位,使管脚号发生变换。
uint16_t x=0x0001;//x表示是0号管脚
int i = 0;
x = x<<1;//此时,x表示的是0号管脚
i++;
x=x<<i;//此时,i==1;x表示的是1号管脚
i++;
x = x<<i;//此时,i==2;x表示的是2号管脚
i++;
x = x<<i;//此时,i==3;x表示的是3号管脚
循环写法:
uint16_t x=0x0001;//x表示是0号管脚
int i = 0;
while (1)
{
x = x<<i;
HAL_GPIO_WritePin(GPIOA,x,GPIO_PIN_RESET);
i++;
}
3、实现循环流水灯:
uint16_t x=0x0001;//x表示是0号管脚
int i = 0;
while (1)
{
HAL_GPIO_WritePin(GPIOA,x,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,(~x)&0x000f,GPIO_PIN_SET);//如果x是2号管脚,(~x)&0x000f表示的就是gpio_pin_olgpio_pi
x=x<<1;
i++;
HAL_Delay(500);
//限制i的变化范围0-3
if(i>3)x=0x0001;
}
二、4*4矩阵
(1)点亮D12
uint16_t pin_hang=0x0001;
HAL_GPIO_WritePin(GPIOA,pin_hang<<2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,(~(pin_hang<<2))&0x000f,GPIO_PIN_SET);
uint16_t pin_lie=0x0010;
HAL_GPIO_WritePin(GPIOA,pin_lie<<2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,(~(pin_lie<<2))&0x00f0,GPIO_PIN_RESET);
(2)封装跳转
void control(int x,int y){
//用0-3号管脚控制行 第二行
uint16_t pin_hang=0x0001;//最开始的时候,把变量赋值位0号管脚
pin_hang=pin_hang << (x-1);//这个时候,pin_hang,表示1号管脚
HAL_GPIO_WritePin(GPIOA,pin_hang,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,(~pin_hang) &0x000f,GPIO_PIN_RESET);
//4-7号管脚控制列 第三列
uint16_t pin_lie=0x0080;//pin_lie表示7号管脚
pin_lie=pin_lie>>(y-1);//7号管脚右移两位,5号管脚
HAL_GPIO_WritePin(GPIOA,pin_lie,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,(~pin_lie) &0x00f0,GPIO_PIN_SET);
}
control(1,1);
HAL_Delay(500);
control(1,2);
HAL_Delay(500);
由D14跳转D3