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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機如何利用矩陣鍵盤上的一個鍵實現一個設備的啟停

[復制鏈接]
跳轉到指定樓層
樓主
ID:65580 發表于 2024-4-9 09:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
C51單片機如何利用矩陣鍵盤上的一個鍵實現一個設備的啟停---下面的程序是想實現在矩陣鍵盤檢測到13#鍵時,第一次為打開照明燈,松開后燈繼續亮,第二次按這個鍵時,松開手燈滅的功能,單獨運行本程序正常,加到switch--case語句中就不能運行了,怎樣解決此問題,我測試時用過取反程序--由于按鍵持續按住,燈不停亮滅實現不了此功能。

        case 13:      ///*照明控制*/
                                                                if(step==13)
                                                                {
                                                                        Delay_ms(10);
                                                                        if(step==13)
                                                                        {
                                                //                                LCD_ShowString(1,1,"                ");
                                                                                LCD_ShowString(1,1,"lighting control");//在第1行照明控制
                                                                                
                                                                                LIGKZ_cnt++;
                                                                                
                                                                                if(LIGKZ_cnt==1)
                                                                                {
                                                                                        LIGKZ=1;        
                                                                                        LCD_ShowString(2,1,"Status:  LightOn");//在第2行燈亮                                       
                                                                                }
                                                                         if(LIGKZ_cnt==2)
                                                                                 {
                                                                                        LIGKZ=0;
                                                                                        LCD_ShowString(2,1,"Status: LightOff");//在第2行燈亮               
                                                                                        LIGKZ_cnt=0;
                                                                                }                                
                                                               
                                                                                while(step==13)
                                                                                {        
                                                                                        Delay_ms(20);
//                                                                                        LIGKZ=~LIGKZ;
                                                                                        led0=1;  //測試燈         

                                                                                }
////                                                                                                LIGKZ=~LIGKZ;
                                                                        }        
                                                                }        
//                                                                led0=~led0;  //測試燈         
                                                                break;

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

使用道具 舉報

