单片机技术及应用(基于Proteus的汇编和c语言版)求大神指导。问题在图

2025-04-05 20:37:28
推荐回答(1个)
回答1:

#include
#include
#define u16 unsigned int
#define u8 unsigned char

#define Pin0 0x01
#define Pin1 0x02
#define Pin2 0x04
#define Pin3 0x08
#define Pin4 0x10
#define Pin5 0x20
#define Pin6 0x40
#define Pin7 0x80

/****************************************/
void init() //初始化函数
{   TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
    ET0=1;

}



/////////////////////////
sbit key0=P1^0;
sbit key1=P3^0;
#define K_RUN Pin1
#define K_ZT Pin0 
u8 key=0xff;//消抖后的有效按键值
u8 key_down=0x00;//按键下降沿扫描结果,1有效
u8 key_up=0x00;  //上升沿扫描结果,1有效
u8 key_sc=0xff;//上次扫描的按键值

//按键扫描程序
void s(){
static u8 temp0;
static u8 ms;
u8 temp=0;
if(key0==1)temp|=Pin0;
if(key1==1)temp|=Pin1;
if(temp==temp0){// 按键消抖
if(++ms>=5){//连续5次扫描的值一样,则认为是稳定状态
key=temp;
ms=0;
}
}else {
temp0=temp;
ms=0;
}
key_down=key_sc&(~key);//下降沿扫描
key_up=(~key_sc)&key;//下降沿扫描
key_sc=key;
}


///////////////////////
#define SIZE 13
code u8 table[]={~Pin0,~Pin1,~Pin2,~Pin3,~Pin4,~Pin5,~Pin6,~Pin7,
~Pin6,~Pin5,~Pin4,~Pin2,~Pin1,};
u8 ledzt=Pin7;//led任务zt 为0xff表示待机
u16 ledjs;//倒计时
void led_start(){ //启动程序
if((ledzt&(~Pin7))!=0)ledjs=500;
ledzt&=0x3f;
}
void led_zt(){ //暂停程序
ledzt|=Pin6;
}
void ledcx(){ //led流程程序
if(ledzt if(ledjs==0){
ledzt++;
if(ledzt==SIZE)ledzt=0;
ledjs=500;
}
P2=table[ledzt];
}

}



/***********************************/
void main()//主函数
{
init();//系统初始化
TR0=1; //定时器开始计时
while(1){
s();//读取按键值
if((key_down&K_RUN)!=0){
led_start();
}
if((key_down&K_ZT)!=0){
led_zt();
}
ledcx();
}

}


/****************************/
void timer0() interrupt 1//1ms定时器
{   
TH0=(65536-1000)/256;//重载初值
TL0=(65536-1000)%256;
if((ledjs>0)&&(ledzt<0xc0))ledjs--;

}