亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3187|回復: 13
打印 上一主題 下一主題
收起左側(cè)

有兩種單片機流水燈形式,想要加兩個按鍵切換流水燈模式,程序應該怎么改,謝謝

[復制鏈接]
回帖獎勵 50 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:1105755 發(fā)表于 2024-5-20 21:53 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
新手求助:有兩種流水燈形式,想加兩個按鍵切換流水燈模式,按鍵程序搞半天也沒整明白,請高人指點,謝謝!按鍵1執(zhí)行 void disp0()
按鍵2執(zhí)行 void disp1()
請大佬們幫幫忙,萬分感謝!
單片機源程序如下:
#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ù)
void delay(uint time)        //延時函數(shù)
{
        uint x,y;
        for(x=time;x>0;x--)
        for(y=110;y>0;y--);
}

void disp0()                        //狀態(tài)1 LED順時針轉(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)
        {        
         disp0();                //狀態(tài)1 LED順時針轉(zhuǎn)一圈
        disp1();                //狀態(tài)0 所有LED閃爍3次
  }

}



93caf1d444a37d821636c66be211e3c.png (42.97 KB, 下載次數(shù): 18)

93caf1d444a37d821636c66be211e3c.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1080935 發(fā)表于 2024-5-21 08:18 | 只看該作者
定義按鍵端口
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)用對應函數(shù),調(diào)用完后變量清零。這相當于只調(diào)用一次的任務。
回復

使用道具 舉報

板凳
ID:743654 發(fā)表于 2024-5-21 08:58 | 只看該作者
先定義兩個按鍵參數(shù)sbit k1=P1^6; sbit k2=P1^7;  主函數(shù):        if(k1==0)        //檢測按鍵K1是否按下{delay(1000);   //消除抖動 一般大約10ms  if(k1==0)         //再次判斷按鍵是否按下{disp0();   //模式1}while(!k1);         //檢測按鍵1是否松開              if(k2==0)        //檢測按鍵K2是否按下{delay(1000);   //消除抖動 一般大約10ms  if(k2==0)//再次判斷按鍵是否按下{disp1();   //模式2}while(!k2);         //檢測按鍵2是否松開
回復

使用道具 舉報

地板
ID:1109793 發(fā)表于 2024-5-21 09:25 | 只看該作者
if(按鍵1)disp0();
if(按鍵2)disp1();
回復

使用道具 舉報

5#
ID:1105755 發(fā)表于 2024-5-23 20:28 | 只看該作者
LaoYuTou 發(fā)表于 2024-5-21 08:18
定義按鍵端口
sbit key1 =  P1^6;
sbit key2 =  P1^7;

謝謝!剛開始弄,研究一下
回復

使用道具 舉報

6#
ID:1105755 發(fā)表于 2024-5-23 20:29 | 只看該作者
cheney03 發(fā)表于 2024-5-21 08:58
先定義兩個按鍵參數(shù)sbit k1=P1^6; sbit k2=P1^7;  主函數(shù):        if(k1==0)        //檢測按鍵K1是否按下{delay(1000);  ...

謝謝!我弄一下試試。
回復

使用道具 舉報

7#
ID:1105755 發(fā)表于 2024-5-23 20:30 | 只看該作者
xiaobendan001 發(fā)表于 2024-5-21 09:25
if(按鍵1)disp0();
if(按鍵2)disp1();

謝謝!
回復

使用道具 舉報

8#
ID:6467 發(fā)表于 2025-11-6 21:56 | 只看該作者
你這個程序;容易出現(xiàn)按鍵響應不靈敏的情況;delay時間越大;約明顯;不信你試一試。
回復

使用道具 舉報

9#
ID:876947 發(fā)表于 2025-12-5 12:26 | 只看該作者
哈哈哈!我竟然為兩套流水燈程序在一塊板子上整了兩塊cpu!
回復

使用道具 舉報

10#
ID:123917 發(fā)表于 2025-12-5 16:36 | 只看該作者
中斷應該可以,試試看
回復

使用道具 舉報

11#
ID:1156764 發(fā)表于 2025-12-5 17:59 | 只看該作者
這是用標識符的方式,
第一步:把disp1() 和disp0() 記作狀態(tài)1和狀態(tài)0
第二步:新增定義
   sbit key1 =  P1^6;
   sbit key2 =  P1^7;
   ledstate=0;//默認狀態(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)象:
默認上電是狀態(tài)0,點擊key1切換為狀態(tài)0,點擊key2切換為狀態(tài)1,同時點擊key1key2會優(yōu)先狀態(tài)0
回復

使用道具 舉報

12#
ID:101869 發(fā)表于 2025-12-5 19:08 | 只看該作者
#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ù)
sbit key = P1 ^ 1;
uchar led_mod = 0; // 模式  0=關(guān)  1=LED順時針轉(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ù)
{
    uint x, y;
    for (x = time; x > 0; x--)
        for (y = 110; y > 0; y--)
            ;
}

void disp0() // 狀態(tài)1 LED順時針轉(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順時針轉(zhuǎn)一圈
            break;
        case 2:
            disp1(); // 狀態(tài)0 所有LED閃爍3次
            break;
        default:
            break;
        }
    }
}

回復

使用道具 舉報

13#
ID:1160531 發(fā)表于 2026-1-5 15:31 | 只看該作者
建議使用外部中斷的方式,這樣的話對按鍵動作能及時響應,至于哪個按鍵按下執(zhí)行什么樣的功能邏輯,再分別寫兩個功能函數(shù)進行條件對應即可。功能沒通的情況下,可以先少用幾個LED,通了之后再控制多個。
回復

使用道具 舉報

14#
ID:1160531 發(fā)表于 2026-1-5 15:34 | 只看該作者
按鍵判斷程序,供參考while (1)
  {
                                 //正向運動按鍵 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);
               
                //反向運動按鍵 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);
                       
                        }
               
                }
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表