找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1817|回复: 5
打印 上一主题 下一主题
收起左侧

学习单片机按键中断功能切换看了一段代码有地方无法理解

[复制链接]
跳转到指定楼层
楼主
ID:960619 发表于 2021-8-19 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教下,这单片机代码中的P0起到什么作用?


#include<reg52.h>//#include "stc8.h"//

sbit beep=P1^5;
sbit k1=P3^1;
sbit k3=P3^2;//外部中断0 p32
sbit led=P2^0;
#define N P2

unsigned char num;
unsigned char aa;

void delay(unsigned int i)
{
        while(i--);
}
void fmq()//蜂鸣器
{
        beep=~beep;
        delay(100);
}
void led0()//流水灯
{
        N=0xff;
        N=0xfe;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
        
        N=0xfd;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
        
        N=0xfb;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
        
        N=0xf7;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
        
        N=0xef;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;
        
        N=0xdf;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;

        N=0xbf;
        fmq();
        delay(50000);
        if(num!=0){return;}
        P0=0xfe;

        N=0x7f;
        fmq();
        delay(50000);
        
        
  if(num!=0){return;}
        P0=0xfe;
}

void led1()//led对称亮
{
        while(1)
        {
                N=0x7e;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xbd;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xdb;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xe7;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xe7;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xdb;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0xbd;
                fmq();
                delay(35000);
                //delay(35000);
                if(num!=1){break;}
                P0=0xfc;
               
                N=0x7e;
                fmq();
                delay(35000);
                //delay(35000);
               
                if(num!=1){break;}
                P0=0xfc;
  }
}
void led2()//led分别单双数亮
{
        while(1)
        {
                N=0xaa;
                fmq();
                delay(50000);
                delay(50000);
                if(num!=2){break;}
                P0=0xf8;
               
                N=0x55;
                fmq();
                delay(50000);
                delay(50000);
                P0=0xf8;
                if(num!=2){break;}
                P0=0xf8;
}
        
}
void led3()//通过按键k1使led一个一个亮
{
        unsigned int i;
        N=0xfe;
        while(1)
        {
                if(k1==0)
                {  
                  switch(i)
                        {
                         case(0):N=0xfd;fmq();i++;break;
                         case(1):N=0xfb;fmq();i++;break;
                         case(2):N=0xf7;fmq();i++;break;
                         case(3):N=0xef;fmq();i++;break;
                         case(4):N=0xdf;fmq();i++;break;
                         case(5):N=0xbf;fmq();i++;break;
                         case(6):N=0x7f;fmq();i++;break;
                         case(7):N=0xff;fmq();i++;break;
                        }
                  while(!k1);
                        
                }
               
                if(i>=8){i=0;break;}
                P0=0xf0;
                if(num!=3){break;}
        }
}

void init()//中断初始化
{
        IT0=1;//外部中断0 跳变触发
        EX0=1;//外部中断0 p32
        EA=1;
}
void main()
{
               
        init();
        
        while(1)
        {
               
                        switch(num)
                        {
                         case(0):led0();
                                       P0=0xfe;
                                      break;
                         case(1):led1();
               P0=0xfc;                                
                                      break;
                         case(2):led2();
                                       P0=0xf8;
                                       break;//num++;
                         case(3):led3();
                                       P0=0xf0;
                                        break;
                        
                        }
                        
        }
        
}
               
void init0() interrupt 0//中断程序 k3
{
        //EX0=0;
        
        if(num==0){P0=0xfe;}
        num=num+1;
        
        if(num==1){P0=0xfc;}
        if(num==2){P0=0xf8;}
        if(num==3){P0=0xf0;}
        
  if(num>3){num=0;}
        
        //EX0=1;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2021-8-19 18:58 | 只看该作者
P0接有8个发光二极管,通过按键的次数(中断)改变P0口所接发光二极管的显示状态
回复

使用道具 举报

板凳
ID:960619 发表于 2021-8-19 19:45 | 只看该作者
csmyldl 发表于 2021-8-19 18:58
P0接有8个发光二极管,通过按键的次数(中断)改变P0口所接发光二极管的显示状态

噢,懂了。他这个是按键一次点亮一个PO口,就是模式切换的指示灯
回复

使用道具 举报

地板
ID:303735 发表于 2021-8-20 08:32 | 只看该作者
感觉有点复杂
回复

使用道具 举报

5#
ID:584195 发表于 2021-8-20 09:33 | 只看该作者
你这个delay全是阻塞式的,会不会效果不好呀!
回复

使用道具 举报

6#
ID:960619 发表于 2021-8-20 19:57 | 只看该作者
zyluglugl 发表于 2021-8-20 09:33
你这个delay全是阻塞式的,会不会效果不好呀!

啥是阻塞式?这不是我写的,论坛上看到的,我拿来学习的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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