<pre><code>#include "ai8051u.h"
#include <intrins.h>
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
unsigned char LED = 0; //LED变量
unsigned char GD1 = 0; //功德计数
//设置定时器2为1秒溢出
void Timer2_Init(void) //1秒@24.000MHz
{
TM2PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xFC; //设置定时初始值
T2H = 0x03; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //使能定时器2中断
}
//设置定时器3为2秒溢出
void Timer3_Init(void) //2秒@24.000MHz
{
TM3PS = 0x3D; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
T4T3M &= 0xFD; //定时器时钟12T模式
T3L = 0xFC; //设置定时初始值
T3H = 0x03; //设置定时初始值
T4T3M |= 0x08; //定时器3开始计时
IE2 |= 0x20; //使能定时器3中断
}
void main(void)
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P_SW2 |= 0x80;
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;
usb_init(); //USB CDC 接口配置
EA = 1;
P40 = 0; //LED 总开关
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if ( P32 == 0 )
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
printf("功德+1: %u 次\r\n ",(unsigned int)(GD1));
GD1 ++;
usb_OUT_done();
LED = 0; //点亮LED
P00 = LED;
P01 = LED;
P02 = LED;
P03 = LED;
P04 = LED;
P05 = LED;
P06 = LED;
P07 = LED;
Timer2_Init(); //定时器2初始化
while( P32 == 0 )
{
}
}
if ( P33 == 0 )
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
printf("功德+2: %u 次\r\n ",(unsigned int)(GD1));
GD1 += 2;
usb_OUT_done();
LED = 0; //点亮LED
P00 = LED;
P01 = LED;
P02 = LED;
P03 = LED;
P04 = LED;
P05 = LED;
P06 = LED;
P07 = LED;
Timer3_Init(); //初始化定时器3
while( P33 == 0 )
{
}
}
}
}
//定时器2中断函数 1秒关闭LED
void Timer2_Isr(void) interrupt 12
{
LED = 1;
P00 = LED;
P01 = LED;
P02 = LED;
P03 = LED;
P04 = LED;
P05 = LED;
P06 = LED;
P07 = LED;
AUXR &= ~0x10; //暂停定时器2
}
//定时器3中断函数 2秒关闭LED
void Timer3_Isr(void) interrupt 19
{
LED = 1;
P00 = LED;
P01 = LED;
P02 = LED;
P03 = LED;
P04 = LED;
P05 = LED;
P06 = LED;
P07 = LED;
T4T3M &= ~0x08; //暂停定时器3
}
</code></pre>
一点痕迹 发表于 2024-12-20 19:27
第七课 课后练习作业
#include "ai8051u.h"
#include <intrins.h>
<p>bug修改</p>
<pre><code> USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
printf("功德+1: %u 次\r\n ",(unsigned int)(GD1));
GD1 ++;
usb_OUT_done();
</code></pre>
<p>改为 解决串口输出延迟一次按键计数的bug</p>
<pre><code> USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
GD1 ++;
printf("功德+1: %u 次\r\n ",(unsigned int)(GD1));
usb_OUT_done();
</code></pre>
页:
1
[2]