assass123
发表于 2024-12-22 19:31:42
<h1>打卡第十五集:外部中断</h1>
<p><img src="data/attachment/forum/202412/22/192056o5404kftkyvfmlnv.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/192332ozzg0t8gnttg6a66.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/192453zuhuh1fqzhahdhhe.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/192549q8ydf47aukue844d.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/192641x07iwfel27l7wlcz.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/192809gk0lclze7kleasia.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/192920ydu5ffuzq7aamsif.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/193051ztxtnnqq92mqq2na.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/193123zriofif4vcrcuizq.png" alt="image.png" title="image.png" /></p>
assass123
发表于 2024-12-22 19:42:57
<p>#ifndef __EXIT_H<br />
<strong>#define __EXIT_H</strong></p>
<p>#include "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"</p>
<p>//------------------------------变量声明------------------------------</p>
<p>//------------------------------函数声明------------------------------<br />
void INT0_Init(void); //外部中断0的初始化</p>
<p>#endif</p>
<p><strong>exit.C</strong></p>
<p>#include "exit.h"</p>
<p>//========================================================================<br />
// 函数名称: INT0_Init<br />
// 函数功能: 外部中断0初始化<br />
// 入口参数: 无<br />
// 函数返回: 去<br />
// 当前版本: VER1.0<br />
// 修改日期: 2023<br />
// 当前作者:<br />
// 其他备注:<br />
//========================================================================</p>
<p>void INT0_Init(void) //外部中断0的初始化<br />
{<br />
IT0 = 1; //1:下降沿中断 0:上升下降沿中断<br />
EX0 = 1; //允许中断<br />
IE0 = 0; //清除中断标志位<br />
}</p>
<p>#ifndef __<strong>TIM0_H</strong><br />
#define __TIM0_H</p>
<p>#include "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"</p>
<p>//------------------------------函数声明------------------------------<br />
void Timer0_Init(void); //1毫秒@24.000MHz</p>
<p>#endif</p>
<p><strong>tim0.C</strong></p>
<p>#include "tim0.h"</p>
<p>//========================================================================<br />
// 函数名称: Timer0_Init<br />
// 函数功能: 定时器0初始化<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
// 当前版本: VER1.0<br />
// 修改日期: 2023<br />
// 当前作者:<br />
// 其他备注:<br />
//========================================================================<br />
void Timer0_Init(void) //1毫秒@24.000MHz<br />
{<br />
AUXR &= 0x7F; //定时器时钟12T模式<br />
TMOD &= 0xF0; //设置定时器模式<br />
TL0 = 0x30; //设置定时初始值<br />
TH0 = 0xF8; //设置定时初始值<br />
TF0 = 0; //清除TF0标志<br />
TR0 = 1; //定时器0开始计时<br />
ET0 = 1; //使能定时器0中断<br />
}</p>
<p><strong>Demo.C</strong></p>
<p>#include "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"<br />
#include "seg_led.h"<br />
#include "key.h"<br />
#include "beep.h"<br />
#include "tim0.h"<br />
#include "exit.h"</p>
<p>#define MAIN_Fosc 24000000UL //定义主时钟</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";</p>
<p>bitTIM_10MS_Flag; //10ms的标志位</p>
<p>void sys_init(); //函数声明<br />
void delay_ms(u16 ms); //unsigned int</p>
<p>void main() //程序开始运行的入口<br />
{<br />
u8 i;<br />
u8 KEY_NUM = 0; //保存矩阵按键的键码<br />
u8 KEY_Str = 0; //表示当前输入了几个密码位</p>
<pre><code>sys_init(); //USB功能+IO口初始化
usb_init(); //usb库初始化
Timer0_Init(); //定时器0初始化
INT0_Init(); //外部中断0初始化
EA = 1; //CPU开放中断,打开总中断。
SEG0 = 0;
SEG1 = 0;
LED = 0xff; //初始状态熄灭所有LED
while(1) //死循环
{
if( DeviceState != DEVSTATE_CONFIGURED ) //
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
for(i=0;i<8;i++) //循环八次
{
LED = ~(1<<i); //当前i是几,就点亮第几个LED
delay_ms(500); //验收500ms
}
if( P33 ==0 ) //如果P33按下了
SEG1 += 1; //数码管1的数值+1
}
</code></pre>
<p>}</p>
<p>void INT0_Isr(void) interrupt 0<br />
{<br />
SEG0 += 1; //数码管0的数值+1<br />
}</p>
<p>void Timer0_Isr(void) interrupt 1<br />
{<br />
static timcount = 0;</p>
<pre><code>SEG_LED_Show(); //数码管刷新的
timcount++; //1ms+1
if( timcount>=10 ) //如果这个变量大于等于10,10ms计数到达
{
timcount = 0;
TIM_10MS_Flag = 1; //10ms时间到了
}
</code></pre>
<p>}</p>
<p>void sys_init() //函数定义<br />
{<br />
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快<br />
EAXFR = 1; //扩展寄存器(XFR)访问使能<br />
CKCON = 0; //提高访问XRAM速度</p>
<pre><code>P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
P3M0 = 0x00;
P3M1 = 0x00;
P3M0 &= ~0x03;
P3M1 |= 0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 0x01));//等待时钟稳定
USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
</code></pre>
<p>}</p>
<p>void delay_ms(u16 ms) //unsigned int<br />
{<br />
u16 i;<br />
do<br />
{<br />
i = MAIN_Fosc/6000;<br />
while(--i);<br />
}while(--ms);<br />
}</p>
assass123
发表于 2025-2-20 20:48:07
收到厂家的试验箱,制作精巧,功能多,传输线质量好。可以开始软件编程了