找回密码
 立即注册
楼主: 芯启航

《8051U深度入门到32位51大型实战教学视频》学习打卡

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-16 09:57:09

14

主题

93

回帖

1092

积分

版主

积分
1092
发表于 2024-12-20 12:00:31 | 显示全部楼层
第十集 虚拟LED和数码管 已手敲代码测试通过
任务1:P2口流水灯,P10闪烁
截图202412201120491323.jpg


任务2:左边数码管显示P32按下次数 右边数码管显示P33按下次数
截图202412201146329564.jpg


任务3:按下数字按键在数码管显示对应的按键数字!

任务3

任务3


代码如下:

#include "io.h"

u8 State1= 0;                       //LED1初始状态
u8 State2= 0;                      //LED2初始状态
u8 State3= 0;                      //LED3初始状态

u16 Key_Vol;                                //按键按下持续时间
u16 Key_Vol_2;                                //按键按下持续时间

void LED0_Blink(void)
{
        State1 = !State1;
        P00 = State1;
}

void LED1_Blink(void)
{
        State2 = !State2;
        P01 = State2;
}

void LED2_Blink(void)
{
        State3 = !State3;
        P02 = State3;
}

u16 KEY1_COUNT = 0;                                //P32按钮计数
u16 KEY2_COUNT = 0;                                //P33按钮计数

void Key_Task(void)
{
//-----------------P32按钮计数----------------
        if( P32 ==0 )
        {
                Key_Vol++;
                if( Key_Vol==5 )
                {
                    KEY1_COUNT++;
                }
        }
        else
        {
                Key_Vol = 0;
        }
       
//-----------------P33按钮计数-----------------
                if( P33 ==0 )
        {
                Key_Vol_2++;
                if( Key_Vol_2==5 )
                {
                    KEY2_COUNT++;
                }
        }
        else
        {
                Key_Vol_2 = 0;
        }
       
       
}


u8 P2_STATE = 0x01;

u8 P10_STATE = 0;

//任务1:P2口流水灯,P10闪烁
void TASK_1( void )
{

//----------------------------------P2端口流水灯                  
          LED40_SetPort(2,~P2_STATE);                //点亮P20端口
         
          P2_STATE = (P2_STATE<<1);                //1000 0000 _> 1 0000 0000
          if( P2_STATE == 0 )
                  P2_STATE = 1;
          
          
//----------------------------------P10端口闪烁
          if( P10_STATE == 0)
              LED40_SetBit(1,0);
          else
              LED40_ClrBit(1,0);
          
          P10_STATE = !P10_STATE;
}



u32 KEY_Count = 0;

//任务2:左边数码管显示P32按下次数 右边数码管显示P33按下次数
void TASK_2( void )
{
        KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;
       
        SEG7_ShowLong(KEY_Count ,10);
       
}       

u32 REC_NUM = 0;

//任务3:按下数字按键在数码管显示对应的按键数字!
void TASK_3( void )
{
        SEG7_ShowLong( REC_NUM ,10);
}


AI8051U教学视频第10集虚拟LED和shu码管.zip

159.6 KB, 下载次数: 31

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-16 09:57:09

14

主题

93

回帖

1092

积分

版主

积分
1092
发表于 2024-12-27 10:43:22 | 显示全部楼层
第十一集 矩阵按键 已手敲代码,测试通过

任务1:数码管显示当前的按键号

任务一

任务一




任务2:密码锁

1.没有输入时,显示“- - - - - - - -”
2.有输入时,按下一个按键,开始按顺序写入
    例如,第一个按下1,显示“1 - - - - - - -”   
    例如,第二个按下3,显示“1 3 - - - - - -”
3.当按下的密码为“ 1 2 3 4 5 6 7 0”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”

任务二

任务二



