原理图
LED宏定义
8个LED,管脚有些多,代码里不好修改
我们可以二次宏定义
#define LED GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
这样写比较麻烦,我们也可以先计算出上述数值
或运算:有一个为真,必定为真
- 0 | 0 = 0
- 1 | 0 = 1
- 0 | 1 = 1
- 1 | 1 = 1
十六进制的 F 表示成二进制就是1111,就是1+2+4+8
观察上图,最后一位是8421相加,倒数第二位也是8421相加
所以GPIO_Pin_0| ...... | GPIO_Pin_7 = 0x00FF
简化宏定义如下:
#define LED 0x00FF
这里的流水灯程序,用的是数组的方法,把每一个状态都写出来
用GPIO_Write函数写入对应的GPIO口
GPIO_Write(LED_PORT, code[i]);
以下是ZET6开发板各个模块的代码
LED.c
1. #include "LED.h" 2. 3. #define LED 0x00FF 4. #define LED_PORT GPIOF 5. 6. uint8_t code[] = {0xFE, 0xFD, 0xFB, 0xF7, 0XEF, 0XDF, 0XBF, 0X7F}; 7. 8. void LED_Init(void) 9. { 10. 11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); 12. 13. GPIO_InitTypeDef GPIO_InitStructure; //初始化结构体 14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 15. GPIO_InitStructure.GPIO_Pin = LED; 16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 17. GPIO_Init(LED_PORT, &GPIO_InitStructure); 18. 19. GPIO_ResetBits(LED_PORT, LED); //置低电平 20. } 21. 22. void LED_Display(void) 23. { 24. for(uint8_t i = 0; i < 8; i ++){ 25. GPIO_Write(LED_PORT, code[i]); //直接把数组写入 26. Delay_ms(150); 27. } 28. for(uint8_t i = 7; i > 0; i --) { //反着流回来 29. GPIO_Write(LED_PORT, code[i]); 30. Delay_ms(150); 31. } 32. } 33.
LED.h
1. #ifndef __LED_H__ 2. #define __LED_H__ 3. 4. #include "stm32f10x.h" // Device header 5. #include "Delay.h" 6. 7. void LED_Init(void); 8. void LED_Display(void); 9. 10. #endif 11.
main.c
1. #include "stm32f10x.h" // Device header 2. #include "Delay.h" 3. #include "LED.h" 4. 5. 6. int main(void) 7. { 8. Delay_Init(72); 9. LED_Init(); 10. 11. while(1) 12. { 13. LED_Display(); 14. } 15. } 16. 17. /***********************************END OF FILE***********************************/ 18.
由于没有LED模块,只有散装LED灯珠,用C8T6在面包板插线更方便
流水灯接线图:
C8T6程序如下,流水灯采用for循环的写法,简洁明了!
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //这样也可以选择Pin0~Pin7
1. #include "stm32f10x.h" // Device header 2. #include "Delay.h" 3. 4. #define LED 0x00FF 5. #define LED_PORT GPIOA 6. 7. uint8_t code[] = {0xFE, 0xFD, 0xFB, 0xF7, 0XEF, 0XDF, 0XBF, 0X7F}; 8. 9. int main(void) 10. { 11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 12. 13. GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 (高低电平都有输出能力) 15. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出 (低电平有输出能力) 16. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; //可以用按位或操作,同时设置多个引脚 17. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //上一行的接续,用Pin_All,设置16个引脚,,也可以用上边那一行设置0-7引脚 18. GPIO_InitStructure.GPIO_Pin = LED; 19. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 20. //GPIOA 0号引脚 推挽输出 2MHz 21. 22. GPIO_Init(LED_PORT, &GPIO_InitStructure); 23. 24. // GPIO_ResetBits(GPIOA, GPIO_Pin_0); //点亮一个LED 25. // GPIO_SetBits(GPIOA, GPIO_Pin_0); //熄灭LED 26. // GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//Bit_RESET清楚端口值,置低电平 27. // GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //Bit_SET 设置端口值,置高电平 28. 29. unsigned char i =0; 30. 31. while(1) 32. { 33. //写法1(数组) 34. // for(uint8_t i = 0; i < 8; i ++) 35. // { 36. // GPIO_Write(LED_PORT, code[i]); //直接把数组写入 37. // Delay_ms(80); 38. // } 39. // for(uint8_t i = 7; i > 0; i --) //反着流回来 40. // { 41. // GPIO_Write(LED_PORT, code[i]); 42. // Delay_ms(100); 43. // } 44. 45. //写法2 46. for(i=0;i<8;i++) //用for循环 左移操作,实现循环点灯 47. { 48. GPIO_Write(GPIOA, ~(0x0001<<i)); //0000 0000 0000 0001 ,低电平点亮,所以取反,只点亮第一个LED 49. Delay_ms(200); 50. } 51. for(i=0;i<8;i++) 52. { 53. GPIO_Write(GPIOA, ~(0x0080>>i)); //0000 0000 0000 0001 ,低电平点亮,所以取反,只点亮第一个LED 54. Delay_ms(100); 55. } 56. 57. //写法3,笨方法~ 58. // GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001 ,低电平点亮,所以取反,只点亮第一个LED 59. // Delay_ms(500); 60. // GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010 61. // Delay_ms(500); 62. // GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100 63. // Delay_ms(500); 64. // GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000 65. // Delay_ms(500); 66. // GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000 67. // Delay_ms(500); 68. // GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000 69. // Delay_ms(500); 70. // GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000 71. // Delay_ms(500); 72. // GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000 73. // Delay_ms(500); 74. 75. } 76. } 77.
年前回顾一下点流水灯~