標題: 一個不用中斷可立即跳出當前單片機程序運行狀態(tài)的操作 [打印本頁]

作者: 刀刀見紅    時間: 2019-1-22 02:53
標題: 一個不用中斷可立即跳出當前單片機程序運行狀態(tài)的操作
電路原理圖如下:


單片機程序源碼:

#include <reg52.h>          //頭文件
#include <intrins.h>
#define uint unsigned int   //宏定義
#define uchar unsigned char
sbit SW1 =P1^0;            //按鍵1
sbit SW2 =P1^1;            //按鍵2
sbit SW3 =P1^2;            //按鍵3
sbit SW4 =P1^3;            //按鍵4
uint num;
uchar huayang1[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff};
uchar huayang2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};     
uchar huayang3[]={0xaa,0x55,0xfb,0xf7,0xef,0x39,0xf1,0xe5,0x02,0xe3,0x2c,};                                   
void delay(uint S)
{
        while(S--);
}

void ms()
{
        uint i;
        for(i=0;i<200;i++)
        {
                delay(200);
        }
}

void main()
{
        while(1)
        {
               
                if(SW1==0)   
                {
                        delay(10);   
                        if(SW1==0)   
                        {
                                while(!SW1);
                                while(1)
                                {
                                        for(num=0;num<9;num++)
                                        {
                                                P0=huayang1[num];  P2=~huayang1[num];
                                                ms();
                                        }
                                }
                        }
                }
               
                if(SW2==0)                                       
                {
                        delay(10);
                        if(SW2==0)
                        {
                                while(!SW2);
                                while(1)
                                {
                                        for(num=0;num<8;num++)
                                        {
                                                P0=0xff;  P2=0;
                                                ms();
                                                P0=huayang2[num]; P2=~(0x55 & huayang2[num]);
                                                ms();                           
                                         }


                                }
                        }
                }
                if(SW3==0)           
                {
                        delay(10);
                        if(SW3==0)
                        {
                                while(!SW3);
                                while(1)
                                {
                                        for(num=0;num<11;num++)
                                        {
                                                
                                                P0=huayang3[num]; P2=~(0xaa & huayang3[num]);
                                                ms(); ms();
                                                if(SW1==0||SW2==0||SW3==0||SW4==0)
                                                        break;
                                        }


                                }
                        }
                }        
        }
}

一個不用中斷可立即跳出當前運行狀態(tài)的操作.rar (17.29 KB, 下載次數(shù): 94)




作者: ahshmj    時間: 2019-1-22 06:00
改變PC值不就行了嗎!
作者: jifengjianwu    時間: 2019-1-22 07:00
這個程序挺好,謝謝樓主分享
作者: weidoit    時間: 2019-1-22 08:46
delay的時候,其他的事件顧不上的,也能“立即”?
作者: #include51.h    時間: 2019-1-22 18:25
weidoit 發(fā)表于 2019-1-22 08:46
delay的時候,其他的事件顧不上的,也能“立即”?

什么呀!怎么跟智障似的,別人附件在那你都不知道下下來驗證。附件才是完整的!別人的代碼思路就是能起到跳過delay,立即進入別的代碼中,效果同中斷一樣!同樓主所說的主題是一樣。別人能想到的算法估計你還真沒那個能力想出來!不信你自己試試!
作者: Sawardeakar    時間: 2019-1-22 18:30
驗證過了,很有創(chuàng)意!
作者: Angle145    時間: 2019-1-24 16:44
建議把顯示的代碼更新下,不然這個是實現(xiàn)不了的,引起不必要的誤會
作者: Angle145    時間: 2019-1-24 16:46
我把他的源碼貼下,顯示的那個是錯的:
void ms()
{
        uint i;
        for(i=0;i<200;i++)
        {
                delay(200);
                if(SW1==0||SW2==0||SW3==0||SW4==0)
                        break;
        }
}
if(SW1==0)   
                {
                        delay(10);   
                        if(SW1==0)   
                        {
                                while(!SW1);
                                while(1)
                                {
                                        for(num=0;num<9;num++)
                                        {
                                                P0=huayang1[num];  P2=~huayang1[num];
                                                ms();
                                                if(SW1==0||SW2==0||SW3==0||SW4==0)
                                                        break;
                                        }
                                        if(SW1==0||SW2==0||SW3==0||SW4==0)
                                                break;
                                }
                        }
                }
