熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2024-5-20 21:53
正文摘要:新手求助:有兩種流水燈形式,想加兩個(gè)按鍵切換流水燈模式,按鍵程序搞半天也沒(méi)整明白,請(qǐng)高人指點(diǎn),謝謝!按鍵1執(zhí)行 void disp0() 按鍵2執(zhí)行 void disp1() 請(qǐng)大佬們幫幫忙,萬(wàn)分感謝! 單片機(jī)源程序如下: #incl ... |
|
按鍵判斷程序,供參考while (1) { //正向運(yùn)動(dòng)按鍵 KEY1 判斷 if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)) { HAL_Delay(100); if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)) { printf("key1 press down\r\n"); if(motor1_dir_flg==zheng) motor1_dir_flg = fan; else motor1_dir_flg = zheng; } HAL_Delay(10); } if(motor1_dir_flg) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); } HAL_Delay(10); //反向運(yùn)動(dòng)按鍵 KEY2 判斷 if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)) { HAL_Delay(10); if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)) { printf("key2 press down\r\n"); if(motor2_dir_flg==zheng) motor2_dir_flg=fan; else motor2_dir_flg=zheng; } HAL_Delay(10); } if(motor2_dir_flg) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET); } HAL_Delay(10); //調(diào)速控制按鍵 KEY3 判斷 if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)) { HAL_Delay(10); if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)) { if(motor_speed<1000) { printf("the current speed: %d\r\n",motor_speed); motor_speed+=100; __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,motor_speed); } else { motor_speed = 100; __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,motor_speed); printf("the current speed: %d\r\n",motor_speed); } HAL_Delay(500); } } |
| 建議使用外部中斷的方式,這樣的話對(duì)按鍵動(dòng)作能及時(shí)響應(yīng),至于哪個(gè)按鍵按下執(zhí)行什么樣的功能邏輯,再分別寫(xiě)兩個(gè)功能函數(shù)進(jìn)行條件對(duì)應(yīng)即可。功能沒(méi)通的情況下,可以先少用幾個(gè)LED,通了之后再控制多個(gè)。 |
|
#include <REGX52.H> #define uint unsigned int #define uchar unsigned char uchar code table0[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // LED從低位往高位移 uchar code table1[] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; // LED從高位往低位移 uchar i, j; // 定義循環(huán)變量 uint tt = 70; // 定義時(shí)間指數(shù) sbit key = P1 ^ 1; uchar led_mod = 0; // 模式 0=關(guān) 1=LED順時(shí)針轉(zhuǎn)一圈 2=所有LED閃爍3次 void key_scan() { static uint key_cnt = 0; static bit key_flag = 0; if (key) { key_cnt = 0; key_flag = 0; } else if (!key_flag) { key_cnt++; if (key_cnt >= 1000) { key_flag = 1; led_mod++; if (led_mod > 2) led_mod = 0; } } } void delay(uint time) // 延時(shí)函數(shù) { uint x, y; for (x = time; x > 0; x--) for (y = 110; y > 0; y--) ; } void disp0() // 狀態(tài)1 LED順時(shí)針轉(zhuǎn)一圈 { for (i = 0; i < 8; i++) { P2 = table1[i]; delay(100); } P2 = 0xff; for (i = 0; i < 8; i++) { P0 = table0[i]; delay(100); } P0 = 0xff; } void disp1() // 狀態(tài)0 所有LED閃爍3次 { for (i = 0; i < 3; i++) { P0 = 0x00; P2 = 0x00; delay(300); P0 = 0xff; P2 = 0xff; delay(300); } } void main() { while (1) { key_scan(); switch (led_mod) { case 0: // 關(guān)閉的代碼 break; case 1: disp0(); // 狀態(tài)1 LED順時(shí)針轉(zhuǎn)一圈 break; case 2: disp1(); // 狀態(tài)0 所有LED閃爍3次 break; default: break; } } } |
|
這是用標(biāo)識(shí)符的方式, 第一步:把disp1() 和disp0() 記作狀態(tài)1和狀態(tài)0 第二步:新增定義 sbit key1 = P1^6; sbit key2 = P1^7; ledstate=0;//默認(rèn)狀態(tài)0 第三步:while(1)循環(huán)改為 while(1) { if(ledstate==0) { disp0(); } else if(ledstate==1) { disp1(); } if(key1==0) { ledstate=0; } else if(key2==0) { ledstate=1; } }第四現(xiàn)象: 默認(rèn)上電是狀態(tài)0,點(diǎn)擊key1切換為狀態(tài)0,點(diǎn)擊key2切換為狀態(tài)1,同時(shí)點(diǎn)擊key1key2會(huì)優(yōu)先狀態(tài)0 |
| 中斷應(yīng)該可以,試試看 |
| 哈哈哈!我竟然為兩套流水燈程序在一塊板子上整了兩塊cpu! |
| 你這個(gè)程序;容易出現(xiàn)按鍵響應(yīng)不靈敏的情況;delay時(shí)間越大;約明顯;不信你試一試。 |
xiaobendan001 發(fā)表于 2024-5-21 09:25 謝謝! |
cheney03 發(fā)表于 2024-5-21 08:58 謝謝!我弄一下試試。 |
LaoYuTou 發(fā)表于 2024-5-21 08:18 謝謝!剛開(kāi)始弄,研究一下 |
|
if(按鍵1)disp0(); if(按鍵2)disp1(); |
| 先定義兩個(gè)按鍵參數(shù)sbit k1=P1^6; sbit k2=P1^7; 主函數(shù): if(k1==0) //檢測(cè)按鍵K1是否按下{delay(1000); //消除抖動(dòng) 一般大約10ms if(k1==0) //再次判斷按鍵是否按下{disp0(); //模式1}while(!k1); //檢測(cè)按鍵1是否松開(kāi) if(k2==0) //檢測(cè)按鍵K2是否按下{delay(1000); //消除抖動(dòng) 一般大約10ms if(k2==0)//再次判斷按鍵是否按下{disp1(); //模式2}while(!k2); //檢測(cè)按鍵2是否松開(kāi) |
|
定義按鍵端口 sbit key1 = P1^6; sbit key2 = P1^7; 在主循環(huán)中while(1)中改為 { if(!key1) {//可以考慮消抖,仿真中可不用。 disp0(); while(!key1);//等待按鍵釋放 } if(!key2) { disp1(); while(!key2);//等待按鍵釋放 } } 這種方法不是特別推薦,可以額外定義一邊量作為狀態(tài)初始為0,按鍵按下后狀態(tài)改變(1或2),根據(jù)狀態(tài)調(diào)用對(duì)應(yīng)函數(shù),調(diào)用完后變量清零。這相當(dāng)于只調(diào)用一次的任務(wù)。 |
Powered by 單片機(jī)教程網(wǎng)