久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1315|回復: 11
打印 上一主題 下一主題
收起左側

單片機流水燈程序,想把用兩個按鍵改成用一個按鍵控制,請大佬們給看看,謝謝

[復制鏈接]
跳轉到指定樓層
樓主
ID:1105755 發表于 2024-6-16 14:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
流水燈選擇程序,現在是兩個按鍵,一個開始,一個停止,想把用兩個按鍵改成用一個按鍵控制,同一個按鍵,按一下開始,再按一下停止,改了幾次沒改明白,請大佬們給看看怎么改,謝謝!

單片機源程序如下:
  1. #include <REGX52.H>

  2. #include <stdlib.h>                        //庫文件,使用隨機數發生函數

  3. typedef unsigned char uchar; //無符號字符型數據
  4. typedef unsigned int  uint;         //無符號整型數據

  5. sbit Key1=P1^6;        //按鍵開始
  6. sbit Key2=P1^7;        //按鍵停止

  7. bit flag=0;                //定時時間標志位
  8. uchar num[2];        //產生的隨機數
  9. uchar cnt;                //計數變量
  10. uchar str[2]= {0xff,0xff};         //定義數組存放35個LED數據

  11. void Delay_Us(int i);                //延時函數
  12. void Timer_Init(void);                //定時器初始化
  13. void UART_Init(void);                //串口初始化
  14. //主函數
  15. void main(void)
  16. {
  17.     uchar i,j,k;                        //定義變量
  18.     UART_Init();                           //串口初始化
  19.     Timer_Init();                           //定時器初始化

  20.                                   //12個LED初始狀態,全部熄滅
  21.         P2=0xff;
  22.         P1=0xff;
  23.     while(1)
  24.     {
  25.         if(flag)         //定時時間到
  26.         {
  27.             flag=0;         //標志位清零
  28.             /*----12抽取2個LED-----*/
  29.                         for(i=0; i<2; i++)         //12個LED全部熄滅
  30.             {
  31.                 str[i]=0xff;
  32.             }
  33.             for(i=0; i<2; i++)
  34.             {
  35.                 k=rand()%12; //產生隨機數0-11
  36.                 for(j=0; j<i ; j++)
  37.                 {
  38.                     while(num[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  39.                     {
  40.                         k=rand()%12;
  41.                     }
  42.                 }
  43.                 num[i]=k;
  44.                 str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機數轉換為對應的LED數據
  45.             }
  46.                         
  47.                         P2=str[0];                          //控制12個LED點亮
  48.                                P1=str[1];
  49.         }
  50.         if(Key1==0)        //按鍵開始
  51.         {
  52.             Delay_Us(1000);        //延時消抖
  53.             if(Key1==0)
  54.             {
  55.                 TR0=1;
  56.             }
  57.             while(Key2==0);        //按鍵松手檢測
  58.         }
  59.         if(Key2==0)        //按鍵停止
  60.         {
  61.             Delay_Us(1000);        //延時消抖
  62.             if(Key2==0)
  63.             {
  64.                 TR0=0;
  65.                 /*----12抽取2個LED-----*/
  66.                 for(i=0; i<2; i++)         //35個LED全部熄滅
  67.                     {
  68.                         str[i]=0xff;
  69.                     }
  70.                     for(i=0; i<2; i++)
  71.                     {
  72.                         k=rand()%12; //產生隨機數0-34
  73.                         for(j=0; j<i ; j++)
  74.                         {
  75.                             while(num[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  76.                             {
  77.                                 k=rand()%12;
  78.                             }
  79.                         }
  80.                         num[i]=k;
  81.                         str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機數轉換為對應的LED數據
  82.                     }
  83.                                 
  84.                                 P2=str[0];                          //控制12個LED點亮
  85.                                 P1=str[1];
  86.             }
  87.             while(Key2==0);        //按鍵松手檢測
  88.         }
  89.     }
  90. }
  91. //延時函數
  92. void Delay_Us(int i)
  93. {
  94.     while(i--);
  95. }
  96. //定時器初始化
  97. void Timer_Init(void)
  98. {
  99.     TMOD|=0x01; //打開定時器0,1,工作方式1。
  100.     TH0=0x3c;        //給定時器0賦初值,定時50ms
  101.     TL0=0xb0;
  102.     ET0=1;      //打開定時器0中斷允許
  103.     TR0=0;                //打開定時器
  104.     PS=1;
  105.     EA=1;       //打開總中斷
  106. }
  107. //串口初始化
  108. void UART_Init(void)
  109. {
  110.     SM0=0;                //串口模式0:同步移位寄存器方式
  111.     SM1=0;
  112.     TI=0;                //發送中斷清零
  113. }

  114. //void UART_Send(uchar dat)
  115. //{
  116. //    ST=0;
  117. //    SBUF=dat;          //LED數據
  118. //    while(~TI);                 //等待發送完成
  119. //    TI=0;                        //標志位清零
  120. //    ST=1;
  121. //    ST=0;
  122. //}
  123. //定時器0中斷函數
  124. void Timer0() interrupt 1
  125. {
  126.     TH0=0x3c;   //定時50ms
  127.     TL0=0xb0;
  128.     cnt++;                //中斷計數
  129.     if(cnt==2)
  130.     {
  131.         cnt=0;
  132.         flag=1;        //標志位置1
  133.     }
  134. }
復制代碼


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

使用道具 舉報

沙發
ID:69038 發表于 2024-6-16 16:45 | 只看該作者
if (!key) key_count++;
key_count %=2;
switch (key_count)
{
case 0:
  run....
case 1:
  stop...
}

}

回復

使用道具 舉報

板凳
ID:1123322 發表于 2024-6-16 22:41 | 只看該作者
............
char Start_end_flag = 0x01;//開始結束標志位
............

void main(void)
{
............
    while(1)
    {
............
        if(Key1==0)        //按鍵開始
        {
            Delay_Us(1000);        //延時消抖
        Start_end_flag ^= 0x01;//異或運算,1^1=0,0^1=1,由此可實現0和1的切換
            if(Start_end_flag == 0)
            {
                TR0=1;
            }
                                               
            if(Start_end_flag == 1)
            {
                TR0=0;
                /*----12抽取2個LED-----*/
                for(i=0; i<2; i++)         //35個LED全部熄滅
                    {
                        str[i]=0xff;
                    }
                    for(i=0; i<2; i++)
                    {
                        k=rand()%12; //產生隨機數0-34
                        for(j=0; j<i ; j++)
                        {
                            while(num[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
                            {
                                k=rand()%12;
                            }
                        }
                        num[i]=k;
                        str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機數轉換為對應的LED數據
                    }
                              
                                P2=str[0];                          //控制12個LED點亮
                                P1=str[1];
            }               
                                               
            while(Key1==0);        //按鍵松手檢測
        }
    }
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:1121801 發表于 2024-6-17 09:43 | 只看該作者
單獨建立一個循環,讓鍵值在1與0之間循環,然后程序判斷鍵值是1還是0就行了,兩個鍵值的單鍵很好搞的
回復

使用道具 舉報

5#
ID:619259 發表于 2024-6-17 10:40 | 只看該作者
使用key1完成開和關的功能:
回復

使用道具 舉報

6#
ID:619259 發表于 2024-6-17 10:42 | 只看該作者
使用key1完成開始和停止的功能:
if(Key1==0)        //按鍵開始
        {
            Delay_Us(1000);        //延時消抖
            if(Key1==0)
            {
                TR0 = !TR0;
            }
            while(Key2==0);        //按鍵松手檢測
回復

使用道具 舉報

7#
ID:910662 發表于 2024-6-17 17:36 | 只看該作者
你這個去抖程序受書毒害嚴重啊!我都是隔一段時間讀一次,與上次相同則采用,否則繼續使用上次的值,保存本次值。
if(k_in == k_temp)k=k_in;
else k_temp=kin;
if(!k && k_old)led=!led;
k_old=k;
回復

使用道具 舉報

8#
ID:1105755 發表于 2024-6-17 19:47 | 只看該作者
zhuls 發表于 2024-6-16 16:45
if (!key) key_count++;
key_count %=2;
switch (key_count)

謝謝,剛開始搞,研究一下
回復

使用道具 舉報

9#
ID:1105755 發表于 2024-6-17 19:49 | 只看該作者
123yhk 發表于 2024-6-16 22:41
............
char Start_end_flag = 0x01;//開始結束標志位
............

謝謝,剛開始搞,我還得慢慢研究
回復

使用道具 舉報

10#
ID:1105755 發表于 2024-6-17 21:15 | 只看該作者
cy009 發表于 2024-6-17 10:42
使用key1完成開始和停止的功能:
if(Key1==0)        //按鍵開始
        {

感謝!學習中
回復

使用道具 舉報

11#
ID:1105755 發表于 2024-6-17 21:19 | 只看該作者
dhjmw 發表于 2024-6-17 17:36
你這個去抖程序受書毒害嚴重!我都是隔一段時間讀一次,與上次相同則采用,否則繼續使用上次的值,保存本 ...

哈哈,剛開始學
回復

使用道具 舉報

12#
ID:1105755 發表于 2024-6-18 22:11 | 只看該作者
非常謝謝大家!改成功啦
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久妇女国产精品影视 | 三级黄色网址 | 一区二区亚洲 | 水蜜桃久久夜色精品一区 | 久草视频网站 | 亚洲精品一区二区二区 | 在线免费观看a级片 | 日本三级网站在线观看 | 黄色精品 | 国产精品毛片一区二区三区 | 免费一级淫片aaa片毛片a级 | 欧美成人猛片aaaaaaa | 三级黄色片在线 | 午夜看电影在线观看 | 在线只有精品 | av国产精品毛片一区二区小说 | 国产亚洲网站 | 青青草原精品99久久精品66 | 蜜桃视频在线观看免费视频网站www | 国产在线一区二 | 欧美精品一区二区三区在线 | 欧美成人免费在线视频 | 在线观看中文字幕 | 欧美国产日韩在线观看成人 | 91影院 | 美女视频一区二区三区 | 精品二区| 亚洲高清视频在线观看 | 日韩一区二区在线视频 | 瑟瑟激情 | 91爱爱·com| 91影院 | 天天艹天天干天天 | www在线视频 | 亚洲专区在线 | 中文字幕一区二区三区四区 | 国产精品精品视频一区二区三区 | 午夜精品导航 | 欧美一区二区在线观看 | 精品国产乱码久久久久久丨区2区 | 国产一区二区三区亚洲 |