LED&RGB (用位操作实现)
#include "stm32f10x.h"
#include "stm32_eval.h"
GPIO_InitTypeDef GPIO_InitStructure;
void RCC_Configuration(void)
{
RCC_DeInit();
RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HSEConfig(RCC_HSE_OFF);
RCC_LSEConfig(RCC_LSE_OFF);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9); // 72HMz
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//disable JTAG
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//1?·??ù?÷
}
void GPIO_INIT()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);//òa????PC,PA
GPIO_InitStructure.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;//òaê1ó?PC0µ?PC7
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//í?íìê?3?
GPIO_Init(GPIOC, &GPIO_InitStructure);//3?ê??¯PC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//òaê1ó?PA1,PA2,PA3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//í?íìê?3?
GPIO_Init(GPIOA, &GPIO_InitStructure);//3?ê??¯PA
}
void func(void)
{
int i,j;
while(1)
{
GPIO_SetBits(GPIOC,0x000000ff);//LED全部熄灭
GPIO_SetBits(GPIOA,0x0000000e);//RGB全部熄灭
i=0x00000010;//给i赋一个右移前的值
for(j=1;j<=4;j++)//LED D4-D1通过i右移4次依次点亮
{
i>>=1;右移一位
GPIO_ResetBits(GPIOC,i);//PC3-PC0 D4-D1
delay_ms(200);
GPIO_SetBits(GPIOC,i);//依次熄灭
}
i=0x00000100;//给i赋一个右移前的值
for(j=1;j<=4;j++)//LED D8-D5通过i右移4次依次点亮
{
i>>=1;//右移一位
GPIO_ResetBits(GPIOC,i); //PC7-PC4 D8-D5
delay_ms(200);
GPIO_SetBits(GPIOC,i);//依次熄灭
}
i=0x00000001;
for(j=1;j<=3;j++)//RGB三基色通过左移3次实现依次点亮,下面的混合色的颜色顺序我不写了。。
{
i<<=1;//左移一位
GPIO_ResetBits(GPIOA,i); //
delay_ms(200);
GPIO_SetBits(GPIOA,i);
GPIO_ResetBits(GPIOA,0x00000006); //
delay_ms(200);
GPIO_SetBits(GPIOA,0x00000006);
GPIO_ResetBits(GPIOA,0x0000000a); //
delay_ms(200);
GPIO_SetBits(GPIOA,0x0000000a);
GPIO_ResetBits(GPIOA,0x0000000c); //
delay_ms(200);
GPIO_SetBits(GPIOA,0x0000000c);
}
}
}
int main(void)
{
RCC_Configuration();
GPIO_INIT();
func();
}
顺便说说这次的作业。。。我想不用switch的写法来做按键计数和动态扫描显示。
用if else,for写好了(35#),100多行,比较简短。
我要赚赏金