代码如下:
  1. #include "io.h"
  2. u8 State1= 0;                       //LED1初始状态
  3. u8 State2= 0;                      //LED2初始状态
  4. u8 State3= 0;                      //LED3初始状态
  5. u16 Key_Vol;                                //按键按下持续时间
  6. u8 SEG_NUM[]=
  7. {
  8.     0x3F,       /*'0', 0*/
  9.     0x06,       /*'1', 1*/
  10.     0x5B,       /*'2', 2*/
  11.     0x4F,       /*'3', 3*/
  12.     0x66,       /*'4', 4*/
  13.     0x6D,       /*'5', 5*/
  14.     0x7D,       /*'6', 6*/
  15.     0x07,       /*'7', 7*/
  16.     0x7F,       /*'8', 8*/
  17.     0x6F,       /*'9', 9*/
  18.     0x77,       /*'A', 10*/
  19.     0x7C,       /*'B', 11*/
  20.     0x39,       /*'C', 12*/
  21.     0x5E,       /*'D', 13*/
  22.     0x79,       /*'E', 14*/
  23.     0x71,       /*'F', 15*/
  24.     0x40,       /*'-', 16*/
  25.     0x00,       /*' ', 17*/
  26.     0x80,       /*'.', 18*/
  27. };
  28. u8 T_NUM[8] =
  29. {
  30.         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  31. };
  32. void LED0_Blink(void)
  33. {
  34.         State1 = !State1;
  35.         P00 = State1;
  36. }
  37. void LED1_Blink(void)
  38. {
  39.         State2 = !State2;
  40.         P01 = State2;
  41. }
  42. void LED2_Blink(void)
  43. {
  44.         State3 = !State3;
  45.         P02 = State3;
  46. }
  47. void Key_Task(void)
  48. {
  49.         if( P32 ==0 )
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol==5 )
  53.                 {
  54.                         //按键按下的任务
  55.                         printf( "按键单击\r\n" );
  56.                 }
  57.         }
  58.         else
  59.         {
  60.                 Key_Vol = 0;
  61.         }
  62. }
  63. /*
  64.         #define ROW1        P06                        //端口定义
  65.         #define ROW2        P07
  66.         #define COL1        P00
  67.         #define COL2        P01
  68.         #define COL3        P02
  69.         #define COL4        P03
  70. */
  71. u8 key_num = 0xff;
  72. //任务1:数码管显示当前的按键号
  73. void Task_1(void)
  74. {
  75.     //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  76.      COL1 = 0;
  77.          COL2 = 0;
  78.          COL3 = 0;
  79.          COL4 = 0;
  80.          ROW1 = 1;
  81.          ROW2 = 1;
  82.         
  83.          if(( ROW1 ==0 ) || ( ROW2 == 0 ))                                                                                                                        //如果行按键有按下
  84.          {
  85.                  if(( ROW1 ==0 ) && ( ROW2 == 0 ))                                                                                                                //如果两行都有按键按下,不处理
  86.                  {
  87.                  
  88.                  
  89.                  }
  90.                  else if((( ROW1 ==1 ) && ( ROW2 ==0 )) ||        (( ROW1 ==0 ) && ( ROW2 ==1 )))                //如果有按键按下,而且只有一颗
  91.                  {
  92.                         if( ROW1 ==0)                        //判断哪一行,输出行开始的序号
  93.                                 key_num = 0;
  94.                         else if( ROW2 ==0)
  95.                                 key_num = 4;
  96.                                 
  97.                          //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  98.                      COL1 = 1;
  99.                          COL2 = 1;
  100.                          COL3 = 1;
  101.                          COL4 = 1;
  102.                          ROW1 = 0;
  103.                          ROW2 = 0;
  104.                         
  105.                          if( COL1 ==0 )                         //判断哪一列,叠加按键的序号
  106.                          {
  107. //                                 key_num = key_num ;
  108.                          }
  109.                          else if( COL2 ==0 )
  110.                          {
  111.                                  key_num = key_num + 1;
  112.                          }
  113.                          else if( COL3 ==0 )
  114.                          {
  115.                                  key_num = key_num + 2;
  116.                          }
  117.                          else if( COL4 ==0 )
  118.                          {
  119.                                  key_num = key_num + 3;
  120.                          }
  121.                  
  122.                  }        
  123.                          COL1 = 0;
  124.                          COL2 = 0;
  125.                          COL3 = 0;
  126.                          COL4 = 0;
  127.                          ROW1 = 1;
  128.                          ROW2 = 1;
  129.          }
  130.         else
  131.         {
  132.                 key_num = 0xff;
  133.         }
  134.         
  135. //        ③第三步:行列组合一下就可以判断出是哪个按键按下了。
  136. }
  137. void Init_595(void)
  138. {
  139.         HC595_SER = 0;
  140.         HC595_RCK = 0;        
  141.         HC595_SCK = 0;        
  142. }
  143. void Send_595( u8 dat )
  144. {
  145.         u8 i;
  146.         
  147.         for( i=0;i<8;i++ )
  148.         {
  149.                 dat <<= 1;                        //DAT = (DAT<<1);      //CY
  150.                 HC595_SER = CY;            //先把数据写在引脚上
  151.                 HC595_SCK = 1;                //输出上升沿的时钟信号
  152.                 HC595_SCK = 0;
  153.                
  154.         }
  155. }
  156. void Display_Seg(u8 HC595_1,u8 HC595_2)
  157. {
  158.         Send_595(HC595_1);                //数码管段码输出   高电平点亮
  159.         Send_595(HC595_2);                //数码管位码       低电平点亮
  160.         
  161.         HC595_RCK = 1;                        //数据输出
  162.         HC595_RCK = 0;
  163. }
  164. //void SEG_Task(void)
  165. //{
  166. //        if( key_num == 255)
  167. //                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  168. //        else
  169. //                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  170. //}
  171. u8 passward[8] = {16,16,16,16,16,16,16,16};
  172. u8 Seg_no =0;
  173. void SEG_Task(void)
  174. {
  175.         u8 num=0;
  176.         if(Seg_no==0)                                      
  177.         {
  178.                 Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        //数码管刷段码和位码
  179.         }
  180.         else if(Seg_no==1)                                
  181.         {
  182.                 Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        //数码管刷段码和位码
  183.         }
  184.         else if(Seg_no==2)                                //第一个横杠
  185.         {
  186.                 Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        //数码管刷段码和位码
  187.         }
  188.         else if(Seg_no==3)                              
  189.         {
  190.                 Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        //数码管刷段码和位码
  191.         }
  192.         else if(Seg_no==4)                              
  193.         {
  194.                 Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        //数码管刷段码和位码
  195.         }
  196.         else if(Seg_no==5)                                //第二个横杠
  197.         {
  198.                 Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         //数码管刷段码和位码
  199.         }
  200.         else if(Seg_no==6)                              
  201.         {
  202.                 Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        //数码管刷段码和位码
  203.         }
  204.         else if(Seg_no==7)                                //秒钟的个位
  205.         {
  206.                 Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        //数码管刷段码和位码
  207.         }
  208.         
  209.         else
  210.         {
  211.                
  212.         }
  213.         Seg_no ++;
  214.         if( Seg_no >7)
  215.                 Seg_no=0;
  216. }
  217. u8 Key_Vol3 = 0;
  218. u8 key_n0 = 0;
  219. void PW_write_Task(void)
  220. {
  221.         if( key_num <0xff )
  222.         {
  223.                 Key_Vol3++;
  224.                 if(Key_Vol3== 5 )
  225.                 {
  226. //                        if(key_num ==0 )
  227. //                        {
  228. //                                passward[0] = 16;
  229. //                                passward[1] = 16;
  230. //                                passward[2] = 16;
  231. //                                passward[3] = 16;
  232. //                                passward[4] = 16;
  233. //                                passward[5] = 16;
  234. //                                passward[6] = 16;
  235. //                                passward[7] = 16;
  236. //                        }
  237.                         passward[ key_n0 ] = key_num;
  238.                         key_n0 ++;
  239. //                        passward[7] = 17;
  240.                         if( key_n0  == 8)                 //密码输入到了八位
  241.                         {
  242.                                 if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
  243.                                 {
  244.                                         passward[0] = 17;
  245.                                         passward[1] = 17;
  246.                                         passward[2] = 17;
  247.                                         passward[3] = 17;
  248.                                         passward[4] = 17;
  249.                                         passward[5] = 17;
  250.                                         passward[6] = 17;
  251.                                         passward[7] = 1;
  252.                             }
  253.                                 else
  254.                                 {
  255.                                         passward[0] = 16;
  256.                                         passward[1] = 16;
  257.                                         passward[2] = 16;
  258.                                         passward[3] = 16;
  259.                                         passward[4] = 16;
  260.                                         passward[5] = 16;
  261.                                         passward[6] = 16;
  262.                                         passward[7] = 16;
  263.                                 }
  264.                                  key_n0 = 0;
  265.                         }
  266.                         
  267.                 }
  268.         }
  269.         else
  270.         {
  271.                 Key_Vol3= 0;
  272.         }
  273. }
