STC按键触发中断程序,却不行,set_flag标志改变不了

STC按键触发中断程序,却不行,set_flag标志改变不了,第1张

既然是按键触发中断,在中断程序中还要判断?

if(P33==1),这是判断按键释放了吗?

问题:中断程序,不能有延时子程序,不能用return退出中断程序,中断程序执行结束就自然退出,因汇编的返回指令是不同的。

以下的程序看不见了,不知道还有什么问题了。

看程序,这中断也没有什么大作用,就是一个标志位来回的折腾,又写了一堆延时子程序,实在不知道你的中断是做什么的。要中断,真要做点实事呀。什么也不做,没意思。

#include "reg52.h"

unsigned char count //0.5ms次数标识

sbit pwm =P2^7 //PWM信号输出

sbit jia =P2^4 //角度增加按键检测IO口

sbit jan =P2^5 //角度减少按键检测IO口

unsigned char jd//角度标识

void delay(unsigned char i)//延时

{

unsigned char j,k

for(j=ij>0j--)

for(k=125k>0k--)

}

void Time0_Init() //定时器初始化

{

TMOD = 0x01 //定时器0工作在方式1

IE = 0x82

TH0 = 0xfe

TL0 = 0x33//11.0592MZ晶振,0.5ms

TR0=1//定时器开始

}

void Time0_Int() interrupt 1 //中断程序

{

TH0 = 0xfe//重新赋值

TL0 = 0x33

if(count<jd) //判断0.5ms次数是否小于角度标识

pwm=1 //确实小于,PWM输出高电平

else

pwm=0 //大于则输出低电平

count=(count+1) //0.5ms次数加1

count=count%40//次数始终保持为40 即保持周期为20ms

}

void keyscan() //按键扫描

{

if(jia==0) //角度增加按键是否按下

{

delay(10) //按下延时,消抖

if(jia==0) //确实按下

{

jd++//角度标识加1

count=0 //按键按下 则20ms周期从新开始

if(jd==6)

jd=5 //已经是180度,则保持

while(jia==0) //等待按键放开

}

}

if(jan==0)//角度减小按键是否按下

{

delay(10)

if(jan==0)

{

jd--//角度标识减1

count=0

if(jd==0)

jd=1 //已经是0度,则保持

while(jan==0)

}

}

}

void main()

{

jd=1

count=0

Time0_Init()

while(1)

{

keyscan() //按键扫描

}

}

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

void delay_ms(uint)

sbit led0=P0^0

sbit led1=P0^1

sbit key1=P3^2

sbit key2=P3^3

void main()

{

   uchar i=0

   uchar j=0

    while(1)

    {

       if(key1==0)//按键1

       {

        delay_ms(10)

        if(key1==0)

        {

            i++

            i=i%2

            switch(i)

            {

                 case 0: led0=1 break//关小灯

                 case 1: led0=0 break//开小灯

                 default:  break

            }

        }

        while(!key1)

        }

        

        if(key2==0)//按键2

       {

        delay_ms(10)

        if(key2==0)

        {

            j++

            j=j%2

            switch(j)

            {

                 case 0: led1=1 break//关小灯

                 case 1: led1=0 break//开小灯

                 default:  break

            }

        }

        while(!key2)

        }

    }

}

void delay_ms(uint z)  //延时子程序

{  

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7912966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存