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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10272|回復: 14
收起左側

關于51單片機獨立按鍵程序的快速切換

[復制鏈接]
ID:421426 發表于 2018-11-5 23:00 | 顯示全部樓層 |閱讀模式
增加怎樣的程序才能使51單片機上的獨立按鍵控制的程序可以在第一個鍵還在執行的過程中就可以切換到下一個按鍵所操控的程序
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
typedef unsigned char u8;
typedef unsigned int u16;
uchar temp;      
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;   
void delay(u16 i)
{
while(i--);
}
void keypros()
{
u8 i=0;
if(k1==0)  
{   
  if(k1==0)
  {
  for(i=0;i<5;i++)  
  {   
   P2=0x55;
   delay(15000);
   P2=0xaa;
   delay(15000);
   break;
  }
  while(!k1);
}
P2=0xff;
}
{
u8 k=0;
if(k2==0)   
{   
  if(k2==0)         
  {
  {
  temp=0xfe;
  P2=temp;
  for(k=0;k<2;k++)
{
  while(temp!=0x7f)
  {
   temp=_crol_(temp,1);
   delay(5000);
   P2=temp;
  }
  temp=0x7f;
  P2=temp;
  while(temp!=0xfe)
  {
   temp=_cror_(temp,1);
   delay(5000);
   P2=temp;
  }
  break;
}
}
  while(!k2);
}
P2=0xff;
}
}
{  
u8 n=0;
if(k3==0)   
{   
  if(k3==0)
  {
  for(n=0;n<2;n++)  
  {   
   P2=0x00;
   delay(15000);
   P2=0xff;
   delay(15000);
   break;
  }
  while(!k3);
}
P2=0xff;
}
}  
if(k4==0)   
{   
  if(k4==0)  
  {   
  P2=0x00;
  }
  while(!k4);
}  
}
void main()
{
while(1)
{
  keypros();  
}  
}


回復

使用道具 舉報

ID:401564 發表于 2018-11-6 01:07 | 顯示全部樓層
想法很好,卻很不現實,51是單線程的,除去外置的模塊比如ADC,PWM,IIC之類的可以在執行指令之外同時進行,其它的,只能一條一條的去執行的

評分

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

查看全部評分

回復

使用道具 舉報

ID:89515 發表于 2018-11-6 10:04 | 顯示全部樓層
需要實時響應按鍵程序,那么就不能像你那樣寫。如果懂得狀態機的方式那很簡單。如果不懂可以用外部中斷做按鍵程序來改變標志。在你的一個個for循環的最內層判斷標志,如果標志改變就直接return。當然你的各個函數也必須工作在不同的標志之下

評分

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

查看全部評分

回復

使用道具 舉報

ID:373093 發表于 2018-11-6 11:52 | 顯示全部樓層
只能用外部中斷,但是有一定限制,如按鍵數多了不現實。

評分

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

查看全部評分

回復

使用道具 舉報

ID:421426 發表于 2018-11-6 16:59 | 顯示全部樓層
mengzhixinheng 發表于 2018-11-6 10:04
需要實時響應按鍵程序,那么就不能像你那樣寫。如果懂得狀態機的方式那很簡單。如果不懂可以用外部中斷做按 ...

您好   我是一個初學者  您說的我有一點不是很懂  您能更詳細的和我說說嗎
回復

使用道具 舉報

ID:89515 發表于 2018-11-6 17:46 | 顯示全部樓層
坐在分頭調戲鬼 發表于 2018-11-6 16:59
您好   我是一個初學者  您說的我有一點不是很懂  您能更詳細的和我說說嗎

你需要的效果其實就是按下按鍵時,及時的響應對應按鍵的程序,而不是等待上一個按鍵的程序執行完再響應對不對。
回復

使用道具 舉報

ID:421426 發表于 2018-11-6 21:51 | 顯示全部樓層
mengzhixinheng 發表于 2018-11-6 17:46
你需要的效果其實就是按下按鍵時,及時的響應對應按鍵的程序,而不是等待上一個按鍵的程序執行完再響應對 ...

是的     那我應該怎么辦啊   沒有什么思路   
回復

使用道具 舉報

ID:421426 發表于 2018-11-6 22:00 | 顯示全部樓層
mengzhixinheng 發表于 2018-11-6 17:46
你需要的效果其實就是按下按鍵時,及時的響應對應按鍵的程序,而不是等待上一個按鍵的程序執行完再響應對 ...

對的     那我應該怎么辦啊
回復

使用道具 舉報

ID:421426 發表于 2018-11-6 22:00 | 顯示全部樓層
mengzhixinheng 發表于 2018-11-6 17:46
你需要的效果其實就是按下按鍵時,及時的響應對應按鍵的程序,而不是等待上一個按鍵的程序執行完再響應對 ...

對的     那我應該怎么辦啊
回復

使用道具 舉報