复制代码


AI8051U教学视频第11集矩阵按键.zip

164.98 KB, 下载次数: 32

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-16 09:57:09

14

主题

93

回帖

1092

积分

版主

积分
1092
发表于 2025-1-14 13:59:11 | 显示全部楼层
第十二集 复位系统 已手敲代码,测试通过

任务一:编写看门狗程序
截图202501141348467436.jpg

代码如下:
  1. #include "config.h"
  2. #include "task.h"
  3. #include "io.h"
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. void main(void)
  8. {
  9.         
  10.         Sys_int();                                                                                 //系统初始化
  11.         usb_init();                                      //USB CDC 接口配置
  12.     IE2 |= 0x80;                                                                         //使能USB中断
  13.         Timer0_Init();                                                                        //定时器初始化
  14.     Init_595();
  15.         EA = 1;                                                                                        //IE |= 0X80;
  16.         
  17.         P40=0;
  18.         
  19.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  20.         WDT_CONTR =0X24;
  21.     while(1)
  22.         {
  23.                
  24.         if (bUsbOutReady)                                                        //如果接收到了数据
  25.         {
  26.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  27.             
  28.                         usb_OUT_done();                                                        //
  29.         }
  30.                         Task_Pro_Handler_Callback();                        //执行功能函数
  31.                         if( P33 !=0 )
  32.                         WDT_CONTR =0X34;
  33.         }
  34. }
  35. void Timer0_Isr(void) interrupt 1                                                //1MS执行一次
  36. {
  37.         Task_Marks_Handler_Callback();                                                //系统计时
  38. }
