单片机学习 发表于 2023-4-2 12:44:24

冲哥视频学习,stc32G实验箱9.4 io中断问题

#include "led_seg.h"


u8 SEG_TAB={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf};   //段码数组0-9共10位, 0-9带小数点共10位,不显示一位
u8 COM_TAB={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};                                                                          //0-7 位码数值
u8 SHOW_TAB={0,0,0,0,0,0,0,0};                                                                                                                 //数码管显示的一个数值
u8 bdata LED_DATA=0x00;         //led显示的一个数值,初始值全部熄灭,bdata修饰的为寻址变量,LED_DATA就可以用sbit来定义LED_DATA的每一位了。

sbit LED0=LED_DATA^0;      //bdata修饰的为寻址变量,LED_DATA就可以用sbit来定义LED_DATA的每一位了。
sbit LED1=LED_DATA^1;
sbit LED2=LED_DATA^2;
sbit LED3=LED_DATA^3;
sbit LED4=LED_DATA^4;
sbit LED5=LED_DATA^5;
sbit LED6=LED_DATA^6;
sbit LED7=LED_DATA^7;


//==============================================
// 函数名称:SEG_LED_refresh
// 函数功能:led和数码管刷新
// 入口参数:
// 函数返回:
// 备注介绍:前八秒刷新seg,第九秒刷新led,第十秒空,这样led和seg可以同时亮了
//==============================================
void SEG_LED_refresh(void){
       
        static u8 num = 0;                //静态变量,第一次运行到才会进行初始化,不会释放内存。
       
        if(num<=7){                     //0-7数码管刷新
        LED_POW =2;                     //关闭LED电源
    SEG_COM=COM_TAB;             //位码的选择
    SEG_SEG=SEG_TAB];   //数码管上展示数字,两个变量的嵌套
        }
        else if (num<=8){                  //LED在第八毫秒刷新
        LED_POW =0;                        //开启LED电源
        SEG_COM=0xff;                      //关闭所有数码管
        SEG_SEG=LED_DATA;                  //LED显示状态
        }else{               
   LED_POW =1;                     //关闭LED电源
        SEG_COM=0xff;                      //关闭所有数码管
        SEG_SEG=0xff;                      //关闭所有段码信号
        }
       
       
    num++;
    if (num>10)num=0;   
}













在和冲哥的视频学习,stc32G实验箱9.4,第十六集io中断的P35端口,按下按键,数码管会增加1,找不到问题出在哪,按键按了数码管无反应。
希望各位大佬能帮忙看看。#include "COMM/src/stc.h"
#include "COMM/src/usb.h"
#include "led_seg.h"
#include "key.h"
#include "beef.h"
#include "time0.h"
#include "exit.h"


#define MAIN_Fosc 24000000UL//定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

bit TIME_10ms_flag;                        //10ms的标识位

void sys_init();
voiddelay_ms(u16 ms);
void Timer0_Isr(void) ;
void INT0_Isr(void);
void P3exit_Isr(void);

//数码管对应段展示0-916进制

int main ()
{   
       sys_init(); //usb功能+io口初始化
       usb_init(); //usb库初始化
        Timer0_Init();
    P3exit_into();
   EA = 1;    //CPU中断打开
       
        LED=0XFF;
        while(1)
{

}
}

void P3exit_Isr(void) interrupt 40
{
        u8 intf;                  //定义一个变量,接收端口中断标识寄存器的值
        intf = P3INTF;
        if (intf){
        P3INTF=0;               //标识寄存器要软件清零。
               
           if (intf & 0x08){      //P35按下
           SEG0++;               //显示0-9
                   if(SEG0>9){
                   SEG0=0;
                   delay_ms(200);   //测试使用延时,在开发过程中,千万不要在中断中使用延时。
                   }
           }
        }
}

void Timer0_Isr(void) interrupt 1
{
        static u8 time_count=0;         //时间,设置静态变量,要不然每回中段都会重新初始化
       
        SEG_LED_refresh();
       
        time_count++;            //时间+1
        if(time_count>=10){      //到达10ms
        TIME_10ms_flag=1;          //到达10ms,标识为1;
        time_count=0;            //时间清零
        }
}


void sys_init()
{
    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
    P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
    P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
   
    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));//等待时钟稳定
}

voiddelay_ms(u16 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   } while (--ms) ;
}#include "exit.h"


void INT0_Init(void){      //外部中断0的初始化
    IT0=1;                                 //外部中断源触发控制位:1为下降沿触发,0为上升沿与下降沿都可以触发
        IE0=0;                                 //中段请求源标识:为1时外部中断向cpu请求中断,cpu响应时,硬件清零
        EX0=1;                                 //1:允许INT0发出请求
        IT1=1;                                 //外部中断源触发控制位:1为下降沿触发,0为上升沿与下降沿都可以触发
        IE1=0;                                 //中段请求源标识:为1时外部中断向cpu请求中断,cpu响应时,硬件清零
        EX1=1;                                 //1:允许INT0发出请求

}

/*复制这个文件的时候,记得把这个中段函数复制的main函数下,方便分析
void INT0_Isr(void) interrupt 0
{

}
*/

void P3exit_into(void){            //P3端口的初始化
        P3IM0=0x00;               //低电平中断
        P3IM1=0xff;
        P3INTE=0x08;            //使能P3口中断,因为只用P35,0010 0000,换成16进制0x20;
}

单片机学习 发表于 2023-4-2 12:48:37

代码复制错了,只要是第二段和第三段代码,自己实在是看不出来哪有问题,麻烦各位看看,或者有没有正在学习的也可以一起讨论。STC32的资料有点少,教学视频的PPT在哪,哪位知道也可以说一声,谢谢{:4_197:}

8051启蒙者 发表于 2023-4-3 09:30:07

冲哥例程中有配套的教学PPT和例程,可以参考。
你例程中最后一句:P3INTE=0x08;            //使能P3口中断,因为只用P35,0010 0000,换成16进制0x20;
难道不是P3INTE=0x20;吗?




单片机学习 发表于 2023-4-3 13:30:53

8051启蒙者 发表于 2023-4-3 09:30
冲哥例程中有配套的教学PPT和例程,可以参考。
你例程中最后一句:P3INTE=0x08;            //使能P3口 ...

感谢感谢
页: [1]
查看完整版本: 冲哥视频学习,stc32G实验箱9.4 io中断问题