LED&RGB (用位操作实现)
视频地址:http://player.youku.com/player.php/sid/XODEyMjM1NTky/v.swf
#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多行,比较简短。