复制代码
任务二:软件复位
截图202501141426424582.jpg

代码如下:
  1. #include "io.h"
  2. u8 State1= 0;                       //LED1初始状态
  3. u8 State2= 0;                      //LED2初始状态
  4. u8 State3= 0;                      //LED3初始状态
  5. u16 Key_Vol;                                //按键按下持续时间
  6. u8 SEG_NUM[]=
  7. {
  8.     0x3F,       /*'0', 0*/
  9.     0x06,       /*'1', 1*/
  10.     0x5B,       /*'2', 2*/
  11.     0x4F,       /*'3', 3*/
  12.     0x66,       /*'4', 4*/
  13.     0x6D,       /*'5', 5*/
  14.     0x7D,       /*'6', 6*/
  15.     0x07,       /*'7', 7*/
  16.     0x7F,       /*'8', 8*/
  17.     0x6F,       /*'9', 9*/
  18.     0x77,       /*'A', 10*/
  19.     0x7C,       /*'B', 11*/
  20.     0x39,       /*'C', 12*/
  21.     0x5E,       /*'D', 13*/
  22.     0x79,       /*'E', 14*/
  23.     0x71,       /*'F', 15*/
  24.     0x40,       /*'-', 16*/
  25.     0x00,       /*' ', 17*/
  26.     0x80,       /*'.', 18*/
  27. };
  28. u8 T_NUM[8] =
  29. {
  30.         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  31. };
  32. void LED0_Blink(void)
  33. {
  34.         State1 = !State1;
  35.         P00 = State1;
  36. }
  37. void LED1_Blink(void)
  38. {
  39.         State2 = !State2;
  40.         P01 = State2;
  41. }
  42. void LED2_Blink(void)
  43. {
  44.         State3 = !State3;
  45.         P02 = State3;
  46. }
  47. void Key_Task(void)
  48. {
  49.         if( P33 ==0 )
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol==5 )
  53.                 {
  54.                         //按键按下的任务
  55. //                        printf( "按键单击\r\n" );
  56.                         
  57.                         USB_Reset_U();
  58.                         
  59.                         IAP_CONTR = 0X60;
  60.                 }
  61.         }
  62.         else
  63.         {
  64.                 Key_Vol = 0;
  65.         }
  66. }
  67. /*
  68.         #define ROW1        P06                        //端口定义
  69.         #define ROW2        P07
  70.         #define COL1        P00
  71.         #define COL2        P01
  72.         #define COL3        P02
  73.         #define COL4        P03
  74. */
  75. u8 key_num = 0xff;
  76. //任务1:数码管显示当前的按键号
  77. void Task_1(void)
  78. {
  79.     //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  80.      COL1 = 0;
  81.          COL2 = 0;
  82.          COL3 = 0;
  83.          COL4 = 0;
  84.          ROW1 = 1;
  85.          ROW2 = 1;
  86.         
  87.          if(( ROW1 ==0 ) || ( ROW2 == 0 ))                                                                                                                        //如果行按键有按下
  88.          {
  89.                  if(( ROW1 ==0 ) && ( ROW2 == 0 ))                                                                                                                //如果两行都有按键按下,不处理
  90.                  {
  91.                  
  92.                  
  93.                  }
  94.                  else if((( ROW1 ==1 ) && ( ROW2 ==0 )) ||        (( ROW1 ==0 ) && ( ROW2 ==1 )))                //如果有按键按下,而且只有一颗
  95.                  {
  96.                         if( ROW1 ==0)                        //判断哪一行,输出行开始的序号
  97.                                 key_num = 0;
  98.                         else if( ROW2 ==0)
  99.                                 key_num = 4;
  100.                                 
  101.                          //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  102.                      COL1 = 1;
  103.                          COL2 = 1;
  104.                          COL3 = 1;
  105.                          COL4 = 1;
  106.                          ROW1 = 0;
  107.                          ROW2 = 0;
  108.                         
  109.                          if( COL1 ==0 )                         //判断哪一列,叠加按键的序号
  110.                          {
  111. //                                 key_num = key_num ;
  112.                          }
  113.                          else if( COL2 ==0 )
  114.                          {
  115.                                  key_num = key_num + 1;
  116.                          }
  117.                          else if( COL3 ==0 )
  118.                          {
  119.                                  key_num = key_num + 2;
  120.                          }
  121.                          else if( COL4 ==0 )
  122.                          {
  123.                                  key_num = key_num + 3;
  124.                          }
  125.                  
  126.                  }        
  127.                          COL1 = 0;
  128.                          COL2 = 0;
  129.                          COL3 = 0;
  130.                          COL4 = 0;
  131.                          ROW1 = 1;
  132.                          ROW2 = 1;
  133.          }
  134.         else
  135.         {
  136.                 key_num = 0xff;
  137.         }
  138.         
  139. //        ③第三步:行列组合一下就可以判断出是哪个按键按下了。
  140. }
  141. void Init_595(void)
  142. {
  143.         HC595_SER = 0;
  144.         HC595_RCK = 0;        
  145.         HC595_SCK = 0;        
  146. }
  147. void Send_595( u8 dat )
  148. {
  149.         u8 i;
  150.         
  151.         for( i=0;i<8;i++ )
  152.         {
  153.                 dat <<= 1;                        //DAT = (DAT<<1);      //CY
  154.                 HC595_SER = CY;            //先把数据写在引脚上
  155.                 HC595_SCK = 1;                //输出上升沿的时钟信号
  156.                 HC595_SCK = 0;
  157.                
  158.         }
  159. }
  160. void Display_Seg(u8 HC595_1,u8 HC595_2)
  161. {
  162.         Send_595(HC595_1);                //数码管段码输出   高电平点亮
  163.         Send_595(HC595_2);                //数码管位码       低电平点亮
  164.         
  165.         HC595_RCK = 1;                        //数据输出
  166.         HC595_RCK = 0;
  167. }
  168. //void SEG_Task(void)
  169. //{
  170. //        if( key_num == 255)
  171. //                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  172. //        else
  173. //                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  174. //}
  175. u8 passward[8] = {16,16,16,16,16,16,16,16};
  176. u8 Seg_no =0;
  177. void SEG_Task(void)
  178. {
  179.         u8 num=0;
  180.         if(Seg_no==0)                                      
  181.         {
  182.                 Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        //数码管刷段码和位码
  183.         }
  184.         else if(Seg_no==1)                                
  185.         {
  186.                 Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        //数码管刷段码和位码
  187.         }
  188.         else if(Seg_no==2)                                //第一个横杠
  189.         {
  190.                 Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        //数码管刷段码和位码
  191.         }
  192.         else if(Seg_no==3)                              
  193.         {
  194.                 Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        //数码管刷段码和位码
  195.         }
  196.         else if(Seg_no==4)                              
  197.         {
  198.                 Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        //数码管刷段码和位码
  199.         }
  200.         else if(Seg_no==5)                                //第二个横杠
  201.         {
  202.                 Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         //数码管刷段码和位码
  203.         }
  204.         else if(Seg_no==6)                              
  205.         {
  206.                 Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        //数码管刷段码和位码
  207.         }
  208.         else if(Seg_no==7)                                //秒钟的个位
  209.         {
  210.                 Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        //数码管刷段码和位码
  211.         }
  212.         
  213.         else
  214.         {
  215.                
  216.         }
  217.         Seg_no ++;
  218.         if( Seg_no >7)
  219.                 Seg_no=0;
  220. }
  221. u8 Key_Vol3 = 0;
  222. u8 key_n0 = 0;
  223. void PW_write_Task(void)
  224. {
  225.         if( key_num <0xff )
  226.         {
  227.                 Key_Vol3++;
  228.                 if(Key_Vol3== 5 )
  229.                 {
  230. //                        if(key_num ==0 )
  231. //                        {
  232. //                                passward[0] = 16;
  233. //                                passward[1] = 16;
  234. //                                passward[2] = 16;
  235. //                                passward[3] = 16;
  236. //                                passward[4] = 16;
  237. //                                passward[5] = 16;
  238. //                                passward[6] = 16;
  239. //                                passward[7] = 16;
  240. //                        }
  241.                         passward[ key_n0 ] = key_num;
  242.                         key_n0 ++;
  243. //                        passward[7] = 17;
  244.                         if( key_n0  == 8)                 //密码输入到了八位
  245.                         {
  246.                                 if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
  247.                                 {
  248.                                         passward[0] = 17;
  249.                                         passward[1] = 17;
  250.                                         passward[2] = 17;
  251.                                         passward[3] = 17;
  252.                                         passward[4] = 17;
  253.                                         passward[5] = 17;
  254.                                         passward[6] = 17;
  255.                                         passward[7] = 1;
  256.                             }
  257.                                 else
  258.                                 {
  259.                                         passward[0] = 16;
  260.                                         passward[1] = 16;
  261.                                         passward[2] = 16;
  262.                                         passward[3] = 16;
  263.                                         passward[4] = 16;
  264.                                         passward[5] = 16;
  265.                                         passward[6] = 16;
  266.                                         passward[7] = 16;
  267.                                 }
  268.                                  key_n0 = 0;
  269.                         }
  270.                         
  271.                 }
  272.         }
  273.         else
  274.         {
  275.                 Key_Vol3= 0;
  276.         }
  277. }
