冲哥视频学习,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;
}
代码复制错了,只要是第二段和第三段代码,自己实在是看不出来哪有问题,麻烦各位看看,或者有没有正在学习的也可以一起讨论。STC32的资料有点少,教学视频的PPT在哪,哪位知道也可以说一声,谢谢{:4_197:} 冲哥例程中有配套的教学PPT和例程,可以参考。
你例程中最后一句:P3INTE=0x08; //使能P3口中断,因为只用P35,0010 0000,换成16进制0x20;
难道不是P3INTE=0x20;吗?
8051启蒙者 发表于 2023-4-3 09:30
冲哥例程中有配套的教学PPT和例程,可以参考。
你例程中最后一句:P3INTE=0x08; //使能P3口 ...
感谢感谢
页:
[1]