其他按鍵同理
作者: Trump1438    時間: 2019-1-24 19:39
Angle145 發(fā)表于 2019-1-24 16:46
我把他的源碼貼下,顯示的那個是錯的:
void ms()
{

沒有必要作什么更新,是要學(xué)的自然會找附件,不想學(xué)的何苦自擾!
作者: 刀刀見紅    時間: 2019-1-25 16:12
Trump1438 發(fā)表于 2019-1-24 19:39
沒有必要作什么更新,是要學(xué)的自然會找附件,不想學(xué)的何苦自擾!

Mr. Trump, you said it very well.
作者: sheng7533967    時間: 2019-2-7 00:45
好樣的,思路不錯
作者: shuisheng60    時間: 2019-2-7 00:47
很好,收下了
作者: 就你****    時間: 2019-2-11 13:37
很好的創(chuàng)意
作者: 22229    時間: 2019-2-11 16:01
這個程序挺好,謝謝樓主分享
作者: axkf    時間: 2019-2-11 17:27
這個程序挺好,謝謝樓主分享
作者: jonejen    時間: 2019-2-21 14:14
感謝樓主分享!!
作者: ping264888    時間: 2019-2-22 08:08
思路新奇,感謝分享。
作者: zhengchong60    時間: 2019-3-7 23:05
這個程序很有創(chuàng)意,謝謝樓主分享
作者: liuhailan5757    時間: 2019-3-8 09:46
提示: 該帖被管理員或版主屏蔽
作者: 爸爸啊你們    時間: 2019-12-25 18:51
初學(xué)者不明覺歷我也在想能不能不寫中斷
作者: comu    時間: 2020-7-23 11:54
代碼一小段,變化千千萬,非常好,稍作修改,把按鍵改成變量即可與程序中的其他模塊配套使用,亦可連接串口與下位機、雙機、多機通信協(xié)作運行,并不僅限于51系列只要是C都可以用,不是C也是可以借鑒原理的
作者: 51黑科技1314    時間: 2020-8-17 20:18
這個太好了
作者: xiaobaiyg    時間: 2020-8-17 22:19
每天都有小驚喜,樓主太給力!
作者: 羅程峰8200    時間: 2020-8-18 08:40
  if(SW1==0)   
                        {
                                while(!SW1);只要用這種結(jié)構(gòu)的 都是渣渣程序。你一直按著 別的程序要不要做事?萬一按鍵進水/短路,你這太機器就廢物了,最好用位置自鎖,延時用標志位延時 不要用delay()這類的硬延時,保證系統(tǒng)不卡在某個程序時間超過10ms才是高效的程序
作者: bhjyqjs    時間: 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   
                         if(SW1==0)   
                         {
                                 while(!SW1);
                                 while(1)
                                 {
                                         for(num=0;num<9;num++)
                                         {
                                                 P0=huayang1[num];  P2=~huayang1[num];
                                                 ms();
                                                 if(SW1==0||SW2==0||SW3==0||SW4==0)
                                                         break;
                                         }
                                         if(SW1==0||SW2==0||SW3==0||SW4==0)
                                                 break;
                                 }
                         }
                 }
其他按鍵同理

以上是樓主原程序,又是while(!SW1);又是 for(num=0;num<9;num++)的,單片機也不需要干其他事了。
高明在何處?
作者: xstong    時間: 2020-8-18 13:16
有人贊揚,有人鄙夷,有人抱不平,實在不明,高明在何處?  no code project ?
作者: 羅程峰8200    時間: 2020-8-19 08:16
bhjyqjs 發(fā)表于 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   

寫作手法開頭不練好后續(xù)思想就固化,無論大小程序,都盡量不要做程序堵塞性的操作,保持良好的編程手法很重要,F(xiàn)在初學(xué)者跟著開發(fā)程序板,開發(fā)板的程序和量產(chǎn)程序天壤地別,早知道早避坑,愛聽不聽,感覺自我良好就按照你自己想怎么滴就怎么滴。
作者: 神出沒    時間: 2020-8-20 08:41
只有在初始化程序中用過delay,或者在某些等待引腳狀態(tài)翻轉(zhuǎn)時用過微秒級delay,其他地方都不建議用
作者: 神出沒    時間: 2020-8-20 08:54
bhjyqjs 發(fā)表于 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   

我也看了,一頭霧水,該delay的地方還是跳不出去,能跟中斷比?還是樓主貼錯程序了
作者: rsx9583    時間: 2020-8-20 12:47
大概用的什么原理?沒看明白,注釋也沒有啊
作者: 塞北江南    時間: 2020-8-20 14:00
rsx9583 發(fā)表于 2020-8-20 12:47
大概用的什么原理?沒看明白,注釋也沒有啊

庸人自擾,高明處懂的是內(nèi)行,不懂是一般水準




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