复制代码








AI8051U教学视频第12集复位系统.zip

166.47 KB, 下载次数: 17

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-16 09:57:09

14

主题

93

回帖

1092

积分

版主

积分
1092
发表于 2025-1-23 16:55:51 | 显示全部楼层
跟着冲哥打卡第13集,已手敲代码,测试通过

截图202501231651348630.jpg

#include "io.h"

u8 State1= 0;                       //LED1初始状态
u8 State2= 0;                      //LED2初始状态
u8 State3= 0;                      //LED3初始状态

u16 Key_Vol;                                //按键按下持续时间

u8 SEG_NUM[]=
{
    0x3F,       /*'0', 0*/
    0x06,       /*'1', 1*/
    0x5B,       /*'2', 2*/
    0x4F,       /*'3', 3*/
    0x66,       /*'4', 4*/
    0x6D,       /*'5', 5*/
    0x7D,       /*'6', 6*/
    0x07,       /*'7', 7*/
    0x7F,       /*'8', 8*/
    0x6F,       /*'9', 9*/
    0x77,       /*'A', 10*/
    0x7C,       /*'B', 11*/
    0x39,       /*'C', 12*/
    0x5E,       /*'D', 13*/
    0x79,       /*'E', 14*/
    0x71,       /*'F', 15*/
    0x40,       /*'-', 16*/
    0x00,       /*' ', 17*/
    0x80,       /*'.', 18*/
};

