- /*******************************************************************************
- * [url=home.php?mod=space&uid=247401]@brief[/url] 输出
- *******************************************************************************/
- typedef struct
- {
- void (*en)(void);
- void (*dis)(void);
- void (*out)(uint8_t st);
- void (*tog)(void);
- uint8_t (*out_st)(void);
- void (*dir_out_pp)(void); //推挽输出
- void (*dir_out_od)(void); //开漏输出
- } port_out_pin_type;
- /*******************************************************************************
- * [url=home.php?mod=space&uid=247401]@brief[/url] 同相OUT定义
- *******************************************************************************/
- #ifndef PORT_PIN_CTEAT
- #define port_out_pin_make(name, port, pin) \
- extern const port_out_pin_type name
- #else
- #define port_out_pin_make(name, port, pin) \
- void name##_pin_en(void) { gpio_out_high(port, pin); } \
- void name##_pin_dis(void) { gpio_out_low(port, pin); } \
- void name##_pin_out(uint8_t st) { gpio_out_set(port, pin, st); } \
- void name##_pin_tog(void) { gpio_out_tog(port, pin); } \
- uint8_t name##_pin_out_st(void) { return gpio_out_get(port, pin); } \
- void name##_dir_out_pp(void) { gpio_dir_out_pp(port, pin); } \
- void name##_dir_out_od(void) { gpio_dir_out_od(port, pin); } \
- const port_out_pin_type name = { \
- name##_pin_en, \
- name##_pin_dis, \
- name##_pin_out, \
- name##_pin_tog, \
- name##_pin_out_st, \
- name##_dir_out_pp, \
- name##_dir_out_od}
- #endif
- /*******************************************************************************
- * @brief 输入
- *******************************************************************************/
- typedef struct
- {
- uint8_t (*in_st)(void);
- void (*dir_in_ft)(void); //浮空输入
- void (*dir_in_up)(void); //上拉输入
- void (*dir_in_dn)(void); //下拉输入
- } port_in_pin_type;
- /*******************************************************************************
- * @brief 反相IN定义
- *******************************************************************************/
- #ifndef PORT_PIN_CTEAT
- #define port_nin_pin_make(name, port, pin) \
- extern const port_in_pin_type name
- #else
- #define port_nin_pin_make(name, port, pin) \
- uint8_t name##_pin_in_st(void) { return !gpio_in_get(port, pin); } \
- void name##_dir_in_ft(void) { gpio_dir_in_ft(port, pin); } \
- void name##_dir_in_up(void) { gpio_dir_in_up(port, pin); } \
- void name##_dir_in_dn(void) { gpio_dir_in_dn(port, pin); } \
- const port_in_pin_type name = { \
- name##_pin_in_st, \
- name##_dir_in_ft, \
- name##_dir_in_up, \
- name##_dir_in_dn, \
- }
- #endif
IO对象创建
- port_out_pin_make(o_led1, PB, 5);
- port_out_pin_make(o_led2, PB, 4);
- port_out_pin_make(o_led3, PA, 8);
- #define led_r o_led3
- #define led_g o_led1
- #define led_b o_led2
- // KEY
- port_nin_pin_make(key1, PA, 4);
- port_nin_pin_make(key2, PA, 5);
- port_nin_pin_make(key3, PA, 6);
初始化
- key1.dir_in_up();
- key2.dir_in_up();
- key3.dir_in_up();
-
- led_r.dir_out_pp();
- led_g.dir_out_pp();
- led_b.dir_out_pp();
流水灯控制,每200ms循环左移,位数为5实现关闭两个周期。
- void sys_led_ctr(void)
- {
- static word_tt st = {1};
- if(sys_st.pulse.bPulse_20ms)
- {
- o_led1.out(0);
- o_led2.out(0);
- o_led3.out(0);
- }
-
- // 位移
- if (sys_st.pulse.bPulse_200ms)
- {
- st.uval = bit16_roll_shift_left(st.uval, 5, 1);
- // 输出
- o_led1.out(st.bits.b0);
- o_led2.out(st.bits.b1);
- o_led3.out(st.bits.b2);
- }
- }
按键取值
- void sys_tick_exe(void)
- {
- static uint8_t ticks = 0;
- ticks ++;
-
- if((ticks & 0x03) == 0)
- {
- uint16_t key_rd = 0;
-
- if(key1.in_st())
- key_rd |= 1;
- if(key2.in_st())
- key_rd |= 2;
- if(key3.in_st())
- key_rd |= 4;
-
- key_st_sample(&sys_st.key, 4, key_rd);
- }
- }
按键测试,按下对应按键打印按键信息
- void sys_key_ctr(void)
- {
- key_st_handle(&sys_st.key, sys_st.pulse.bPulse_100ms);
-
- if(sys_st.key.found_edge & 1)
- {
- dbg_puts("key 1 press down ! \n");
- }
-
- if(sys_st.key.found_edge & 2)
- {
- dbg_puts("key 2 press down ! \n");
- }
-
- if(sys_st.key.found_edge & 4)
- {
- dbg_puts("key 3 press down ! \n");
- }
-
- if(sys_st.key.lost_edge & 1)
- {
- dbg_puts("key 1 release ! \n");
- }
-
- if(sys_st.key.lost_edge & 2)
- {
- dbg_puts("key 2 release ! \n");
- }
-
- if(sys_st.key.lost_edge & 4)
- {
- dbg_puts("key 3 release ! \n");
- }
- }
附上KEIL测试工程,MDK5.35
software_led.rar
(3.02 MB, 下载次数: 12)