silas3082
发表于 2024-12-20 22:22:40
<h3>第十集课后小练</h3>
<p><img src="data/attachment/forum/202412/20/222219tfkr8hgk21zg0u0w.png" alt="screenshot-1734704504835.png" title="screenshot-1734704504835.png" /></p>
<p>课后作业使用试验箱现有的矩阵键盘,因为矩阵键盘只有8和按键,所以我设置的正确密码位:12345670</p>
<p>当输入正确,数码管下方led流水灯显示,当密码不正确,下方led闪烁</p>
<video controls="controls" src="forum.php?mod=attachment&aid=75239"></video>
<p><a href="forum.php?mod=attachment&aid=75246" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:test.rar</a></p>
silas3082
发表于 2024-12-26 10:13:10
<h3>第十一集 矩阵按键</h3>
<p><img src="data/attachment/forum/202412/26/095859ix46a7yem74uz5al.png" alt="微信截图_20241226095833.png" title="微信截图_20241226095833.png" /></p>
<p>本节课介绍了矩阵按键,可以用X+Y个按键,实现X*Y个按键检测</p>
<p>矩阵按键采用扫描的方式实现,先将一列的端口置零,判断哪一行有按键按下</p>
<p>///第一步:将列设置为低电平</p>
<pre><code>Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
if(Row1==0||Row2==0){
if(Row1==0&&Row2==0){}//如果两行都有按键按下,不处理
else {
if(Row1==0){key_numb10=0;}
else if(Row2==0){key_numb10=4;}
Col1=1;
Col2=1;
Col3=1;
Col4=1;
Row1=0;
Row2=0;
</code></pre>
<p>判断完列之后,再把行置零,判断具体哪一个按键按下</p>
<pre><code>if(Col1==0){ //判断哪一列叠加按键的序号
}else if(Col2==0){
key_numb10=key_numb10+1;
}else if(Col3==0){
key_numb10=key_numb10+2;
}else if(Col4==0){
key_numb10=key_numb10+3;
</code></pre>
<p>任务实操是实现之前的课后练习:密码锁</p>
<pre><code>u8 key_numb10=0xff;void juzhenjianpan(){///第一步:将列设置为低电平Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
if(Row1==0||Row2==0){
if(Row1==0&&Row2==0){}//如果两行都有按键按下,不处理
else {
if(Row1==0){key_numb10=0;}
else if(Row2==0){key_numb10=4;}
Col1=1;
Col2=1;
Col3=1;
Col4=1;
Row1=0;
Row2=0;
if(Col1==0){ //判断哪一列叠加按键的序号
}else if(Col2==0){
key_numb10=key_numb10+1;
}else if(Col3==0){
key_numb10=key_numb10+2;
}else if(Col4==0){
key_numb10=key_numb10+3;
}
}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
}
else{key_numb10 =0xff;}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
if(Row1==0||Row2==0){
if(Row1==0&&Row2==0){}//如果两行都有按键按下,不处理
else {
if(Row1==0){key_numb10=0;}
else if(Row2==0){key_numb10=4;}
Col1=1;
Col2=1;
Col3=1;
Col4=1;
Row1=0;
Row2=0;
if(Col1==0){ //判断哪一列叠加按键的序号
}else if(Col2==0){
key_numb10=key_numb10+1;
}else if(Col3==0){
key_numb10=key_numb10+2;
}else if(Col4==0){
key_numb10=key_numb10+3;
}
}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
}
else{key_numb10 =0xff;}
}u8 Passwd={16,16,16,16,16,16,16,16};
void Seg_Task2(void){switch(Seg_no){ case 0: Display_Seg( SEG_NUMB], ~T_NUM) ;break;
case 1: Display_Seg( SEG_NUMB], ~T_NUM); break;
case 2: Display_Seg( SEG_NUMB], ~T_NUM); break;
case 3: Display_Seg( SEG_NUMB], ~T_NUM); break;
case 4: Display_Seg( SEG_NUMB], ~T_NUM); break;
case 5: Display_Seg( SEG_NUMB], ~T_NUM); break;
case 6: Display_Seg( SEG_NUMB], ~T_NUM); break;
case 7: Display_Seg( SEG_NUMB], ~T_NUM); break;
}
Seg_no++;
if(Seg_no>7){
Seg_no=0;
}
}
u8 Key_vol3=0;
u8 Key_no=0;
void PW_write_Task(void){if(key_numb10<0xff){
Key_vol3++;
if(Key_vol3==5){
if(Key_no==0){
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16; }
Passwd = key_numb10;
Key_no++;
if(Key_no==8){
if(Passwd==1&&Passwd==2&&Passwd==3&&Passwd==4&&Passwd==5&&Passwd==6&&Passwd==7&&Passwd==0){
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=1;
}else{
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
}
Key_no=0;
}
}
}
}
Passwd = key_numb10;
Key_no++;
if(Key_no==8){
if(Passwd==1&&Passwd==2&&Passwd==3&&Passwd==4&&Passwd==5&&Passwd==6&&Passwd==7&&Passwd==0){
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=17;
Passwd=1;
}else{
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
Passwd=16;
}
Key_no=0;
}
}
}
else {
Key_vol3=0;}}
</code></pre>
<p><a href="forum.php?mod=attachment&aid=76756" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:test.rar</a></p>
silas3082
发表于 2024-12-26 10:16:42
<p>第十一集 矩阵按键 课后作业</p>
<p><img src="data/attachment/forum/202412/26/101639jllxxtedekxrnzee.png" alt="微信截图_20241226095715.png" title="微信截图_20241226095715.png" /></p>
<p>我这里使用12345分别对应5种模式,对应的工作时间分别为:5秒,10秒,15秒,20秒,25秒。</p>
<p>开始按键为0。</p>
<p>使用了四个函数加上之前的595数码管显示函数。</p>
<p>mod_task:模式的选择</p>
<pre><code>void mod_task(void){if(key_numb10>0&&key_numb10<6){
Key_vol3++;
if(Key_vol3==5){mod = key_numb10;
start = 0;
finish=0;
}
}
mod = key_numb10;
start = 0;
finish=0;
}
}
else if(key_numb10==0){
Key_vol3++;
if(Key_vol3==5){ start = 1;
finish=0;
if(mod==1){
CoutDown_time=5;
}
else if(mod==2){
CoutDown_time=10;
}
else if(mod==3){
CoutDown_time=15;
}
else if(mod==4){
CoutDown_time=20;
}
else if(mod==5){
CoutDown_time=25;
}
}
}
else{
Key_vol3=0;
}
start = 1;
finish=0;
if(mod==1){
CoutDown_time=5;
}
else if(mod==2){
CoutDown_time=10;
}
else if(mod==3){
CoutDown_time=15;
}
else if(mod==4){
CoutDown_time=20;
}
else if(mod==5){
CoutDown_time=25;
}
}
}
else{
Key_vol3=0;
}
}
</code></pre>
<p>CountDown_Task:倒计时</p>
<pre><code>void CountDown_Task(void){ if(start==1){
CoutDown_time--;
if( CoutDown_time==0){
finish=1;
start=0;
}
if(start==1){
CoutDown_time--;
if( CoutDown_time==0){
finish=1;
start=0;
}
}
}
</code></pre>
<p>数码管显示</p>
<pre><code>void Seg_Task2(void){switch(Seg_no){
case 0: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 1: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 2: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 3: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 4: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 5: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 6: if(start==0&&finish==0){Display_Seg(SEG_NUMB, ~T_NUM) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
case 7: if(start==0&&finish==0){ Display_Seg( SEG_NUMB, ~T_NUM) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
}
Seg_no++;
if(Seg_no>7){
Seg_no=0;
}
}
switch(Seg_no){
case 0: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 1: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 2: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 3: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 4: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 5: Display_Seg( SEG_NUMB, ~T_NUM); break;
case 6: if(start==0&&finish==0){Display_Seg(SEG_NUMB, ~T_NUM) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
case 7: if(start==0&&finish==0){ Display_Seg( SEG_NUMB, ~T_NUM) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
}
Seg_no++;
if(Seg_no>7){
Seg_no=0;
}
}
</code></pre>
<p>juzhenjianpan:矩阵键盘显示</p>
<pre><code>void juzhenjianpan(){///第一步:将列设置为低电平Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
if(Row1==0||Row2==0){
if(Row1==0&&Row2==0){}//如果两行都有按键按下,不处理
else {
if(Row1==0){key_numb10=0;}
else if(Row2==0){key_numb10=4;}
Col1=1;
Col2=1;
Col3=1;
Col4=1;
Row1=0;
Row2=0;
if(Col1==0){ //判断哪一列叠加按键的序号
}else if(Col2==0){
key_numb10=key_numb10+1;
}else if(Col3==0){
key_numb10=key_numb10+2;
}else if(Col4==0){
key_numb10=key_numb10+3;
}
}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
}
else{key_numb10 =0xff;}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
if(Row1==0||Row2==0){
if(Row1==0&&Row2==0){}//如果两行都有按键按下,不处理
else {
if(Row1==0){key_numb10=0;}
else if(Row2==0){key_numb10=4;}
Col1=1;
Col2=1;
Col3=1;
Col4=1;
Row1=0;
Row2=0;
if(Col1==0){ //判断哪一列叠加按键的序号
}else if(Col2==0){
key_numb10=key_numb10+1;
}else if(Col3==0){
key_numb10=key_numb10+2;
}else if(Col4==0){
key_numb10=key_numb10+3;
}
}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
}
else{key_numb10 =0xff;}
}
</code></pre>
<video controls="controls" src="forum.php?mod=attachment&aid=76876"></video>
<p><a href="forum.php?mod=attachment&aid=76875" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:test.rar</a></p>
silas3082
发表于 2025-1-3 23:36:06
<p>DS18B20</p>
<p><a href="forum.php?mod=attachment&aid=78916" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:Ds18b20.rar</a></p>
silas3082
发表于 2025-1-6 11:44:06
移植官方例程里的PWM
silas3082
发表于 2025-1-12 08:27:07
<h3>第十二集-复位系统</h3>
<p>本节介绍了复位系统,分为:</p>
<p>1.硬件复位<br />
2.软件复位</p>
<h4>1.硬件复位</h4>
<p>分为:</p>
<p>1.上电复位(复位电压为1.7-1.9V)</p>
<p>2.低压复位</p>
<p>3.复位脚复位</p>
<p>4.看门狗复位:只有一个寄存器:WDT_CONTR</p>
<p>只需在main函数初始化的时候启动看门狗:</p>
<pre><code>WDT_CONTR=0X24;
</code></pre>
<p>在循环里边设置喂狗:</p>
<pre><code>WDT_CONTR=0X34;
</code></pre>
<p><img src="data/attachment/forum/202501/12/082846s9cejljjg99rev7e.png" alt="图片1.png" title="图片1.png" /></p>
<p>注意:</p>
<p>(<strong>程序有USB功能记得先加USB复位</strong>)</p>
<pre><code>P3M0 = 0x00;
P3M1 = 0x00;P3M0 &= ~0x03;
P3M1 |= 0x03;USBCON = 0X00;
USBCLK = 0X00;
IRC48MCR = 0X00;
Delay10ms();
</code></pre>
<h3>2.软件复位</h3>
<pre><code>IAP_CONTR=0X60; //复位到usb下载模式
IAP_CONTR=0X20; // 直接复位
</code></pre>
silas3082
发表于 2025-1-12 08:33:18
<h3>第十二集-复位系统 课后小练</h3>
<p><a href=""><br />
<img src="data/attachment/forum/202501/12/084608lyypf6kkgcpfpggg.png" alt="screenshot-1736608923362.png" title="screenshot-1736608923362.png" /><br />
</a></p>
<p>在冲哥矩阵键盘那一节原有密码锁的代码基础上继续完善</p>
<p>代码实现:</p>
<p>3.当按下的密码为“ 1 2 3 4 5 6 7 0”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”</p>
<p>数码管部分增加:</p>
<pre><code>0x5c, /'o', 19/
0x73, /'P', 20/
0x54, /'N', 21/
0x3e, /'U', 22/
0x86, /'1.', 23/
</code></pre>
<p>1.看门狗,超时1秒自动复位:增加看门狗</p>
<p>WDT_CONTR=0X24;</p>
<p>WDT_CONTR=0X34;</p>
<p>2.增加开机版本号,开机显示三秒的U 1.00 版本号:新定义一个函数,判断三秒时间到了吗</p>
<p>start_flag放在定时器里边,每1ms加1</p>
<pre><code>u8 passward = { 17,17,17,17,22,23,1,1 };
extern u16 ms_1_flag;
u8 start_flag=0;void show_version(void){
</code></pre>
<pre><code>if(start_flag==0){
if(ms_1_flag==3000){
passward = 16;
passward = 16;
passward = 16;
passward = 16;
passward = 16;
passward = 16;
passward = 16;
passward = 16;
start_flag=1;
}
}
</code></pre>
<pre><code>}
</code></pre>
<p>3.增加手动复位,P33按钮按下时重启(方便查看版本号和清除密码)</p>
<p>在按键检测中:</p>
<pre><code>Usb_REstet();
// IAP_CONTR=0X60; /// usb下载模式
IAP_CONTR=0X20; ///复位到重启
</code></pre>
<video controls="controls" src="forum.php?mod=attachment&aid=80228"></video>
<p><a href="forum.php?mod=attachment&aid=80230" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:WDT_kehou_mimasuo.rar</a></p>
晨露
发表于 2025-1-12 09:08:53
冲哥讲的特别详细
silas3082
发表于 2025-1-24 17:25:07
<h2>第十三集 外部中断</h2>
<p>本集讲解了外部中断,以外部中断1为例,引脚为P33</p>
<p>void INT1_Init (void){<br />
IT1=1; //下降沿中断<br />
EX1=1; //打开中断允许<br />
EA =1; //打开总中断</p>
<p>}</p>
<p>void INT_ISR(void) interrupt 2<br />
{</p>
<p>P21=!P21;</p>
<p>}</p>
<p><a href="forum.php?mod=attachment&aid=82781" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo.rar</a></p>
silas3082
发表于 2025-1-25 10:53:53
<h2>第十三集 外部中断 课后小练</h2>
<p><img src="data/attachment/forum/202501/25/105256i9ith6kjilh4dit6.png" alt="微信截图_20250125105217.png" title="微信截图_20250125105217.png" /></p>
<p>用手头上的擎天柱,P41为启动按键,按下后P21上的LED灯点亮,P33为外部中断,按下后led灯熄灭。</p>
<video controls="controls" src="forum.php?mod=attachment&aid=82823"></video>
<p><a href="forum.php?mod=attachment&aid=82827" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo-外部中断作业.rar</a></p>