本次任务
通过按键扩展功能,分为按键点击(快速点击),短按(大于1秒),长按(大于5秒)用来控制板上LED显示。同时外接串口模块打印信息(包括按键信息,电位计信息)
硬件引脚图
ADC
TIMER
主要代码
三种按键模式 对应的时间
click 100 -1000mspress 1000ms -5000mslong press > 5000ms
枚举记录几种状态typedef enum{STATE_START,STATE_CLICK,STATE_PRESS,STATE_LONG,STATE_MAX, };
不同状态对应的操作函数:打印ADC 对应的按键操作
void set_led_state(int state){int adc_value = 0;adc_value = ADCC_GetSingleConversion(channel_ANC0);printf("ADC value:%d \r\n",adc_value);switch(state){case STATE_CLICK:D1_SetHigh();D2_SetLow();D3_SetLow();printf("Click\r\n");break;case STATE_PRESS:D1_SetHigh();D2_SetHigh();D3_SetLow();printf("Press\r\n");break;case STATE_LONG:D1_SetHigh();D2_SetHigh();D3_SetHigh();printf("Long Press\r\n");break;case STATE_START:case STATE_MAX:default:printf("default\r\n");D1_SetLow();D2_SetLow();D3_SetLow();break;}}
主循环按照100ms delay循环检测按键状态,并在释放后执行相应的操作.
void main(void){int press_down = 0;int last_time = 0;int state = STATE_START;// initialize the deviceSYSTEM_Initialize();// set all led offset_led_state(STATE_START);while (1){press_down = Button_GetValue();// printf("press_down:%d last_time:%d state:%d\r\n",press_down,last_time,state);if(press_down){// key upif(state > STATE_START){set_led_state(state);}last_time = 0;state = 0 ;// printf("return\r\n");}else{//key down last_time++;//click 100 -1000msif(last_time <= (PRESS_TIME/100) && last_time > 0){state = STATE_CLICK;}//press 1000ms -5000mselse if(last_time > (PRESS_TIME/100) && last_time <= (LONG_TIME/100)){state = STATE_PRESS;}//long press > 5000mselse if(last_time > (LONG_TIME/100)){state = STATE_LONG;}}// delay 100ms once__delay_ms(100);}}
心得体会
感谢主办方,活动非常有意义.
学习,思考,分享.大家都能从中学到很多知识.
要是我读大学时,有这样的活动,我的技术肯定会更好;)