找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7183|回复: 30
收起左侧

一个不用中断可立即跳出当前单片机程序运行状态的操作

  [复制链接]
ID:469417 发表于 2019-1-22 02:53 | 显示全部楼层 |阅读模式
电路原理图如下:
kkk.jpg

单片机程序源码:

#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)
回复

使用道具 举报

ID:7485 发表于 2019-1-22 06:00 | 显示全部楼层
改变PC值不就行了吗!
回复

使用道具 举报

ID:412814 发表于 2019-1-22 07:00 | 显示全部楼层
这个程序挺好,谢谢楼主分享
回复

使用道具 举报

ID:149389 发表于 2019-1-22 08:46 | 显示全部楼层
delay的时候,其他的事件顾不上的,也能“立即”?
回复

使用道具 举报

ID:471066 发表于 2019-1-22 18:25 | 显示全部楼层
weidoit 发表于 2019-1-22 08:46
delay的时候,其他的事件顾不上的,也能“立即”?

什么呀!怎么跟智障似的,别人附件在那你都不知道下下来验证。附件才是完整的!别人的代码思路就是能起到跳过delay,立即进入别的代码中,效果同中断一样!同楼主所说的主题是一样。别人能想到的算法估计你还真没那个能力想出来!不信你自己试试!

评分

参与人数 1黑币 +10 收起 理由
zhengchong60 + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:469932 发表于 2019-1-22 18:30 | 显示全部楼层
验证过了,很有创意!
回复

使用道具 举报

ID:142059 发表于 2019-1-24 16:44 | 显示全部楼层
建议把显示的代码更新下,不然这个是实现不了的,引起不必要的误会
回复

使用道具 举报

ID:142059 发表于 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;
                                }
                        }
                }
其他按键同理

评分

参与人数 1黑币 +35 收起 理由
就你**** + 35

查看全部评分

回复

使用道具 举报

ID:472325 发表于 2019-1-24 19:39 | 显示全部楼层
Angle145 发表于 2019-1-24 16:46
我把他的源码贴下,显示的那个是错的:
void ms()
{

没有必要作什么更新,是要学的自然会找附件,不想学的何苦自扰!

评分

参与人数 1黑币 +8 收起 理由
sheng7533967 + 8 很给力!

查看全部评分

回复

使用道具 举报

ID:469417 发表于 2019-1-25 16:12 | 显示全部楼层
Trump1438 发表于 2019-1-24 19:39
没有必要作什么更新,是要学的自然会找附件,不想学的何苦自扰!

Mr. Trump, you said it very well.
回复

使用道具 举报

ID:472268 发表于 2019-2-7 00:45 | 显示全部楼层
好样的,思路不错
回复

使用道具 举报

ID:472242 发表于 2019-2-7 00:47 | 显示全部楼层
很好,收下了
回复

使用道具 举报

ID:475444 发表于 2019-2-11 13:37 | 显示全部楼层
很好的创意
回复

使用道具 举报

ID:402398 发表于 2019-2-11 16:01 | 显示全部楼层
这个程序挺好,谢谢楼主分享
回复

使用道具 举报

ID:448822 发表于 2019-2-11 17:27 | 显示全部楼层
这个程序挺好,谢谢楼主分享
回复

使用道具 举报

ID:164189 发表于 2019-2-21 14:14 | 显示全部楼层
感谢楼主分享!!
回复

使用道具 举报

ID:365802 发表于 2019-2-22 08:08 来自手机 | 显示全部楼层
思路新奇,感谢分享。
回复

使用道具 举报

ID:473186 发表于 2019-3-7 23:05 | 显示全部楼层
这个程序很有创意,谢谢楼主分享
回复

使用道具 举报

ID:387856 发表于 2019-3-8 09:46 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

ID:499466 发表于 2019-12-25 18:51 | 显示全部楼层
初学者不明觉历我也在想能不能不写中断
回复

使用道具 举报

ID:472975 发表于 2020-7-23 11:54 | 显示全部楼层
代码一小段,变化千千万,非常好,稍作修改,把按键改成变量即可与程序中的其他模块配套使用,亦可连接串口与下位机、双机、多机通信协作运行,并不仅限于51系列只要是C都可以用,不是C也是可以借鉴原理的
回复

使用道具 举报

ID:608923 发表于 2020-8-17 20:18 | 显示全部楼层
这个太好了
回复

使用道具 举报

ID:810680 发表于 2020-8-17 22:19 | 显示全部楼层
每天都有小惊喜,楼主太给力!
回复

使用道具 举报

ID:89217 发表于 2020-8-18 08:40 | 显示全部楼层
  if(SW1==0)   
                        {
                                while(!SW1);只要用这种结构的 都是渣渣程序。你一直按着 别的程序要不要做事啊?万一按键进水/短路,你这太机器就废物了,最好用位置自锁,延时用标志位延时 不要用delay()这类的硬延时,保证系统不卡在某个程序时间超过10ms才是高效的程序
回复

使用道具 举报

ID:66287 发表于 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++)的,单片机也不需要干其他事了。
高明在何处?
回复

使用道具 举报

ID:429003 发表于 2020-8-18 13:16 | 显示全部楼层
有人赞扬,有人鄙夷,有人抱不平,实在不明,高明在何处?  no code project ?
回复

使用道具 举报

ID:89217 发表于 2020-8-19 08:16 | 显示全部楼层
bhjyqjs 发表于 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   

写作手法开头不练好后续思想就固化,无论大小程序,都尽量不要做程序堵塞性的操作,保持良好的编程手法很重要。现在初学者跟着开发程序板,开发板的程序和量产程序天壤地别,早知道早避坑,爱听不听,感觉自我良好就按照你自己想怎么滴就怎么滴。
回复

使用道具 举报

ID:108573 发表于 2020-8-20 08:41 | 显示全部楼层
只有在初始化程序中用过delay,或者在某些等待引脚状态翻转时用过微秒级delay,其他地方都不建议用
回复

使用道具 举报

ID:108573 发表于 2020-8-20 08:54 | 显示全部楼层
bhjyqjs 发表于 2020-8-18 08:47
if(SW1==0)   
                 {
                         delay(10);   

我也看了,一头雾水,该delay的地方还是跳不出去,能跟中断比?还是楼主贴错程序了
回复

使用道具 举报

ID:468878 发表于 2020-8-20 12:47 | 显示全部楼层
大概用的什么原理?没看明白,注释也没有啊
回复

使用道具 举报

ID:807712 发表于 2020-8-20 14:00 | 显示全部楼层
rsx9583 发表于 2020-8-20 12:47
大概用的什么原理?没看明白,注释也没有啊

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

评分

参与人数 1黑币 +15 收起 理由
shuisheng60 + 15 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表