电子DIY小家
发表于 2024-12-9 14:34:52
lclbf 发表于 2024-12-8 18:49
哪怕梦想让我们拼得遍体鳞伤,这一次我们也要勇往直前!!!
第六集:I/O输入输出
学习内容:
可以先分析下,第一次执行到“ P0 = ~n;”这一行的时候n等于几
lclbf
发表于 2024-12-9 15:03:25
电子DIY小家 发表于 2024-12-9 14:34
可以先分析下,第一次执行到“ P0 = ~n;”这一行的时候n等于几
谢谢冲哥,晚上试试。
21cnsound
发表于 2024-12-9 16:14:35
lclbf 发表于 2024-12-8 18:49
哪怕梦想让我们拼得遍体鳞伤,这一次我们也要勇往直前!!!
第六集:I/O输入输出
学习内容:
n= (n+1)<<1;
应该先左移以为再加1吧
lclbf
发表于 2024-12-10 16:41:29
21cnsound 发表于 2024-12-9 16:14
n= (n+1)
冲哥指导,应该是:
n = n+1;
n = ~n;
P0 = n;
n<<1;
昨天晚上验证过,可以。新的问题是不能重复,灯全部点亮,后面按按键就没有作用来了,想不断重复,现在还没有想到办法。
lclbf
发表于 2024-12-10 21:02:13
lclbf 发表于 2024-12-8 18:49
哪怕梦想让我们拼得遍体鳞伤,这一次我们也要勇往直前!!!
第六集:I/O输入输出
学习内容:
哪怕梦想让我们拼得遍体鳞伤,这一次我们也要勇往直前!!!
第七集:定时器中断
学习内容:
1、定时器的介绍
通过实验说明用定时器的好处。
2、定时器的应用
任务1:LED灯3S取反一次,这期间任意一时刻按下按钮,串口打印按键次数。
任务2:按键按下,灯点亮3S后熄灭。
任务3:救护车灯控制器,按下报警按钮,红蓝灯交替闪烁,再次按下按钮红蓝灯熄灭。
3、函数的声明、定义、调用
课后练习:
电子功德机:
按下按钮1,串口显示“双倍功德时间”,再次按下按钮显示“单次功德时间”;
按下按钮2,双倍功德时间下串口显示“功德+2,当前功德XXX”;
按下按钮2,单倍功德时间下串口显示“功德+1,当前功德XXX”;
功德+1时,LED点亮1S后熄灭,表示功德成功点亮;
功德+2时,LED点亮2S后熄灭,表示功德成功点亮。
作业分5部分,前三部分完成功能,后面两部分功能不正常,LED点亮时间不对(亮灯时间基本一样)。程序如下:
void main()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M0 = 0X00;
P0M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
P2M0 = 0X00;
P2M1 = 0X00;
P3M0 = 0X00;
P3M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
P5M0 = 0X00;
P5M1 = 0X00;
usb_init(); //USB CDC 接口配置
//Timer0_Init();
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40 = 0;
while(1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
if(P32==0)
{
Delay20ms();
if(P32==0)
{
if(Gd_State==0)
{
printf("单倍功德时间");
Gd_State = 1;
count = count + 1;
}
else//(Gd_State==1)
{
printf("双倍功德时间");
Gd_State = 0;
count = count + 2;
}
while(P32==0);
}
}
if(P33==0)
{
Delay20ms();
if(P33==0)
{
if(Gd_State==1)
{
count++;
P00 = 0;
Timer0_Init();
printf("功德+1 当前功德%d\r\n",count);
}
if(Gd_State==0)
{
count = count + 2;
P00 = 0;
Timer0_Init();
printf("功德+2 当前功德%d\r\n",count);
}
while(P33==0);
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
//作业
timer++;
if(timer==1)
{
timer = 0;
P00 = 1;
TR0 = 0;
}
if(timer==10)
{
timer = 0;
P00 = 1;
TR0 = 0;
}
}
lclbf
发表于 2024-12-11 07:58:28
电子DIY小家 发表于 2024-12-9 14:34
可以先分析下,第一次执行到“ P0 = ~n;”这一行的时候n等于几
谢谢冲哥指导。可以第一颗灯珠可以点亮到全部点亮,但是最后一颗点亮,再按按键不能和我视频重复循环了。
香河英茂工作室
发表于 2025-1-11 14:11:36
感谢分享。
lclbf
发表于 2025-5-10 08:45:10
Raimcu 发表于 2025-5-9 18:56
我也想要一个
坚持学习就可以免费得到。
香河英茂工作室
发表于 2025-6-1 16:24:36
感谢分享
香河英茂工作室
发表于 2025-6-1 16:24:53
感谢分享