u8 T_NUM[8] =
{
        0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};


void LED0_Blink(void)
{
        State1 = !State1;
        P00 = State1;
}

void LED1_Blink(void)
{
        State2 = !State2;
        P01 = State2;
}

void LED2_Blink(void)
{
        State3 = !State3;
        P02 = State3;
}

void Key_Task(void)
{
        if( P33 ==0 )
        {
                Key_Vol++;
                if(Key_Vol==5 )
                {
                        //按键按下的任务
//                        printf( "按键单击\r\n" );
                       
                        USB_Reset_U();
                       
                        IAP_CONTR = 0X60;
                }
        }
        else
        {
                Key_Vol = 0;
        }
}

/*
        #define ROW1        P06                        //端口定义
        #define ROW2        P07
        #define COL1        P00
        #define COL2        P01
        #define COL3        P02
        #define COL4        P03
*/
u8 key_num = 0xff;

//任务1:数码管显示当前的按键号
void Task_1(void)
{
    //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
     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 ==1 ) && ( ROW2 ==0 )) ||        (( ROW1 ==0 ) && ( ROW2 ==1 )))                //如果有按键按下,而且只有一颗
                 {
                        if( ROW1 ==0)                        //判断哪一行,输出行开始的序号
                                key_num = 0;
                        else if( ROW2 ==0)
                                key_num = 4;
                               
                         //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
                     COL1 = 1;
                         COL2 = 1;
                         COL3 = 1;
                         COL4 = 1;
                         ROW1 = 0;
                         ROW2 = 0;
                         
                         if( COL1 ==0 )                         //判断哪一列,叠加按键的序号
                         {
//                                 key_num = key_num ;
                         }
                         else if( COL2 ==0 )
                         {
                                 key_num = key_num + 1;
                         }
                         else if( COL3 ==0 )
                         {
                                 key_num = key_num + 2;
                         }
                         else if( COL4 ==0 )
                         {
                                 key_num = key_num + 3;
                         }
                 
                 }       
                         COL1 = 0;
                         COL2 = 0;
                         COL3 = 0;
                         COL4 = 0;
                         ROW1 = 1;
                         ROW2 = 1;
         }
        else
        {
                key_num = 0xff;
        }
       