ID:421426 發表于 2018-11-6 22:36 | 顯示全部樓層
mengzhixinheng 發表于 2018-11-6 17:46
你需要的效果其實就是按下按鍵時,及時的響應對應按鍵的程序,而不是等待上一個按鍵的程序執行完再響應對 ...

對的    您說我應該怎么辦呢
回復

使用道具 舉報

ID:89515 發表于 2018-11-7 15:15 | 顯示全部樓層
void led1()
{
       for循環
      {
             // 假如此處進入中斷;
             // 中斷返回,標志改變;
              判斷標志k,若改變return;
      }
}
void led2()
{
        for循環
      {         
             // 假如此處進入中斷;
             // 中斷返回,標志改變;
              判斷標志k,若改變return;

      }
}
void led3()
{
        for循環
      {            
             // 假如此處進入中斷;
             // 中斷返回,標志改變;
              判斷標志k,若改變return;

      }
}
void main(void)
{
      while(1)
     {
            if(k==1)led1();//k為執行相應函數的標志
            if(k==2)led2();
            if(k==3)led3();
     }
}
void  int()  interrupt//外部中斷函數
{
      if(++k==3)k=1;//此處可以軟件延時消抖,但不是好方法,這減弱了外部中斷的作用。但又必須消抖,
                               怎么辦??可以硬件消抖(積分電路),這是最簡單的方法。那如果非要軟件消抖呢,那就嵌套定時器(這說起來復雜)。
}
通常情況下按鍵掃描和其他程序處于順序執行狀態,各個按鍵也是順序掃描的。這樣當執行一個按鍵程序時就必須將他執行完才能掃描下一個按鍵。如果各個按鍵下的程序需要的執行時間很長,那么將造成按鍵響應不及時;這也就是你遇到的情況。
問題找到了,當然就要找解決方法;比較實用的方法很多但是都離不開中斷,這是必須的。因為中斷可以打斷主程序的執行,從而及時改變各個函數的執行標志,但是并不是執行標志改變就能及時響應程序。這是為什么呢?????這是因為進入中斷前是必須保存“上下文”的,自然從中斷出去也必須從保存的“上下文”處開始執行,無法直接判斷到標志是否改變。既然這樣我們就人為的讓它檢測到標志已經改變,這是很簡單的事情,只需要在各個函數循環的最內層判斷標志,當標志改變直接返回主函數,返回主函數后再按照標志的值執行相應的函數就可以了。
以上的方法如果用外部中斷可以直接照做;若用定時器中斷,那就必須寫按鍵函數,并將其嵌入定時器中斷中。按鍵函數的寫法最好是狀態機的形式
(這個“狀態機”涉及內容太多可以百度)
前面所說都是從按鍵的方向去解決問題;自然也可以從執行函數的方向去解決,按鍵響應不及時不就是函數執行時間太久了,那就把函數按時間間隙分成一個個狀態。像LED類的程序是不難辦到的……

在這里針對性的解決問題固然很好,但是適應性其實很差,而且過多的標志也煩。要在裸機的情況下解決實時性問題最好還是學會狀態機程序的寫法和時間片輪詢框架的應用。



回復

使用道具 舉報

ID:390006 發表于 2018-11-7 19:03 | 顯示全部樓層
延時讀鍵程序只能用于學習,不能商用,單片機的要處理很多事情。用節拍掃描,或中斷好一些。
回復

使用道具 舉報

ID:422650 發表于 2018-11-7 21:59 | 顯示全部樓層
厲害了,很有用
回復

使用道具 舉報

ID:422661 發表于 2018-11-7 22:30 | 顯示全部樓層
應該按按鍵ESC?
回復

使用道具 舉報

ID:612563 發表于 2020-5-3 11:32 來自觸屏版 | 顯示全部樓層
看不懂
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品视频在线观看 | 午夜视频精品 | 人人干视频在线 | 天堂一区二区三区四区 | 久久亚洲一区二区三区四区 | 欧美一级片在线看 | av在线天堂 | 91色视频在线 | 91香蕉| 久久极品 | 中文字幕 亚洲一区 | 亚洲综合电影 | 黄视频在线网站 | 蜜臀久久99精品久久久久久宅男 | 国产一级大片 | 日韩国产免费 | 国产99视频精品免视看9 | 亚洲高清视频在线观看 | 国产高清视频在线观看播放 | 亚洲国产精品99久久久久久久久 | 在线播放国产一区二区三区 | 久久久精品一区二区三区 | 在线不卡视频 | 国产高清视频 | 欧美日高清 | 欧美成人精品二区三区99精品 | 亚洲精品在线观看视频 | 日韩在线一区二区 | 在线视频三区 | 色综合天天天天做夜夜夜夜做 | 国产精品成人在线观看 | 一区二区三区国产精品 | 天天草天天干天天 | 伊人影院在线观看 | 久久国产麻豆 | 久久亚洲一区二区三区四区 | 国产在线中文字幕 | 国产麻豆乱码精品一区二区三区 | 中文字幕在线观看第一页 | 久久午夜精品福利一区二区 | 久久最新|