标题: 一个不用中断可立即跳出当前单片机程序运行状态的操作 [打印本页]

作者: 刀刀见红    时间: 2019-1-22 02:53
标题: 一个不用中断可立即跳出当前单片机程序运行状态的操作
电路原理图如下:


单片机程序源码:

#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;
                                        }


                                }
                        }
                }        
        }
}

一个不用中断可立即跳出当前运行状态的操作.rar (17.29 KB, 下载次数: 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 发表于 2019-1-22 08:46
delay的时候,其他的事件顾不上的,也能“立即”?

什么呀!怎么跟智障似的,别人附件在那你都不知道下下来验证。附件才是完整的!别人的代码思路就是能起到跳过delay,立即进入别的代码中,效果同中断一样!同楼主所说的主题是一样。别人能想到的算法估计你还真没那个能力想出来!不信你自己试试!
作者: Sawardeakar    时间: 2019-1-22 18:30
验证过了,很有创意!
作者: Angle145    时间: 2019-1-24 16:44
建议把显示的代码更新下,不然这个是实现不了的,引起不必要的误会
作者: 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 发表于 2019-1-24 16:46
我把他的源码贴下,显示的那个是错的:
void ms()
{

没有必要作什么更新,是要学的自然会找附件,不想学的何苦自扰!
作者: 刀刀见红    时间: 2019-1-25 16:12
Trump1438 发表于 2019-1-24 19:39
没有必要作什么更新,是要学的自然会找附件,不想学的何苦自扰!

Mr. Trump, you said it very well.
作者: sheng7533967    时间: 2019-2-7 00:45
好样的,思路不错
作者: shuisheng60    时间: 2019-2-7 00:47
很好,收下了
作者: 就你****    时间: 2019-2-11 13:37
很好的创意
作者: 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
这个程序很有创意,谢谢楼主分享
作者: liuhailan5757    时间: 2019-3-8 09:46
提示: 该帖被管理员或版主屏蔽
作者: 爸爸啊你们    时间: 2019-12-25 18:51
初学者不明觉历我也在想能不能不写中断
作者: comu    时间: 2020-7-23 11:54
代码一小段,变化千千万,非常好,稍作修改,把按键改成变量即可与程序中的其他模块配套使用,亦可连接串口与下位机、双机、多机通信协作运行,并不仅限于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);只要用这种结构的 都是渣渣程序。你一直按着 别的程序要不要做事啊?万一按键进水/短路,你这太机器就废物了,最好用位置自锁,延时用标志位延时 不要用delay()这类的硬延时,保证系统不卡在某个程序时间超过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 发表于 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   

写作手法开头不练好后续思想就固化,无论大小程序,都尽量不要做程序堵塞性的操作,保持良好的编程手法很重要。现在初学者跟着开发程序板,开发板的程序和量产程序天壤地别,早知道早避坑,爱听不听,感觉自我良好就按照你自己想怎么滴就怎么滴。
作者: 神出没    时间: 2020-8-20 08:41
只有在初始化程序中用过delay,或者在某些等待引脚状态翻转时用过微秒级delay,其他地方都不建议用
作者: 神出没    时间: 2020-8-20 08:54
bhjyqjs 发表于 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   

我也看了,一头雾水,该delay的地方还是跳不出去,能跟中断比?还是楼主贴错程序了
作者: rsx9583    时间: 2020-8-20 12:47
大概用的什么原理?没看明白,注释也没有啊
作者: 塞北江南    时间: 2020-8-20 14:00
rsx9583 发表于 2020-8-20 12:47
大概用的什么原理?没看明白,注释也没有啊

庸人自扰,高明处懂的是内行,不懂是一般水准




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1