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--)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)