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&amp;aid=75239"></video>
<p><a href="forum.php?mod=attachment&amp;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&amp;&amp;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&amp;&amp;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&amp;&amp;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&gt;7){
Seg_no=0;
}

}

u8 Key_vol3=0;
u8 Key_no=0;
​void PW_write_Task(void){if(key_numb10&lt;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&amp;&amp;Passwd==2&amp;&amp;Passwd==3&amp;&amp;Passwd==4&amp;&amp;Passwd==5&amp;&amp;Passwd==6&amp;&amp;Passwd==7&amp;&amp;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&amp;&amp;Passwd==2&amp;&amp;Passwd==3&amp;&amp;Passwd==4&amp;&amp;Passwd==5&amp;&amp;Passwd==6&amp;&amp;Passwd==7&amp;&amp;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&amp;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&gt;0&amp;&amp;key_numb10&lt;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&amp;&amp;finish==0){Display_Seg(SEG_NUMB, ~T_NUM) ;}else if(start==1&amp;&amp;finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
        case 7: if(start==0&amp;&amp;finish==0){ Display_Seg( SEG_NUMB, ~T_NUM) ;}else if(start==1&amp;&amp;finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
}

Seg_no++;
if(Seg_no&gt;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&amp;&amp;finish==0){Display_Seg(SEG_NUMB, ~T_NUM) ;}else if(start==1&amp;&amp;finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
        case 7: if(start==0&amp;&amp;finish==0){ Display_Seg( SEG_NUMB, ~T_NUM) ;}else if(start==1&amp;&amp;finish==0){Display_Seg( SEG_NUMB, ~T_NUM);}else if(finish==1){Display_Seg(SEG_NUMB, ~T_NUM) ;}break;
}

Seg_no++;
if(Seg_no&gt;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&amp;&amp;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&amp;&amp;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&amp;aid=76876"></video>
<p><a href="forum.php?mod=attachment&amp;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&amp;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 &amp;= ~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&amp;aid=80228"></video>
<p><a href="forum.php?mod=attachment&amp;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&amp;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&amp;aid=82823"></video>
<p><a href="forum.php?mod=attachment&amp;aid=82827" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo-外部中断作业.rar</a></p>
页: 1 2 [3] 4
查看完整版本: Ai8051U 实验箱 学习开始打卡