本期Funpack活动选用的板卡:
Microchip的8位PIC MCU开发板DM164137。
任务要求:
通过按键扩展功能,分为按键点击(快速点击),短按(大于1秒),长按(大于5秒)用来控制板上LED显示。同时外接串口模块打印信息(包括按键信息,电位计信息)。
设计思路:
该板子上共有四个LED灯,从右到左可依次命名为“LED1、LED2、LED3和LED4”,首先判断是否按压按键(命名为Button),若按下按键(if),开始计时,按键结束后结束计时,得到按下时长;若未按下按键(else),开始执行亮灯操作。
接着考虑如何打印电位信息,团队成员郑泽华手头正好有一块Arduino UNO板子,我们便想到可以用这块板子来打印Curiosity板的电位信息。
程序流程:
当按键按下时开启定时器,并且LED1开始常亮;短按后LED2常亮;长按1s以上5s以下后LED3常亮;当长按5s以上后LED4常亮。
Pin module配置如下:
其它配置:
ADC配置如下:
将主频设为32MHz:
时钟配置等基本为默认配置:
主要代码如下:
MPLAB X IDE(C语言):
while (1)
{
int press_time = 0;
while (1)
{
LED1_SetHigh();
if (!Button_GetValue())
{
__delay_ms(15);
if (!Button_GetValue())
{
press_time++;
}
}
else
{
__delay_ms(15);
if (Button_GetValue())
{
if (press_time < 5)
{
continue;
}
if (press_time >= 200)
{
if(LED4_LAT == 0)
{
LED4_SetHigh();
}
else
{
LED4_SetLow();
}
}
else if (press_time >= 70)
{
if(LED3_LAT == 0)
{
LED3_SetHigh();
}
else
{
LED3_SetLow();
}
}
else if (press_time >= 5)
{
if(LED2_LAT == 0)
{
LED2_SetHigh();
}
else
{
LED2_SetLow();
}
}
press_time = 0;
}
}
}
}
Arduino:
void setup() {
pinMode(A0,INPUT);//RC0
pinMode(A1,INPUT);//LED1 RA5
pinMode(A2,INPUT);//LED2 RA1
pinMode(A3,INPUT);//LED3 RA2
pinMode(A4,INPUT);//LED4 RC5
Serial.begin(9600);
}
void loop()
{
Serial.print("Volt=");
Serial.println(analogRead(A0));
Serial.print("LED1=");
Serial.println(analogRead(A1));
Serial.print("LED2=");
Serial.println(analogRead(A2));
Serial.print("LED3=");
Serial.println(analogRead(A3));
Serial.print("LED4=");
Serial.println(analogRead(A4));
delay(1000);
}
心得体会:
我是在学院老师的推荐中得知此次Funpack活动,开始主动去了解单片机以及MPLAB IDE和Kicad的使用方法,并且在同学的帮助下接触了Arduino语言;也参考了电子森林网站中其他玩家的案例分享,从其他人的分享中学习到了很多东西,逐渐了解了MPLAB IDE中MCC插件配置初始化的使用,但对于其中EUSART以及ADC等不太了解如何去具体配置;这次活动的的确确教会了我不少东西,使我发掘了自身对于电子电路的兴趣,我也会继续抓紧学习单片机的相关知识,力争参加暑期的电子设计大赛。