普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5109|回复: 14

新手:为什么中断函数实现不了中断,只试用了外部中断0。

[复制链接]

3

主题

8

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2021-3-22 17:26:54 | 显示全部楼层 |阅读模式
#include<reg52.h>
sbit K1=P3^1;//定义按键k1
sbit K2=P3^0;//定义按键k2
sbit E=P2^7;//定义lcd指令
sbit RS=P2^6;
sbit RW=P2^5;
sbit LSA=P2^2; //定义数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;
#define l P0//数码管和led灯
unsigned int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管数字定义
unsigned char b[]="zhouxing";
unsigned char c[]="1901180140";
  void delay(unsigned int c)//延时
         {       
         unsigned char a,b;
         for(;c>0;c--)
         {
                  for(b=199;b>0;b--)
                 {
                         for(a=1;a>0;a--);
                 }
         }
         }
          void shumaprint()//数码输出
          {
                          
                unsigned int i=0;
                 for(i=0;i<8;i++)
                 {
                         switch(i)
                        {
                                case 0:        LSA=0,LSB=0,LSC=0;break;
                             case 1:        LSA=1,LSB=0,LSC=0;break;
                                case 2:        LSA=0,LSB=1,LSC=0;break;
                                   case 3:        LSA=1,LSB=1,LSC=0;break;
                                case 4:        LSA=0,LSB=0,LSC=1;break;
                                case 5:        LSA=1,LSB=0,LSC=1;break;
                                case 6:        LSA=0,LSB=1,LSC=1;break;
                                case 7:        LSA=1,LSB=1,LSC=1;break;


                        }
                        l=a;//段选
                        delay(5);
                        l=0x00;                                       


                 }
          }
void LcdWriteCom(unsigned char com)//lcd1602写入命令
        {
                E=0;
                RS=0;
                RW=0;
                l=com;
                delay(1);
                E=1;
                delay(5);
                E=0;
        }
void LcdWriteDate(unsigned char date)//lcd1602写入数据
        {
        E=0;
        RS=1;
        RW=0;
        l=date;
        delay(1);
        E=1;
        delay(5);
        E=0;               
        }
void Init()//lcd1602初始化
        {
                LcdWriteCom(0x38);//开显示
                LcdWriteCom(0x0c);//开显示不显示光标
                LcdWriteCom(0x06);//写一个光标动1
                LcdWriteCom(0x01);//清屏
                LcdWriteCom(0x80);//第一个显示的位置


        }                
void Int0_Int()//设置外部中断0
{
        EA=1;
        EX0=1;
        IT0=1;
}
void Int1_Int()//设置外部中断1
{
        EA=1;
        EX1=1;
        IT0=1;
}
void Int0() interrupt 0 //外部中断0的内容
{
        if(K1==0)
        {          delay(5);
                if(K1==0)
                {
                        shumaprint();
                }
        }                                                         
}
void Int1() interrupt 2 //外部中断0的内容
{
        if(K2==0)
        {        while(1)
        {
            unsigned char i;
            Init();
                for(i=0;i<8;i++)
                LcdWriteDate(b);
                }               
        }       
}
void main()
{           
        //P2=0;
        Int0_Int();                               
        //Int1_Int();
        while(1);
       


}                                 

回复

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-3-22 18:00:47 | 显示全部楼层
哥们我也是新手   但是你这程序我觉得最起码有几处错误  编译的时候不报错么  l=a;//段选  A  定义的是数组 这个调用的是数组哪一个你没写   void Init()//lcd1602初始化  函数没调用  f(K2==0)         {        while(1)         {   这里while(1)不会进入死循环么  还有程序开始出定义了 P2= 0  void shumaprint()//数码输出 这个函数也没有调用 那么你数码管的位选怎么弄   void LcdWriteCom(unsigned char com)//lcd1602写入命令 函数中I=com  COM 怎么来的 没看见  打断函数0 中没有做是否检测按键是不是松开了 的处理也是问题 目前就看出这么多 至于对不对  就仅供参考了
回复 支持 反对

使用道具 举报

3

主题

8

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-3-22 18:10:20 | 显示全部楼层
liang123 发表于 2021-3-22 18:00
哥们我也是新手   但是你这程序我觉得最起码有几处错误  编译的时候不报错么  l=a;//段选  A  定义的是数组 ...

