標(biāo)題: 又來(lái)麻煩大家啦,按鍵切換兩個(gè)程序,始終沒(méi)整成功,求大佬們指點(diǎn),謝謝 [打印本頁(yè)]

作者: cxy822    時(shí)間: 2024-6-26 23:00
標(biāo)題: 又來(lái)麻煩大家啦,按鍵切換兩個(gè)程序,始終沒(méi)整成功,求大佬們指點(diǎn),謝謝
又來(lái)麻煩大家啦,按鍵切換兩個(gè)程序,始終沒(méi)整成功,求大佬們指點(diǎn),謝謝!
用兩個(gè)按鍵切換disp0和disp1,兩個(gè)程序都可獨(dú)立運(yùn)行,加上按鍵切換就是切換不了,請(qǐng)大佬指點(diǎn)!本人也是剛學(xué),繞不明白啦。感謝

單片機(jī)源程序如下:
  1. #include <STC8h.H>
  2. #include <stdlib.h>                        //庫(kù)文件,使用隨機(jī)數(shù)發(fā)生函數(shù)

  3. typedef unsigned char uchar; //無(wú)符號(hào)字符型數(shù)據(jù)
  4. typedef unsigned int  uint;         //無(wú)符號(hào)整型數(shù)據(jù)


  5. sbit Key1=P1^6;        //按鍵開(kāi)始
  6. sbit Key2=P1^7;        //按鍵停止

  7. bit flag=0;                //定時(shí)時(shí)間標(biāo)志位
  8. uchar num[6];        //產(chǎn)生的隨機(jī)數(shù)
  9. uchar num1[1];
  10. uchar num2[7];        //產(chǎn)生的隨機(jī)數(shù)
  11. uchar num3[2];
  12. uchar cnt;                //計(jì)數(shù)變量
  13. uchar str[5]= {0xff,0xff,0xff,0xff,0xff};         //定義數(shù)組存放35個(gè)LED數(shù)據(jù)
  14. uchar str1[2]= {0xff,0xff};                                        //定義數(shù)組存放12個(gè)LED數(shù)據(jù)

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

  25.     P7M0=0X00;P7M1=0X00;//設(shè)置P0口為準(zhǔn)雙向口狀態(tài),弱上位
  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個(gè)LED初始狀態(tài),全部熄滅
  33.         UART_Send(str[i]);
  34.     }


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



  42.     while(1)
  43.     {
  44.         if(flag)         //定時(shí)時(shí)間到
  45.         {
  46.             flag=0;         //標(biāo)志位清零
  47.             /*----33抽取6個(gè)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; //產(chǎn)生隨機(jī)數(shù)0-32
  55.                 for(j=0; j<i ; j++)
  56.                 {
  57.                     while(num[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  58.                     {
  59.                         k=rand()%33;
  60.                     }
  61.                 }
  62.                 num[i]=k;
  63.                 str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  64.             }
  65.              P2=str[0];                          //控制35個(gè)LED點(diǎn)亮
  66.              P0=str[1];
  67.                          P7=str[2];                          //控制35個(gè)LED點(diǎn)亮
  68.              P6=str[3];
  69.                          P1=str[4];
  70.             {
  71.                 UART_Send(str[i]);
  72.             }



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


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


  107.                 /*----33抽取6個(gè)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; //產(chǎn)生隨機(jī)數(shù)0-32
  115.                     for(j=0; j<i ; j++)
  116.                     {
  117.                         while(num[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  118.                         {
  119.                             k=rand()%33;
  120.                         }
  121.                     }
  122.                     num[i]=k;
  123.                     str[num[i]/8]&=~(0x01<<(num[i]%8));        //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  124.                 }
  125.                 P2=str[0];                          //控制35個(gè)LED點(diǎn)亮
  126.                 P0=str[1];
  127.                             P7=str[2];                          //控制35個(gè)LED點(diǎn)亮
  128.                 P6=str[3];
  129.                             P1=str[4];
  130.                 {
  131.                     UART_Send(str[i]);
  132.                 }


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




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

  161.     P7M0=0X00;P7M1=0X00;//設(shè)置P0口為準(zhǔn)雙向口狀態(tài),弱上位
  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個(gè)LED初始狀態(tài),全部熄滅
  169.         UART_Send(str[i]);
  170.     }


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



  178.     while(2)
  179.     {
  180.         if(flag)         //定時(shí)時(shí)間到
  181.         {
  182.             flag=0;         //標(biāo)志位清零
  183.             /*----33抽取7個(gè)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; //產(chǎn)生隨機(jī)數(shù)0-32
  191.                 for(j=0; j<i ; j++)
  192.                 {
  193.                     while(num2[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  194.                     {
  195.                         k=rand()%33;
  196.                     }
  197.                 }
  198.                 num2[i]=k;
  199.                 str[num2[i]/8]&=~(0x01<<(num2[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  200.             }
  201.              P2=str[0];                          //控制35個(gè)LED點(diǎn)亮
  202.              P0=str[1];
  203.                          P7=str[2];                          //控制35個(gè)LED點(diǎn)亮
  204.              P6=str[3];
  205.                          P1=str[4];
  206.             {
  207.                 UART_Send(str[i]);
  208.             }



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


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


  243.                 /*----33抽取7個(gè)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; //產(chǎn)生隨機(jī)數(shù)0-32
  251.                     for(j=0; j<i ; j++)
  252.                     {
  253.                         while(num2[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  254.                         {
  255.                             k=rand()%33;
  256.                         }
  257.                     }
  258.                     num2[i]=k;
  259.                     str[num2[i]/8]&=~(0x01<<(num2[i]%8));        //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  260.                 }
  261.                 P2=str[0];                          //控制35個(gè)LED點(diǎn)亮
  262.                 P0=str[1];
  263.                             P7=str[2];                          //控制35個(gè)LED點(diǎn)亮
  264.                 P6=str[3];
  265.                             P1=str[4];
  266.                 {
  267.                     UART_Send(str[i]);
  268.                 }


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


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

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




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

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

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


作者: cxy822    時(shí)間: 2024-6-26 23:19
剛開(kāi)始整,判斷按鍵這個(gè)地方始終沒(méi)整對(duì),拜托大家給看看怎么改,萬(wàn)分感謝!
作者: xiaobendan001    時(shí)間: 2024-6-27 07:37
水平有限,程序太長(zhǎng),根本看不懂。單片機(jī)還能取隨機(jī)數(shù)?上電時(shí)不是都清零了嗎?就算不清零,那點(diǎn)內(nèi)存能取幾個(gè)?
作者: cyi8    時(shí)間: 2024-6-27 08:13
給你個(gè)檢驗(yàn)程序是否有問(wèn)題的方法,你可以編寫(xiě)一個(gè)超級(jí)簡(jiǎn)單的兩個(gè)子程序,每個(gè)子程序只一個(gè)引腳輸出,這樣子程序就會(huì)極大簡(jiǎn)化,這時(shí)候再加上你想實(shí)現(xiàn)的按鍵轉(zhuǎn)換功能,因?yàn)槌绦虺?jí)簡(jiǎn)單,很容易就可以分析出來(lái)到底是按鍵程序問(wèn)題還是延時(shí)問(wèn)題等等,可以試驗(yàn)?zāi)愕南敕ǖ降资遣皇强梢詫?shí)現(xiàn)的。如果按鍵對(duì)兩個(gè)簡(jiǎn)單子程序是可以實(shí)現(xiàn)操控的,那么再在兩個(gè)子程序上去更改,取得你想要的功能。
作者: 三極管一樣的人    時(shí)間: 2024-6-27 09:58
第210行,WHILE(2)是什么意思?
作者: EELDFW    時(shí)間: 2024-6-27 10:16
估計(jì)是按鍵消抖的問(wèn)題,先單獨(dú)測(cè)試按鍵消抖程序是否正常。
作者: Graves    時(shí)間: 2024-6-27 10:37
別的不說(shuō),347行main函數(shù)已經(jīng)結(jié)束了,349行后的應(yīng)該會(huì)報(bào)錯(cuò)吧?
作者: tgyd    時(shí)間: 2024-6-27 17:13
disp0()和disp1()都是無(wú)限循環(huán)的任務(wù),while(1)沒(méi)有退出語(yǔ)句,進(jìn)入任何一個(gè)任務(wù)都不能返回。試下在兩個(gè)任務(wù)的合適位置加個(gè)break看看可以不。
作者: cxy822    時(shí)間: 2024-6-28 09:58
cyi8 發(fā)表于 2024-6-27 08:13
給你個(gè)檢驗(yàn)程序是否有問(wèn)題的方法,你可以編寫(xiě)一個(gè)超級(jí)簡(jiǎn)單的兩個(gè)子程序,每個(gè)子程序只一個(gè)引腳輸出,這樣子 ...

好,我試試
作者: cxy822    時(shí)間: 2024-6-28 09:59
三極管一樣的人 發(fā)表于 2024-6-27 09:58
第210行,WHILE(2)是什么意思?

我是業(yè)余選手,這個(gè)是用別人的程序改的
作者: cxy822    時(shí)間: 2024-6-28 10:00
tgyd 發(fā)表于 2024-6-27 17:13
disp0()和disp1()都是無(wú)限循環(huán)的任務(wù),while(1)沒(méi)有退出語(yǔ)句,進(jìn)入任何一個(gè)任務(wù)都不能返回。試下在兩個(gè)任務(wù) ...

我試試吧




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1