沙發
ID:161164 發表于 2024-4-9 13:25 | 只看該作者
代碼不完整
盲猜
1. step 用完沒清零
2. step 在delay期間在哪更新?
if(step==13)
{
Delay_ms(10);
if(step==13)
回復

使用道具 舉報

板凳
ID:65580 發表于 2024-4-10 11:18 | 只看該作者
1:step是采用矩陣鍵盤中的鍵輸入數據,松鍵step=0.
2:好像問題在于松手檢測--跳不出來:     
                                                                           while(step==13)
                                                                                {        
                                                                                        Delay_ms(20);
//                                                                                        LIGKZ=~LIGKZ;
                                                                                        led0=1;  //測試燈         

                                                                                }
回復

使用道具 舉報

地板
ID:65580 發表于 2024-4-10 14:13 | 只看該作者
lkc8210 發表于 2024-4-9 13:25
代碼不完整
盲猜
1. step 用完沒清零

下面是全部的程序
void main(void)
{
        uchar PWKZ_cnt=0;//電源控制標志位,按鈕次數
        uchar LIGKZ_cnt=0;//照明控制標志位,按鈕次數
        PWKZ=0;//24V電源控制
        LIGKZ=0;//照明控制初始化
        P2=0;//所有電機不工作
        LCD_Init();//LCD初始化

        while(1)
        {
                if(S1==0) {step=13;} else {step=0;}//S1臨時測試按鈕,測試完成后由矩陣鍵盤輸入step值
               
                switch(step)
                {
                        case 0:{      
                                                M1ZZ=0; //所有電機停止轉動
                                                M1FZ=0;
                                                M2ZZ=0;
                                                M2FZ=0;
                                                M3ZZ=0;
                                                M3FZ=0;
                                                M4ZZ=0;
                                                M4FZ=0;
                                                LCD_ShowNum(1,13,step,2);
                                                break;
                                        }
                        case 1:M1ZZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M1正轉
                        case 2:M2ZZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M2正轉
                        case 3:M3ZZ=1;M4ZZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M3,M4正轉
                        case 4:M3ZZ=1;M4FZ=1;LCD_ShowNum(1,13,step,2);break;   //電機M3正轉,M4反轉
                                               
                        case 5:M1FZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M1反轉
                        case 6:M2FZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M2發轉
                        case 7:M3FZ=1;M4FZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M3,M4反轉
                        case 8:M3FZ=1;M4ZZ=1;LCD_ShowNum(1,13,step,2);break;   //電機M3反轉,M4正轉
                                               
                        case 9:M1ZZ=1;M2ZZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M1與M2正轉
                        case 10:M1FZ=1;M2FZ=1;LCD_ShowNum(1,13,step,2);break;  //電機M1與M2反轉
                        case 11:M1FZ=1;M2FZ=1;M3FZ=1;M4FZ=1;LCD_ShowNum(1,13,step,2);break;  //所有電機電機M1,M2,M3,M4反轉
                        case 12:M1ZZ=1;M2ZZ=1;M3ZZ=1;M4ZZ=1;LCD_ShowNum(1,13,step,2);break;   //所有電機電機M1,M2,M3,M4正轉
                                               
                        case 13:    /*照明控制程序*/         
                                        if(step==13)  
                                        {
                                                Delay_ms(10);
                                                if(step==13)
                                                {
                        //                                LCD_ShowString(1,1,"                ");
                                                        LCD_ShowString(1,1,"lighting control");//在第1行照明控制
                                                       
                                                        LIGKZ_cnt++;
                                                       
                                                        if(LIGKZ_cnt==1)
                                                        {
                                                                LIGKZ=1;        //燈亮
                                                                LCD_ShowString(2,1,"Status:  LightOn");//在第2行燈亮                                       
                                                        }
                                                 if(LIGKZ_cnt==2)
                                                        {
                                                                LIGKZ=0;//燈滅
                                                                LCD_ShowString(2,1,"Status: LightOff");//在第2行燈亮               
                                                                LIGKZ_cnt=0;
                                                        }                               
                                       
                                                        while(step==13)
                                                        {       
                                                                Delay_ms(20);
                                                        }
                                                }       
                                        }       

                                       
                                                        break;
                                                               
                        case 14:
                                        if(step==14)
                                        {
                                                Delay_ms(10);
                                                if(step==14)
                                                {
                        //                                LCD_ShowString(1,1,"                ");
                                                        LCD_ShowString(1,1,"At stopped state");//在第1行照明控制-LCD顯示
                                                       
                                                        PWKZ_cnt++;
                                                       
                                                        if(PWKZ_cnt==1)
                                                        {
                                                                PWKZ=1;       
                                                                LCD_ShowString(2,1,"Status:Operation");//在第2行燈亮-LCD顯示                                       
                                                        }
                                                 if(PWKZ_cnt==2)
                                                        {
                                                                PWKZ=0;
                                                                LCD_ShowString(2,1," Please unlock  ");//在第2行燈亮-LCD顯示               
                                                                PWKZ_cnt=0;
                                                        }                                                               
                                       
                                                        while(step==14)
                                                        {               
                                                                Delay_ms(10);
                                                        }
                                                       
                                                }       
                                        }               
                                                        break;
                                                       
                        case 15:break;  //備用
                        case 16:break;   //備用
                                               
                }
        }
}
回復

使用道具 舉報

5#
ID:161164 發表于 2024-4-10 16:17 | 只看該作者
while(step==13)
step沒地方更新,死循環了
回復

使用道具 舉報

6#
ID:65580 發表于 2024-4-11 09:42 | 只看該作者
lkc8210 發表于 2024-4-10 16:17
while(step==13)
step沒地方更新,死循環了

這句S1按鈕松開后,step=0,
if(S1==0) {step=13;} else {step=0;}//S1臨時測試按鈕,測試完成后由矩陣鍵盤輸入step值
回復

使用道具 舉報

7#
ID:161164 發表于 2024-4-11 10:48 | 只看該作者
lss9310 發表于 2024-4-11 09:42
這句S1按鈕松開后,step=0,
if(S1==0) {step=13;} else {step=0;}//S1臨時測試按鈕,測試完成后由矩陣鍵 ...

你了解while(step==13)是啥意思嗎?
都死循環了,還咋跳出去跑if(S1==0) {step=13;} else {step=0;}?
回復

使用道具 舉報

8#
ID:453974 發表于 2024-4-11 13:33 | 只看該作者
lkc8210 發表于 2024-4-11 10:48
你了解while(step==13)是啥意思嗎?
都死循環了,還咋跳出去跑if(S1==0) {step=13;} else {step=0;}?

他說的對,你程序卡死在while里面了,在while里面把條件清零跳出循環
回復

使用道具 舉報

9#
ID:1109793 發表于 2024-4-11 20:07 | 只看該作者
在case 13里面再搞個if(step==13),有意思嗎?
回復

使用道具 舉報

10#
ID:65580 發表于 2024-4-12 08:33 | 只看該作者
本帖最后由 lss9310 于 2024-4-12 11:02 編輯
xiaobendan001 發表于 2024-4-11 20:07
在case 13里面再搞個if(step==13),有意思嗎?

本意是松手檢測,我的想法是這樣的,如沒有這句while(step==13)則LIGKZ_cnt++;一直在加。具體這個功能能實現嗎,麻煩給一個程序。謝謝
回復

使用道具 舉報

11#
ID:1109793 發表于 2024-4-12 19:37 | 只看該作者
lss9310 發表于 2024-4-12 08:33
本意是松手檢測,我的想法是這樣的,如沒有這句while(step==13)則LIGKZ_cnt++;一直在加。具體這個功能能 ...

case:后面加{},我還是不太習慣。
既然你要在松手時動作,那就放case 0:里面才對吧。
你試試看
uchar kt;
然后在case 13:里面kt = 13;
然后在case 0:里面
if(kt==13){}
這樣行不行
回復

使用道具 舉報

12#
ID:65580 發表于 2024-4-13 13:49 | 只看該作者
xiaobendan001 發表于 2024-4-12 19:37
case:后面加{},我還是不太習慣。
既然你要在松手時動作,那就放case 0:里面才對吧。
你試試看

測試之后,不行。C51單片機利用矩陣鍵盤上的一個鍵(同樣一個鍵值),實現同一臺設備的第一次按按鍵啟動,第二次按按鍵停止的控制,能否實現呢
回復

使用道具 舉報

13#
ID:1109793 發表于 2024-4-13 15:59 | 只看該作者
lss9310 發表于 2024-4-13 13:49
測試之后,不行。C51單片機利用矩陣鍵盤上的一個鍵(同樣一個鍵值),實現同一臺設備的第一次按按鍵啟動 ...

當然可以實現啊,那里不行?把改動的代碼發上來看看唄
回復

使用道具 舉報

14#
ID:65580 發表于 2024-4-14 08:45 | 只看該作者
xiaobendan001 發表于 2024-4-13 15:59
當然可以實現啊,那里不行?把改動的代碼發上來看看唄

之前我的程序已經上傳,而且要求也描述了,你看看怎么能實現此功能呢,請求幫助提供一個程序,因為之前我試了很多沒成功,謝謝 !
回復

使用道具 舉報

15#
ID:1109793 發表于 2024-4-14 09:36 | 只看該作者
lss9310 發表于 2024-4-14 08:45
之前我的程序已經上傳,而且要求也描述了,你看看怎么能實現此功能呢,請求幫助提供一個程序,因為之前我 ...

之前的不能用,我說的方法你可能沒試過。然后我也沒有硬件,沒辦法測試是否能用。只能靠你自己了。
回復

使用道具 舉報

16#
ID:161164 發表于 2024-4-15 11:17 | 只看該作者
lss9310 發表于 2024-4-11 09:42
這句S1按鈕松開后,step=0,
if(S1==0) {step=13;} else {step=0;}//S1臨時測試按鈕,測試完成后由矩陣鍵 ...
  1. void main(void)
  2. {
  3.         uchar PWKZ_cnt=0;//電源控制標志位,按鈕次數
  4.         uchar LIGKZ_cnt=0;//照明控制標志位,按鈕次數
  5.         PWKZ=0;//24V電源控制
  6.         LIGKZ=0;//照明控制初始化
  7.         P2=0;//所有電機不工作
  8.         LCD_Init();//LCD初始化

  9.         while(1)
  10.         {
  11.                 if(S1==0)
  12.                 {
  13.                         Delay_ms(10);
  14.                         if(S1==0)
  15.                         {
  16.                                 step=13;   //S1臨時測試按鈕,測試完成后由矩陣鍵盤輸入step值
  17.                                 while(SI==0);
  18.                         }
  19.                 }
  20.                 else
  21.                 {
  22.                         step=0;
  23.                 }

  24.                 switch(step)
  25.                 {
  26.                         case 0:
  27.                         {
  28.                                 M1ZZ=0; //所有電機停止轉動
  29.                                 M1FZ=0;
  30.                                 M2ZZ=0;
  31.                                 M2FZ=0;
  32.                                 M3ZZ=0;
  33.                                 M3FZ=0;
  34.                                 M4ZZ=0;
  35.                                 M4FZ=0;
  36.                                 LCD_ShowNum(1,13,step,2);
  37.                                 break;
  38.                         }
  39.                         case 1:
  40.                                 M1ZZ=1;
  41.                                 LCD_ShowNum(1,13,step,2);
  42.                                 break;  //電機M1正轉
  43.                         case 2:
  44.                                 M2ZZ=1;
  45.                                 LCD_ShowNum(1,13,step,2);
  46.                                 break;  //電機M2正轉
  47.                         case 3:
  48.                                 M3ZZ=1;
  49.                                 M4ZZ=1;
  50.                                 LCD_ShowNum(1,13,step,2);
  51.                                 break;  //電機M3,M4正轉
  52.                         case 4:
  53.                                 M3ZZ=1;
  54.                                 M4FZ=1;
  55.                                 LCD_ShowNum(1,13,step,2);
  56.                                 break;   //電機M3正轉,M4反轉

  57.                         case 5:
  58.                                 M1FZ=1;
  59.                                 LCD_ShowNum(1,13,step,2);
  60.                                 break;  //電機M1反轉
  61.                         case 6:
  62.                                 M2FZ=1;
  63.                                 LCD_ShowNum(1,13,step,2);
  64.                                 break;  //電機M2發轉
  65.                         case 7:
  66.                                 M3FZ=1;
  67.                                 M4FZ=1;
  68.                                 LCD_ShowNum(1,13,step,2);
  69.                                 break;  //電機M3,M4反轉
  70.                         case 8:
  71.                                 M3FZ=1;
  72.                                 M4ZZ=1;
  73.                                 LCD_ShowNum(1,13,step,2);
  74.                                 break;   //電機M3反轉,M4正轉

  75.                         case 9:
  76.                                 M1ZZ=1;
  77.                                 M2ZZ=1;
  78.                                 LCD_ShowNum(1,13,step,2);
  79.                                 break;  //電機M1與M2正轉
  80.                         case 10:
  81.                                 M1FZ=1;
  82.                                 M2FZ=1;
  83.                                 LCD_ShowNum(1,13,step,2);
  84.                                 break;  //電機M1與M2反轉
  85.                         case 11:
  86.                                 M1FZ=1;
  87.                                 M2FZ=1;
  88.                                 M3FZ=1;
  89.                                 M4FZ=1;
  90.                                 LCD_ShowNum(1,13,step,2);
  91.                                 break;  //所有電機電機M1,M2,M3,M4反轉
  92.                         case 12:
  93.                                 M1ZZ=1;
  94.                                 M2ZZ=1;
  95.                                 M3ZZ=1;
  96.                                 M4ZZ=1;
  97.                                 LCD_ShowNum(1,13,step,2);
  98.                                 break;   //所有電機電機M1,M2,M3,M4正轉

  99.                         case 13:    /*照明控制程序*/
  100.                                 //                                LCD_ShowString(1,1,"                ");
  101.                                 LCD_ShowString(1,1,"lighting control");//在第1行照明控制

  102.                                 LIGKZ_cnt++;

  103.                                 if(LIGKZ_cnt==1)
  104.                                 {
  105.                                         LIGKZ=1;        //燈亮
  106.                                         LCD_ShowString(2,1,"Status:  LightOn");//在第2行燈亮
  107.                                 }
  108.                                 if(LIGKZ_cnt==2)
  109.                                 {
  110.                                         LIGKZ=0;//燈滅
  111.                                         LCD_ShowString(2,1,"Status: LightOff");//在第2行燈亮
  112.                                         LIGKZ_cnt=0;
  113.                                 }
  114.                                 step = 0;
  115.                                 break;

  116.                         case 14:
  117.                                 if(step==14)
  118.                                 {
  119.                                         Delay_ms(10);
  120.                                         if(step==14)
  121.                                         {
  122.                                                 //                                LCD_ShowString(1,1,"                ");
  123.                                                 LCD_ShowString(1,1,"At stopped state");//在第1行照明控制-LCD顯示

  124.                                                 PWKZ_cnt++;

  125.                                                 if(PWKZ_cnt==1)
  126.                                                 {
  127.                                                         PWKZ=1;
  128.                                                         LCD_ShowString(2,1,"Status:Operation");//在第2行燈亮-LCD顯示
  129.                                                 }
  130.                                                 if(PWKZ_cnt==2)
  131.                                                 {
  132.                                                         PWKZ=0;
  133.                                                         LCD_ShowString(2,1," Please unlock  ");//在第2行燈亮-LCD顯示
  134.                                                         PWKZ_cnt=0;
  135.                                                 }

  136.                                                 while(step==14)
  137.                                                 {
  138.                                                         Delay_ms(10);
  139.                                                 }

  140.                                         }
  141.                                 }
  142.                                 break;

  143.                         case 15:
  144.                                 break;  //備用
  145.                         case 16:
  146.                                 break;   //備用

  147.                 }
  148.         }
  149. }
復制代碼
回復

使用道具 舉報

17#
ID:65580 發表于 2024-4-24 09:48 | 只看該作者

謝謝!這樣用S1鍵模擬,達到同一個鍵按二次實現了設備的啟動與停止。我的程序本意是通過485通信,主機接收到數據是13,即step=13,這個值二次實現設備的啟動與停止,此程序修改為下面沒能實現想要的控制:                                        key_val=re_buf[0];//key_val--接收485傳過來的數據
//                                if(key_val!=13) {step=key_val;s2=1;}
                                if(key_val==13) {s2=0;}
                                if(s2==0)
                                {
                                                                Delay_ms(10);
                                                                if(s2==0)
                                                                {
                                                                                                step=13;   //S1臨時測試按鈕,測試完成后由矩陣鍵盤輸入step值
                                                                                                while(key_val==0);
                                                                }
                                }
                                else
                                {
                                                                step=key_val;
                                                                s2=1;
                                }

請教我怎么能實現此功能呢,麻煩給一個程序,謝謝!
回復

使用道具 舉報

18#
ID:161164 發表于 2024-4-24 10:31 | 只看該作者
lss9310 發表于 2024-4-24 09:48
謝謝!這樣用S1鍵模擬,達到同一個鍵按二次實現了設備的啟動與停止。我的程序本意是通過485通信,主機接 ...

你一開始就說是485就不用浪費15天
回復

使用道具 舉報

19#
ID:1109793 發表于 2024-4-24 10:59 | 只看該作者
lss9310 發表于 2024-4-24 09:48
謝謝!這樣用S1鍵模擬,達到同一個鍵按二次實現了設備的啟動與停止。我的程序本意是通過485通信,主機接 ...
  1. if(key_val==13){
  2.         key_val = 0;
  3.         s2 = !s2;
  4. }

復制代碼
回復

使用道具 舉報

20#
ID:344848 發表于 2024-4-24 14:45 | 只看該作者

使用D觸發器搭建的一個電路便可以實現!
回復

使用道具 舉報

21#
ID:344848 發表于 2024-4-24 14:52 | 只看該作者
單片機外圍接一個D觸發器,或使用CPLD搭建一個D觸發器,接受485信號后,就可以實現上述功能。
回復

使用道具 舉報

22#
ID:344848 發表于 2024-4-24 14:58 | 只看該作者
實際工程講究快速和可靠,以最短的時間完成項目。
回復

使用道具 舉報

23#
ID:1109793 發表于 2024-4-24 15:18 | 只看該作者
donglw 發表于 2024-4-24 14:45
使用D觸發器搭建的一個電路便可以實現!

人家是要軟件解決的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91av免费版 | 亚洲精品久久久一区二区三区 | 特黄视频 | 色一阁| 国产原创在线观看 | 日韩中文不卡 | 国产精品九九九 | 99这里只有精品 | 欧美日韩视频在线播放 | 麻豆久久久久久久 | 1区2区视频| 91在线免费观看网站 | 精品欧美一区免费观看α√ | 国产黄色在线观看 | 91精品国产一区二区三区香蕉 | 免费一区 | 一级大片免费 | 国产成人精品一区二区三区网站观看 | 日日噜噜噜夜夜爽爽狠狠视频97 | 成人午夜性成交 | 蜜桃视频成人 | 国产第二页 | 午夜一区二区三区在线观看 | 国产91色在线 | 亚洲 | www.夜夜草| 久久一区 | 91新视频| 一区二区三区在线免费观看视频 | 一区二区三区四区免费观看 | 精品欧美乱码久久久久久1区2区 | 91在线资源| 亚洲v日韩v综合v精品v | 91视频在线| 精品国产乱码久久久 | 国产一区二区三区视频 | 热久久免费视频 | 天天综合天天 | 久久精品视频免费看 | a级片在线观看 | 在线免费观看黄色网址 | 久久一区二区视频 |