找回密码
 立即注册
查看: 599|回复: 3

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

[复制链接]

该用户从未签到

2

主题

5

回帖

22

积分

新手上路

积分
22
发表于 2023-4-2 12:44:24 | 显示全部楼层 |阅读模式
  1. #include "led_seg.h"
  2. u8 SEG_TAB[22]={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位,不显示一位
  3. u8 COM_TAB[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};                                                                            //0-7 位码数值
  4. u8 SHOW_TAB[8]={0,0,0,0,0,0,0,0};                                                                                                                     //数码管显示的一个数值
  5. u8 bdata LED_DATA=0x00;         //led显示的一个数值,初始值全部熄灭,bdata修饰的为寻址变量,LED_DATA就可以用sbit来定义LED_DATA的每一位了。
  6. sbit LED0=LED_DATA^0;      //bdata修饰的为寻址变量,LED_DATA就可以用sbit来定义LED_DATA的每一位了。
  7. sbit LED1=LED_DATA^1;
  8. sbit LED2=LED_DATA^2;
  9. sbit LED3=LED_DATA^3;
  10. sbit LED4=LED_DATA^4;
  11. sbit LED5=LED_DATA^5;
  12. sbit LED6=LED_DATA^6;
  13. sbit LED7=LED_DATA^7;
  14. //==============================================
  15. // 函数名称:SEG_LED_refresh
  16. // 函数功能:led和数码管刷新
  17. // 入口参数:
  18. // 函数返回:
  19. // 备注介绍:前八秒刷新seg,第九秒刷新led,第十秒空,这样led和seg可以同时亮了
  20. //==============================================
  21. void SEG_LED_refresh(void){
  22.        
  23.         static u8 num = 0;                //静态变量,第一次运行到才会进行初始化,不会释放内存。
  24.        
  25.         if(num<=7){                       //0-7数码管刷新
  26.         LED_POW =2;                       //关闭LED电源
  27.     SEG_COM=COM_TAB[num];             //位码的选择
  28.     SEG_SEG=SEG_TAB[SHOW_TAB[num]];   //数码管上展示数字,两个变量的嵌套
  29.         }
  30.         else if (num<=8){                  //LED在第八毫秒刷新
  31.         LED_POW =0;                        //开启LED电源
  32.         SEG_COM=0xff;                      //关闭所有数码管
  33.         SEG_SEG=LED_DATA;                  //LED显示状态
  34.         }else{               
  35.      LED_POW =1;                       //关闭LED电源
  36.         SEG_COM=0xff;                      //关闭所有数码管
  37.         SEG_SEG=0xff;                      //关闭所有段码信号
  38.         }
  39.        
  40.        
  41.     num++;
  42.     if (num>10)num=0;   
  43. }
复制代码

在和冲哥的视频学习,stc32G实验箱9.4,第十六集io中断的P35端口,按下按键,数码管会增加1,找不到问题出在哪,按键按了数码管无反应。
希望各位大佬能帮忙看看。
  1. #include "COMM/src/stc.h"
  2. #include "COMM/src/usb.h"
  3. #include "led_seg.h"
  4. #include "key.h"
  5. #include "beef.h"
  6. #include "time0.h"
  7. #include "exit.h"
  8. #define MAIN_Fosc 24000000UL  //定义一个IRC系统时钟
  9. char *USER_DEVICEDESC = NULL;
  10. char *USER_PRODUCTDESC = NULL;
  11. char *USER_STCISPCMD = "@STCISP#";
  12. bit TIME_10ms_flag;                        //10ms的标识位
  13. void sys_init();
  14. void  delay_ms(u16 ms);
  15. void Timer0_Isr(void) ;
  16. void INT0_Isr(void);
  17. void P3exit_Isr(void);
  18. //数码管对应段展示0-9  16进制
  19. int main ()
  20. {   
  21.          sys_init(); //usb功能+io口初始化
  22.          usb_init(); //usb库初始化
  23.         Timer0_Init();
  24.     P3exit_into();
  25.      EA = 1;    //CPU中断打开
  26.        
  27.         LED=0XFF;
  28.         while(1)
  29. {
  30. }
  31. }
  32. void P3exit_Isr(void) interrupt 40
  33. {
  34.         u8 intf;                  //定义一个变量,接收端口中断标识寄存器的值
  35.         intf = P3INTF;
  36.         if (intf){
  37.         P3INTF=0;                 //标识寄存器要软件清零。
  38.                
  39.            if (intf & 0x08){      //P35按下
  40.            SEG0++;                 //显示0-9
  41.                    if(SEG0>9){
  42.                    SEG0=0;
  43.                    delay_ms(200);     //测试使用延时,在开发过程中,千万不要在中断中使用延时。
  44.                    }
  45.            }
  46.         }
  47. }
  48. void Timer0_Isr(void) interrupt 1
  49. {
  50.         static u8 time_count=0;           //时间,设置静态变量,要不然每回中段都会重新初始化
  51.        
  52.         SEG_LED_refresh();
  53.        
  54.         time_count++;              //时间+1
  55.         if(time_count>=10){        //到达10ms
  56.         TIME_10ms_flag=1;          //到达10ms,标识为1;
  57.         time_count=0;              //时间清零
  58.         }
  59. }
  60. void sys_init()
  61. {
  62.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  63.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  64.     CKCON = 0; //提高访问XRAM速度
  65.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  66.     P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
  67.     P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
  68.     P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  69.     P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  70.     P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  71.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  72.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  73.    
  74.     //设置USB使用的时钟源
  75.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  76.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  77. }
  78. void  delay_ms(u16 ms)
  79. {
  80.      u16 i;
  81.      do{
  82.           i = MAIN_Fosc / 6000;
  83.           while(--i);
  84.      } while (--ms) ;
  85. }
复制代码
  1. #include "exit.h"
  2. void INT0_Init(void){        //外部中断0的初始化
  3.     IT0=1;                                 //外部中断源触发控制位:1为下降沿触发,0为上升沿与下降沿都可以触发
  4.         IE0=0;                                 //中段请求源标识:为1时外部中断向cpu请求中断,cpu响应时,硬件清零
  5.         EX0=1;                                 //1:允许INT0发出请求
  6.         IT1=1;                                 //外部中断源触发控制位:1为下降沿触发,0为上升沿与下降沿都可以触发
  7.         IE1=0;                                 //中段请求源标识:为1时外部中断向cpu请求中断,cpu响应时,硬件清零
  8.         EX1=1;                                 //1:允许INT0发出请求
  9. }
  10. /*复制这个文件的时候,记得把这个中段函数复制的main函数下,方便分析
  11. void INT0_Isr(void) interrupt 0
  12. {
  13. }
  14. */
  15. void P3exit_into(void){            //P3端口的初始化
  16.         P3IM0=0x00;               //低电平中断
  17.         P3IM1=0xff;
  18.         P3INTE=0x08;              //使能P3口中断,因为只用P35,0010 0000,换成16进制0x20;
  19. }
复制代码

回复 送花

使用道具 举报

该用户从未签到

2

主题

5

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2023-4-2 12:48:37 | 显示全部楼层
代码复制错了,只要是第二段和第三段代码,自己实在是看不出来哪有问题,麻烦各位看看,或者有没有正在学习的也可以一起讨论。STC32的资料有点少,教学视频的PPT在哪,哪位知道也可以说一声,谢谢
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    慵懒
    昨天 08:37
  • 签到天数: 95 天

    [LV.6]常住居民II

    14

    主题

    616

    回帖

    2337

    积分

    超级版主

    积分
    2337
    QQ
    发表于 2023-4-3 09:30:07 | 显示全部楼层
    冲哥例程中有配套的教学PPT和例程,可以参考。
    你例程中最后一句:  P3INTE=0x08;              //使能P3口中断,因为只用P35,0010 0000,换成16进制0x20;
    难道不是P3INTE=0x20;吗?
    教学视频配套附件-20230320.zip (96.19 MB, 下载次数: 46)



    www.STCAI.com
    微信&手机:18106296591
    QQ:3133693787
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    回帖

    22

    积分

    新手上路

    积分
    22
     楼主| 发表于 2023-4-3 13:30:53 | 显示全部楼层
    8051启蒙者 发表于 2023-4-3 09:30
    冲哥例程中有配套的教学PPT和例程,可以参考。
    你例程中最后一句:  P3INTE=0x08;              //使能P3口 ...

    感谢感谢
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-18 17:36 , Processed in 0.064771 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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