l=a【】,复制的时候漏了,那函数没调用是我没用中断2,那是写中断1里面的(及第一个外部中断),就数码管是中断0;我只用数码管测试不行
回复 支持 反对

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-3-22 19:10:38 | 显示全部楼层
小机机 发表于 2021-3-22 18:10
l=a【】,复制的时候漏了,那函数没调用是我没用中断2,那是写中断1里面的(及第一个外部中断),就数码管 ...

哥们 这是修改了一下的   外部中断0有固定的引脚 P3^2    这是我测试过的 你看看
#include <reg52.h>
#include "intrins.h"

sbit K1=P3^2;//定义按键k1
sbit LSA=P2^2; //定义数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;
bit flag=0;
#define I P0//数码管和led灯
unsigned char a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管数字定义

void delay(unsigned int c)//延时
{      
     unsigned char a,b;
     for(;c>0;c--)
     {
              for(b=199;b>0;b--)
             {
                     for(a=1;a>0;a--);
             }
     }
}
void delay10ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=215;b>0;b--)
        for(a=45;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
    _nop_();  //if Keil,require use intrins.h
}


void shumaprint()//数码输出
{         
    unsigned char i=0;
     for(i=0;i<8;i++)
     {
             switch(i)
            {
                case (0)SA=0,LSB=0,LSC=0;break;
                case (1)SA=1,LSB=0,LSC=0;break;
                case (2)SA=0,LSB=1,LSC=0;break;
                case (3)SA=1,LSB=1,LSC=0;break;
                case (4)SA=0,LSB=0,LSC=1;break;
                case (5)SA=1,LSB=0,LSC=1;break;
                case (6)SA=0,LSB=1,LSC=1;break;
                case (7)SA=1,LSB=1,LSC=1;break;
            }
            I=a;//段选
            delay(5);
            I=0x00;                                       
     }
}
      
void Int0_Int()//设置外部中断0
{
    EA=1;
    EX0=1;
    IT0=1;
}

void KeyPros()
{
    if(flag)
    {         
        shumaprint();
    }
}

void main()
{           
    Int0_Int();                              
    while(1)
    {
        KeyPros();
    }      
}

void Int0() interrupt 0 //外部中断0的内容
{
    delay10ms();
    if(K1==0)
    {
        flag=~flag;
    }                                                        
}      
回复 支持 反对

使用道具 举报

3

主题

8

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-3-22 19:26:13 | 显示全部楼层
liang123 发表于 2021-3-22 19:10
哥们 这是修改了一下的   外部中断0有固定的引脚 P3^2    这是我测试过的 你看看
#include
#include " ...

你确定你的行?为啥我复制你的代码没反应
回复 支持 反对

使用道具 举报

3

主题

8

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-3-22 19:27:00 | 显示全部楼层
小机机 发表于 2021-3-22 19:26
你确定你的行?为啥我复制你的代码没反应

是我板子的问题吗?

回复 支持 反对

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-3-22 19:42:18 | 显示全部楼层
小机机 发表于 2021-3-22 19:27
是我板子的问题吗?

你是那个版本的 板子  我的是V5.5的   我测试过可以的   按一下数码管显示0-1  在按一下 数码管不显示
回复 支持 反对

使用道具 举报

3

主题

8

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-3-22 19:45:45 | 显示全部楼层
liang123 发表于 2021-3-22 19:42
你是那个版本的 板子  我的是V5.5的   我测试过可以的   按一下数码管显示0-1  在按一下 数码管不显示

你qq多少,我加你一下,这个不太方便
回复 支持 反对

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-3-22 19:46:18 | 显示全部楼层
小机机 发表于 2021-3-22 19:27
是我板子的问题吗?

你检查一下 switch   中 case  后面的代码对不对   网页上粘贴过去的代码  case 后面的是不对的    网页上不是显示了 这个符号么   复制之后 ()就少了
回复 支持 反对

使用道具 举报

3

主题

8

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-3-22 19:48:19 | 显示全部楼层
liang123 发表于 2021-3-22 19:46
你检查一下 switch   中 case  后面的代码对不对   网页上粘贴过去的代码  case 后面的是不对的    网页 ...

那会报错,我改了。没用
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-26 21:01 , Processed in 0.096969 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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