//        ③第三步:行列组合一下就可以判断出是哪个按键按下了。


}

void Init_595(void)
{
        HC595_SER = 0;
        HC595_RCK = 0;       
        HC595_SCK = 0;       
}

void Send_595( u8 dat )
{
        u8 i;
       
        for( i=0;i<8;i++ )
        {
                dat <<= 1;                        //DAT = (DAT<<1);      //CY
                HC595_SER = CY;            //先把数据写在引脚上
                HC595_SCK = 1;                //输出上升沿的时钟信号
                HC595_SCK = 0;
               
        }

}

void Display_Seg(u8 HC595_1,u8 HC595_2)
{
        Send_595(HC595_1);                //数码管段码输出   高电平点亮
        Send_595(HC595_2);                //数码管位码       低电平点亮
       
        HC595_RCK = 1;                        //数据输出
        HC595_RCK = 0;
}

//void SEG_Task(void)
//{
//        if( key_num == 255)
//                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
//        else
//                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
//}

u8 passward[8] = {16,16,16,16,16,16,16,16};

u8 Seg_no =0;
void SEG_Task(void)
{
        u8 num=0;
        if(Seg_no==0)                                      
        {
                Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        //数码管刷段码和位码
        }
        else if(Seg_no==1)                                
        {
                Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        //数码管刷段码和位码
        }
        else if(Seg_no==2)                                //第一个横杠
        {
                Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        //数码管刷段码和位码
        }
        else if(Seg_no==3)                              
        {
                Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        //数码管刷段码和位码
        }
        else if(Seg_no==4)                              
        {
                Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        //数码管刷段码和位码
        }
        else if(Seg_no==5)                                //第二个横杠
        {
                Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         //数码管刷段码和位码
        }
        else if(Seg_no==6)                              
        {
                Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        //数码管刷段码和位码
        }
        else if(Seg_no==7)                                //秒钟的个位
        {
                Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        //数码管刷段码和位码
        }
       
        else
        {
               
        }
        Seg_no ++;
        if( Seg_no >7)
                Seg_no=0;
}

