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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

又來麻煩大家啦,按鍵切換兩個程序,始終沒整成功,求大佬們指點,謝謝

[復制鏈接]
跳轉到指定樓層
樓主
ID:1105755 發表于 2024-6-26 23:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
又來麻煩大家啦,按鍵切換兩個程序,始終沒整成功,求大佬們指點,謝謝!
用兩個按鍵切換disp0和disp1,兩個程序都可獨立運行,加上按鍵切換就是切換不了,請大佬指點!本人也是剛學,繞不明白啦。感謝

單片機源程序如下:
  1. #include <STC8h.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[6];        //產生的隨機數
  9. uchar num1[1];
  10. uchar num2[7];        //產生的隨機數
  11. uchar num3[2];
  12. uchar cnt;                //計數變量
  13. uchar str[5]= {0xff,0xff,0xff,0xff,0xff};         //定義數組存放35個LED數據
  14. uchar str1[2]= {0xff,0xff};                                        //定義數組存放12個LED數據

  15. void Delay_Us(int i);                //延時函數
  16. void Timer_Init(void);                //定時器初始化
  17. void UART_Init(void);                //串口初始化
  18. void UART_Send(uchar dat);        //串口發送數據
  19. //主函數
  20. void disp0()
  21. {
  22.     uchar i,j,k;                        //定義變量
  23.     UART_Init();                           //串口初始化
  24.     Timer_Init();                           //定時器初始化

  25.     P7M0=0X00;P7M1=0X00;//設置P0口為準雙向口狀態,弱上位
  26.            P2M0=0X00;P2M1=0X00;
  27.            P4M0=0X00;P4M1=0X00;
  28.            P0M0=0X00;P0M1=0X00;
  29.     P1M0=0X00;P1M1=0X00;
  30.         P3M0=0X00;P3M1=0X00;
  31.     P6M0=0X00;P6M1=0X00;

  32.     {   //35個LED初始狀態,全部熄滅
  33.         UART_Send(str[i]);
  34.     }


  35.     P0=0xff;                          //12個LED初始狀態,全部熄滅
  36.     P1=0xff;
  37.         P2=0xff;                          //12個LED初始狀態,全部熄滅
  38.     P3=0xff;
  39.         P4=0xff;                          //12個LED初始狀態,全部熄滅
  40.     P6=0xff;
  41.         P7=0xff;



  42.     while(1)
  43.     {
  44.         if(flag)         //定時時間到
  45.         {
  46.             flag=0;         //標志位清零
  47.             /*----33抽取6個LED-----*/
  48.             for(i=0; i<5; i++)         //所有燈熄滅
  49.             {
  50.                 str[i]=0xff;
  51.             }
  52.             for(i=0; i<6; i++)
  53.             {
  54.                 k=rand()%33; //產生隨機數0-32
  55.                 for(j=0; j<i ; j++)
  56.                 {
  57.                     while(num[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  58.                     {
  59.                         k=rand()%33;
  60.                     }
  61.                 }
  62.                 num[i]=k;
  63.                 str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機數轉換為對應的LED數據
  64.             }
  65.              P2=str[0];                          //控制35個LED點亮
  66.              P0=str[1];
  67.                          P7=str[2];                          //控制35個LED點亮
  68.              P6=str[3];
  69.                          P1=str[4];
  70.             {
  71.                 UART_Send(str[i]);
  72.             }



  73.             /*----16抽取1個LED-----*/
  74.             str1[0]=0xff;                          //12個LED全部熄滅
  75.             str1[1]=0xff;
  76.             for(i=0; i<1; i++)
  77.             {
  78.                 k=rand()%16; //產生隨機數0-15
  79.                 for(j=0; j<i ; j++)
  80.                 {
  81.                     while(num1[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  82.                     {
  83.                         k=rand()%16;
  84.                     }
  85.                 }
  86.                 num1[i]=k;
  87.                 str1[num1[i]/8]&=~(0x01<<(num1[i]%8));         //將隨機數轉換為對應的LED數據
  88.             }
  89.             P4=str1[0];                          //控制16個LED點亮
  90.             P3=str1[1];
  91.         }


  92.     if(Key1==0)//按鍵開始
  93. {
  94.   Delay_Us(500);//延時消抖
  95.    if(Key1==0)
  96. {
  97.   TR0 =!TR0;
  98. }
  99.             while(Key1==0);        //按鍵松手檢測
  100.         }
  101.         if(Key1==0)        //按鍵停止
  102.         {
  103.             Delay_Us(500);        //延時消抖
  104.             if(Key1==0)
  105.             {
  106.                 TR0=0;


  107.                 /*----33抽取6個LED-----*/
  108.                 for(i=0; i<5; i++) //所有燈熄滅
  109.                 {
  110.                     str[i]=0xff;
  111.                 }
  112.                 for(i=0; i<6; i++)
  113.                 {
  114.                     k=rand()%33; //產生隨機數0-32
  115.                     for(j=0; j<i ; j++)
  116.                     {
  117.                         while(num[j]==k)//如果產生的隨機數與之前的相同,則重新生成
  118.                         {
  119.                             k=rand()%33;
  120.                         }
  121.                     }
  122.                     num[i]=k;
  123.                     str[num[i]/8]&=~(0x01<<(num[i]%8));        //將隨機數轉換為對應的LED數據
  124.                 }
  125.                 P2=str[0];                          //控制35個LED點亮
  126.                 P0=str[1];
  127.                             P7=str[2];                          //控制35個LED點亮
  128.                 P6=str[3];
  129.                             P1=str[4];
  130.                 {
  131.                     UART_Send(str[i]);
  132.                 }


  133.                 /*----16抽取1個LED-----*/
  134.                 str1[0]=0xff;                          //12個LED全部熄滅
  135.                     str1[1]=0xff;
  136.                 for(i=0; i<1; i++)
  137.                 {
  138.                     k=rand()%16; //產生隨機數0-15
  139.                     for(j=0; j<i ; j++)
  140.                     {
  141.                         while(num1[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  142.                         {
  143.                             k=rand()%16;
  144.                         }
  145.                     }
  146.                     num1[i]=k;
  147.                     str1[num1[i]/8]&=~(0x01<<(num1[i]%8));         //將隨機數轉換為對應的LED數據
  148.                 }
  149.                 P4=str1[0];                          //控制16個LED點亮
  150.                 P3=str1[1];
  151.             }
  152.             while(Key1==0);        //按鍵松手檢測
  153.         }
  154.     }
  155. }




  156. void disp1()
  157. {
  158.     uchar i,j,k;                        //定義變量
  159.     UART_Init();                           //串口初始化
  160.     Timer_Init();                           //定時器初始化

  161.     P7M0=0X00;P7M1=0X00;//設置P0口為準雙向口狀態,弱上位
  162.            P2M0=0X00;P2M1=0X00;
  163.            P4M0=0X00;P4M1=0X00;
  164.            P0M0=0X00;P0M1=0X00;
  165.     P1M0=0X00;P1M1=0X00;
  166.         P3M0=0X00;P3M1=0X00;
  167.     P6M0=0X00;P6M1=0X00;

  168.     {   //35個LED初始狀態,全部熄滅
  169.         UART_Send(str[i]);
  170.     }


  171.     P0=0xff;                          //12個LED初始狀態,全部熄滅
  172.     P1=0xff;
  173.         P2=0xff;                          //12個LED初始狀態,全部熄滅
  174.     P3=0xff;
  175.         P4=0xff;                          //12個LED初始狀態,全部熄滅
  176.     P6=0xff;
  177.         P7=0xff;



  178.     while(2)
  179.     {
  180.         if(flag)         //定時時間到
  181.         {
  182.             flag=0;         //標志位清零
  183.             /*----33抽取7個LED-----*/
  184.             for(i=0; i<5; i++)         //所有燈熄滅
  185.             {
  186.                 str[i]=0xff;
  187.             }
  188.             for(i=0; i<7; i++)
  189.             {
  190.                 k=rand()%33; //產生隨機數0-32
  191.                 for(j=0; j<i ; j++)
  192.                 {
  193.                     while(num2[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  194.                     {
  195.                         k=rand()%33;
  196.                     }
  197.                 }
  198.                 num2[i]=k;
  199.                 str[num2[i]/8]&=~(0x01<<(num2[i]%8));         //將隨機數轉換為對應的LED數據
  200.             }
  201.              P2=str[0];                          //控制35個LED點亮
  202.              P0=str[1];
  203.                          P7=str[2];                          //控制35個LED點亮
  204.              P6=str[3];
  205.                          P1=str[4];
  206.             {
  207.                 UART_Send(str[i]);
  208.             }



  209.             /*----16抽取2個LED-----*/
  210.             str1[0]=0xff;                          //12個LED全部熄滅
  211.             str1[1]=0xff;
  212.             for(i=0; i<2; i++)
  213.             {
  214.                 k=rand()%16; //產生隨機數0-15
  215.                 for(j=0; j<i ; j++)
  216.                 {
  217.                     while(num3[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  218.                     {
  219.                         k=rand()%16;
  220.                     }
  221.                 }
  222.                 num3[i]=k;
  223.                 str1[num3[i]/8]&=~(0x01<<(num3[i]%8));         //將隨機數轉換為對應的LED數據
  224.             }
  225.             P4=str1[0];                          //控制16個LED點亮
  226.             P3=str1[1];
  227.         }


  228.    if(Key2==0)//按鍵開始
  229. {
  230.   Delay_Us(500);//延時消抖
  231.    if(Key2==0)
  232. {
  233.   TR0 =!TR0;
  234. }
  235.             while(Key2==0);        //按鍵松手檢測
  236.         }
  237.         if(Key2==0)        //按鍵停止
  238.         {
  239.             Delay_Us(500);        //延時消抖
  240.             if(Key2==0)
  241.             {
  242.                 TR0=0;


  243.                 /*----33抽取7個LED-----*/
  244.                 for(i=0; i<5; i++) //所有燈熄滅
  245.                 {
  246.                     str[i]=0xff;
  247.                 }
  248.                 for(i=0; i<7; i++)
  249.                 {
  250.                     k=rand()%33; //產生隨機數0-32
  251.                     for(j=0; j<i ; j++)
  252.                     {
  253.                         while(num2[j]==k)//如果產生的隨機數與之前的相同,則重新生成
  254.                         {
  255.                             k=rand()%33;
  256.                         }
  257.                     }
  258.                     num2[i]=k;
  259.                     str[num2[i]/8]&=~(0x01<<(num2[i]%8));        //將隨機數轉換為對應的LED數據
  260.                 }
  261.                 P2=str[0];                          //控制35個LED點亮
  262.                 P0=str[1];
  263.                             P7=str[2];                          //控制35個LED點亮
  264.                 P6=str[3];
  265.                             P1=str[4];
  266.                 {
  267.                     UART_Send(str[i]);
  268.                 }


  269.                 /*----16抽取2個LED-----*/
  270.                 str1[0]=0xff;                          //12個LED全部熄滅
  271.                     str1[1]=0xff;
  272.                 for(i=0; i<2; i++)
  273.                 {
  274.                     k=rand()%16; //產生隨機數0-15
  275.                     for(j=0; j<i ; j++)
  276.                     {
  277.                         while(num3[j]==k)         //如果產生的隨機數與之前的相同,則重新生成
  278.                         {
  279.                             k=rand()%16;
  280.                         }
  281.                     }
  282.                     num3[i]=k;
  283.                     str1[num3[i]/8]&=~(0x01<<(num3[i]%8));         //將隨機數轉換為對應的LED數據
  284.                 }
  285.                 P4=str1[0];                          //控制16個LED點亮
  286.                 P3=str1[1];
  287.             }
  288.             while(Key2==0);        //按鍵松手檢測
  289.         }
  290.     }
  291. }


  292. void main()
  293. {
  294. while(1)
  295. {
  296.          if(Key1==0)//按鍵開始
  297. {
  298. Delay_Us(500);//延時消抖
  299. if(Key1==0)
  300. {
  301. disp0(); //12選2
  302. }
  303. while(Key1==0);
  304.   }

  305.       if(Key2==0)//按鍵開始
  306. {
  307. Delay_Us(500);//延時消抖
  308. if(Key2==0)
  309. {
  310. disp1(); //12選4
  311. }
  312. while(Key2==0);
  313.   }
  314. }
  315. }




  316. //延時函數
  317. void Delay_Us(int i)
  318. {
  319.     while(i--);
  320. }
  321. //定時器初始化
  322. void Timer_Init(void)
  323. {
  324.     TMOD|=0x01; //打開定時器0,1,工作方式1。
  325.     TH0=0x3c;        //給定時器0賦初值,定時50ms
  326.     TL0=0xb0;
  327.     ET0=1;      //打開定時器0中斷允許
  328.     TR0=0;                //打開定時器
  329.     PS=1;
  330.     EA=1;       //打開總中斷
  331. }
  332. //串口初始化
  333. void UART_Init(void)
  334. {
  335.     SM0=0;                //串口模式0:同步移位寄存器方式
  336.     SM1=0;
  337.     TI=0;                //發送中斷清零
  338. }
  339. //串口發送數據,移位寄存器模式
  340. void UART_Send(uchar dat)
  341. {

  342.     SBUF=dat;          //LED數據
  343.     while(~TI);                 //等待發送完成
  344.     TI=0;                        //標志位清零

  345. }
  346. //定時器0中斷函數disp0
  347. void Timer0() interrupt 1
  348. {
  349.     TH0=0x3c;   //定時50ms
  350.     TL0=0xb0;
  351.     cnt++;                //中斷計數
  352.     if(cnt==3)
  353.     {
  354.         cnt=0;
  355.         flag=1;        //標志位置1
  356.     }
  357. }
復制代碼

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

使用道具 舉報

沙發
ID:1105755 發表于 2024-6-26 23:19 | 只看該作者
剛開始整,判斷按鍵這個地方始終沒整對,拜托大家給看看怎么改,萬分感謝!
回復

使用道具 舉報

板凳
ID:1109793 發表于 2024-6-27 07:37 | 只看該作者
水平有限,程序太長,根本看不懂。單片機還能取隨機數?上電時不是都清零了嗎?就算不清零,那點內存能取幾個啊?
回復

使用道具 舉報

地板
ID:1121801 發表于 2024-6-27 08:13 | 只看該作者
給你個檢驗程序是否有問題的方法,你可以編寫一個超級簡單的兩個子程序,每個子程序只一個引腳輸出,這樣子程序就會極大簡化,這時候再加上你想實現的按鍵轉換功能,因為程序超級簡單,很容易就可以分析出來到底是按鍵程序問題還是延時問題等等,可以試驗你的想法到底是不是可以實現的。如果按鍵對兩個簡單子程序是可以實現操控的,那么再在兩個子程序上去更改,取得你想要的功能。
回復

使用道具 舉報

5#
ID:53813 發表于 2024-6-27 09:58 | 只看該作者
第210行,WHILE(2)是什么意思?
回復

使用道具 舉報

6#
ID:1121700 發表于 2024-6-27 10:16 | 只看該作者
估計是按鍵消抖的問題,先單獨測試按鍵消抖程序是否正常。
回復

使用道具 舉報

7#
ID:192020 發表于 2024-6-27 10:37 | 只看該作者
別的不說,347行main函數已經結束了,349行后的應該會報錯吧?
回復

使用道具 舉報

8#
ID:846819 發表于 2024-6-27 17:13 | 只看該作者
disp0()和disp1()都是無限循環的任務,while(1)沒有退出語句,進入任何一個任務都不能返回。試下在兩個任務的合適位置加個break看看可以不。
回復

使用道具 舉報

9#
ID:1105755 發表于 2024-6-28 09:58 | 只看該作者
cyi8 發表于 2024-6-27 08:13
給你個檢驗程序是否有問題的方法,你可以編寫一個超級簡單的兩個子程序,每個子程序只一個引腳輸出,這樣子 ...

好,我試試
回復

使用道具 舉報

10#
ID:1105755 發表于 2024-6-28 09:59 | 只看該作者
三極管一樣的人 發表于 2024-6-27 09:58
第210行,WHILE(2)是什么意思?

我是業余選手,這個是用別人的程序改的
回復

使用道具 舉報

11#
ID:1105755 發表于 2024-6-28 10:00 | 只看該作者
tgyd 發表于 2024-6-27 17:13
disp0()和disp1()都是無限循環的任務,while(1)沒有退出語句,進入任何一個任務都不能返回。試下在兩個任務 ...

我試試吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产农村妇女毛片精品久久麻豆 | 日韩精品视频中文字幕 | 99久久电影| 中文字幕欧美一区 | 欧美日韩亚洲成人 | 麻豆久久| 性欧美xxxx| 亚洲一视频 | 欧美影院 | 欧美日韩久久精品 | 成人午夜精品 | 欧美视频 | 国产成人av在线播放 | 涩涩视频在线播放 | 亚洲一区电影 | 国产乱码精品一区二区三区忘忧草 | 亚洲精品自在在线观看 | 久久99精品国产 | 天天操夜夜拍 | 午夜成人免费视频 | 国产成人精品免高潮在线观看 | 国产在线视频网 | 精品国产高清一区二区三区 | 高清黄色 | 国产精品美女久久久久久免费 | 午夜在线影院 | 一区二区三区视频 | a视频在线观看 | 亚洲成人免费电影 | 日韩欧美大片在线观看 | 成人精品免费视频 | avtt国产| 午夜资源 | 九九久久这里只有精品 | 久久精品国产清自在天天线 | 国产又爽又黄的视频 | 久久精品色欧美aⅴ一区二区 | 国产精品久久久久久久久久久久久 | 午夜寂寞影院列表 | 老熟女毛片 | 日韩视频专区 |