今天学习的是按键按下的时候点灯,我将上节课的代码封装起来,方便这节课使用,封装代码如下:
LED.h
- #ifndef __LED_H__
- #define __LED_H__
-
- #include "STC32G_Delay.h"
-
- /*!
- \brief 初始化 LED
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void led_init();
-
- /*!
- \brief 打开所有灯
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void turn_on_all_led();
-
- /*!
- \brief 关闭所有灯
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void turn_off_all_led();
-
- /*!
- \brief 延迟函数
-
- \param[in] status [u8] : 灯的状态, 0 或 1
- \param[in] start [u16]: 起始索引, 取值范围[0, 7]
- \param[in] step [u16]: 移动步长
- \param[in] flowing [u16]: 是否是流水灯, 1: 流水不灭, 0: 走马单亮
- \param[out] none
- \retval none
- */
- void marquee(u8 status, u16 start, int step, u16 flowing);
-
- /*!
- \brief SOS 灯
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void led_sos();
-
- #endif
复制代码
LED.c
- #include "LED.h"
-
- /*!
- \brief 初始化 LED
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void led_init() { P2M1 = 0x00, P2M0 = 0x00; }
-
- /*!
- \brief 打开所有灯
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void turn_on_all_led() {
- P27 = P26 = P25 = P24 = P23 = P22 = P21 = P20 = 0;
- }
-
- /*!
- \brief 关闭所有灯
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void turn_off_all_led() {
- P27 = P26 = P25 = P24 = P23 = P22 = P21 = P20 = 1;
- }
-
- /*!
- \brief 延迟函数
-
- \param[in] status [u8] : 灯的状态, 0 或 1
- \param[in] start [u16]: 起始索引, 取值范围[0, 7]
- \param[in] step [u16]: 移动步长
- \param[in] flowing [u16]: 是否是流水灯, 1: 流水不灭, 0: 走马单亮
- \param[out] none
- \retval none
- */
- void marquee(u8 status, u16 start, int step, u16 flowing) {
- u16 i = 0;
- status = status ? 1 : 0;
- for(i = start; i < 8 && i >= 0; i+= step) {
- switch(i) {
- case 0: P20 = status; break; case 1: P21 = status; break;
- case 2: P22 = status; break; case 3: P23 = status; break;
- case 4: P24 = status; break; case 5: P25 = status; break;
- case 6: P26 = status; break; case 7: P27 = status; break;
- }
- delay_ms(10);
- if(!flowing) {
- turn_off_all_led();
- }
- }
- }
-
- /*!
- \brief SOS 灯
-
- \param[in] none
- \param[out] none
- \retval none
- */
- void led_sos() {
- int i = 0;
- unsigned int times = 0;
- for(i = 0; i < 9; i++) {
- times = i < 3 || i > 5 ? 100 : 300;
- turn_on_all_led();
- delay_ms(times);
- turn_off_all_led();
- delay_ms(times);
- }
- }
复制代码
main.c
- #include "stc_usb_auto_download.h"
-
- // ==============================================================================================
- // 按键点灯
- // 在开发板的右上方有八个共阳 LED 灯。对应的引脚是 P20...7
- // 在开发板的左下方有四个按键。对应的引脚是 P32...5
- // ==============================================================================================
-
- #include "LED.h"
-
- int main() {
- int key_released = 1; // 标识位: 记录按键上一次按下的状态
- auto_usb_hid_download(); // 开启自动下载
- led_init(); // 设置为准双向口
-
- P3M0 &= ~0x08; P3M1 &= ~0x08; // 将按键 P33 设置为准双向
- led_sos(); // SOS 闪灯效果
-
- while (1) {
- if(P33 == 0 && key_released == 1) {
- // 按下
- key_released = 0;
- turn_on_all_led();
- } else if(P33 == 1 && key_released == 0) {
- // 弹起
- key_released = 1;
- turn_off_all_led();
- }
- delay_ms(10);
- }
- }
复制代码
|