任務(wù)要求:
- ZigBee節(jié)點盒通電或重置,節(jié)點盒的LED1、LED2燈都不亮。
- 長按SW1鍵不松開,LED1燈亮,LED2燈熄滅。
- 松開SW1鍵,LED1、LED2亮燈都常亮。
- 雙擊SW1可以控制LED1燈實現(xiàn)呼吸燈效果,LED2燈保持熄滅狀態(tài)。
- 再次雙擊SW1可以控制LED1維持當(dāng)前亮度不再發(fā)生變化,LED2繼續(xù)保持熄滅狀態(tài)。
- 將編寫好的程序發(fā)布到藍(lán)色ZigBee節(jié)點盒中。
任務(wù)分析:
這道題其實并不難,主要考的是思維邏輯,這邊我們只寫平常常用的按鍵與呼吸燈,通過變量控制來達(dá)到想要的效果,不用定時器,只在循環(huán)中完成任務(wù)。我們按照任務(wù)步驟一步一步開發(fā),先寫初始化,然后編寫按鍵觸發(fā)代碼,最后在相應(yīng)位置加入燈的效果。
代碼實現(xiàn):
?※本次代碼使用library版競賽工程
在工程app目錄下新建Breath.c與.h文件,該呼吸燈代碼是從別的工程移植過來的,有明顯bug,建議動手修改,改不來留言
以下為Breath.c文件,
#include "iocc2530.h"
#include "Breath.h"
#define false 0
#define true 1
unsigned char levelCount = 8;
unsigned char led_levet_timer = 2;
unsigned char devideCount = 16;
unsigned char level = 1;
unsigned char timeTic = 0;
unsigned char isUprise = 1;
void _pwmLevelUp() {
static unsigned long led_level_tick = 0;
led_level_tick++;
if (led_level_tick > led_levet_timer) {
led_level_tick = 0;
if (isUprise)
level++;
else
level--;
if (level > levelCount) {
level = levelCount;
isUprise = false;
} else if (level == 0) {
isUprise = true;
}
}
}
void _pwm() {
timeTic++;
if (timeTic > level) {
P1_0 = 1;
}
if (timeTic > levelCount) {
timeTic = 0;
P1_0 = 0;
}
}
unsigned char timeDevice = 0;
void _breathLed() {
timeDevice++;
if (timeDevice >= devideCount) {
timeDevice = 0;
_pwmLevelUp();
}
_pwm();
}
以下為Breath.h文件
#ifndef _BREATH_H_
#define _BREATH_H_
#endif
void _pwm(void);
void _breathLed(void);
以下為Main.c內(nèi)容
引入頭文件,定義所需變量
#include "Breath.h"
#define Sw1 P1_2
#define Led1 P1_0
#define Led2 P1_1
unsigned int keyTime=0, keyCnt=0, bFlag=0;
//keyTime長按時間,keyCnt按鍵次數(shù),bFlag是否呼吸1呼吸0暫停
初始化函數(shù),基本io最簡化版
void Init()
{
P1DIR = 0X1B;
P1=0X00;
}
以下為按鍵功能,比較簡單,不理解就自己斷點跑一跑
void key()
{
if(Sw1==0)
{
keyTime = 0;
while(Sw1==0)
{
halMcuWaitMs(1);
//按下時間大于300ms視為長按,
if(++keyTime>300)
{
Led1 = 1;
Led2 = 0;
}
}
if(Sw1==1)
{
//長按后燈全部亮起,短按則計算按鍵次數(shù)
if(keyTime>300)
Led1 = Led2 = 1;
else
keyCnt+=1;
}
}
//0.3s內(nèi)沒有第二次點擊按鈕則失效當(dāng)前次數(shù)
//短時間內(nèi)連續(xù)觸發(fā)即為連擊
if(keyCnt>1)
{
halMcuWaitMs(1);
if(++keyTime>300)
{
if(bFlag==0)
bFlag=1;
else if(bFlag==1)
bFlag=2;
else if(bFlag==2)
bFlag=1;
keyCnt=0;
}
}
}
以下為呼吸燈控制代碼
void BreathLed()
{
//幾連擊就填幾
if(keyCnt==2)
{
Led2=0;
bFlag=!bFlag;
keyCnt=0;
}
if(bFlag==1)
_breathLed();
else if(bFlag==2)
_pwm();
}
以下為main函數(shù)
void main(void)
{
Init();
while(1)
{
halMcuWaitMs(1);
key();
BreathLed();
}
}
main.c源代碼文章來源:http://www.zghlxwxcb.cn/news/detail-719263.html
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
* By :Azhuo
******************************************************************************
*/
#include <string.h>
#include <stdio.h>
#include "basic_rf.h"
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "hal_uart.h"
#include "Breath.h"
#define Sw1 P1_2
#define Led1 P1_0
#define Led2 P1_1
unsigned int keyTime=0, keyCnt=0, bFlag=0;
//keyTime長按時間,keyCnt按鍵次數(shù),bFlag是否呼吸1呼吸0暫停
void Init()
{
P1DIR = 0X1B;
P1=0X00;
}
void key()
{
if(Sw1==0)
{
keyTime = 0;
while(Sw1==0)
{
halMcuWaitMs(1);
//按下時間大于300ms視為長按,
if(++keyTime>300)
{
Led1 = 1;
Led2 = 0;
}
}
if(Sw1==1)
{
//長按后燈全部亮起,短按則計算按鍵次數(shù)
if(keyTime>300)
Led1 = Led2 = 1;
else
keyCnt+=1;
}
}
//0.3s內(nèi)沒有第二次點擊按鈕則失效當(dāng)前次數(shù)
//短時間內(nèi)連續(xù)觸發(fā)即為連擊
if(keyCnt>1)
{
halMcuWaitMs(1);
if(++keyTime>300)
{
if(bFlag==0)
bFlag=1;
else if(bFlag==1)
bFlag=2;
else if(bFlag==2)
bFlag=1;
keyCnt=0;
}
}
}
void BreathLed()
{
//幾連擊就填幾
if(keyCnt==2)
{
Led2=0;
bFlag=!bFlag;
keyCnt=0;
}
if(bFlag==1)
_breathLed();
else if(bFlag==2)
_pwm();
}
/**
* Main application entry point.
*/
void main(void)
{
Init();
while(1)
{
halMcuWaitMs(1);
key();
BreathLed();
}
}
今天的訓(xùn)練就到這,下了鬼泣5所以比較急,代碼是有些bug的,不過如果這點bug都解決不了就別比了,加油各位,奧利給。文章來源地址http://www.zghlxwxcb.cn/news/detail-719263.html
到了這里,關(guān)于【23物聯(lián)網(wǎng)國賽樣題第二套】單片機,CC2530單片機呼吸燈與按鍵控制--單擊雙擊長按、呼吸燈與亮度維持,物聯(lián)網(wǎng)競賽今年歷年國賽樣題真題代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!