u8 Key_Vol3 = 0;
u8 key_n0 = 0;

void PW_write_Task(void)
{
        if( key_num <0xff )
        {
                Key_Vol3++;
                if(Key_Vol3== 5 )
                {
//                        if(key_num ==0 )
//                        {
//                                passward[0] = 16;
//                                passward[1] = 16;
//                                passward[2] = 16;
//                                passward[3] = 16;
//                                passward[4] = 16;
//                                passward[5] = 16;
//                                passward[6] = 16;
//                                passward[7] = 16;
//                        }
                        passward[ key_n0 ] = key_num;
                        key_n0 ++;
//                        passward[7] = 17;
                        if( key_n0  == 8)                 //密码输入到了八位
                        {
                                if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
                                {
                                        passward[0] = 17;
                                        passward[1] = 17;
                                        passward[2] = 17;
                                        passward[3] = 17;
                                        passward[4] = 17;
                                        passward[5] = 17;
                                        passward[6] = 17;
                                        passward[7] = 1;
                            }
                                else
                                {
                                        passward[0] = 16;
                                        passward[1] = 16;
                                        passward[2] = 16;
                                        passward[3] = 16;
                                        passward[4] = 16;
                                        passward[5] = 16;
                                        passward[6] = 16;
                                        passward[7] = 16;
                                }
                                 key_n0 = 0;
                        }
                       
                }
        }
        else
        {
                Key_Vol3= 0;
        }
}

void INT1_Init(void)
{
        IT1 = 1;                //下降沿中断
        EX1 = 1;                //打开中断允许
        EA = 1;                        //打开总中断
}
void INT_ISR(void) interrupt 2
{
        P01 = !P01;
}


AI8051U教学视频第13集外部中断.zip

168.18 KB, 下载次数: 17

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-16 09:57:09

14

主题

93

回帖

1092

积分

版主

积分
1092
发表于 2025-1-24 17:02:03 | 显示全部楼层
跟着冲哥打卡第14集IO口中断,已手敲代码,测试通过
任务一:编写IO口中断程序


截图202501241655573893.jpg


任务二:编写P4端口的IO中断 打断 P3低电平中断的的程序(注意优先级)
截图202501241659044847.jpg



AI8051U第14集IO中断手敲代码.zip

4.6 MB, 下载次数: 15

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 15:34 , Processed in 2.381317 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表