找回密码
 立即注册
楼主: sujingliang

《Ai8051U教学视频》学习心得

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:605
  • 最近打卡:2025-08-13 07:56:05

17

主题

65

回帖

2112

积分

金牌会员

积分
2112
发表于 2025-1-3 13:32:51 | 显示全部楼层
《第十一集 矩阵按键》学习





一、注册任务
  1. static TASK_COMPONENTS Task_Comps[]=
  2. {
  3. //状态  计数  周期  函数
  4. {0, 500,   500, wash_Task},
  5. {0, 10,    10,    KEY_Task},      
  6. {0, 10,   10,    KEYBOARD_Task},         /*矩阵键盘*/
  7. {0, 200,   200,    matrix_Task},         
  8. };
复制代码
KEYBOARD_Task是矩阵按键任务


二、矩阵按键处理函数
这部分基本都是抄冲哥的,只是改成了4*4矩阵按键
  1. void KEYBOARD_Task(void)
  2. {
  3. //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  4.         KEY_COL1 = 0;
  5.         KEY_COL2 = 0;
  6.         KEY_COL3 = 0;
  7.         KEY_COL4 = 0;
  8.         KEY_ROW1 = 1;
  9.         KEY_ROW2 = 1;
  10.         KEY_ROW3 = 1;
  11.         KEY_ROW4 = 1;
  12.         
  13.         if(( KEY_ROW1 == 0 ) || ( KEY_ROW2 == 0 )|| ( KEY_ROW3 == 0 )|| ( KEY_ROW4 == 0 ))                //如果行按键有按下
  14.         {
  15.                 if(( KEY_ROW1 ==0 ) && ( KEY_ROW2 ==0 )&& ( KEY_ROW3 ==0 )&& ( KEY_ROW4 ==0 ))        //如果两行都有按键按下,不处理
  16.                 {
  17.                         
  18.                 }
  19.                 else if( KEY_ROW1==0||KEY_ROW2==0||KEY_ROW3 ==0||KEY_ROW4 ==0 )        //如果有按键按下,而且只有一颗
  20.                 {
  21.                         if( KEY_ROW1 ==0 )                                //判断哪一行,输出行开始的序号
  22.                                 key_num = 0;
  23.                         else if( KEY_ROW2 ==0 )
  24.                                 key_num = 4;
  25.                         else if( KEY_ROW3 ==0 )
  26.                                 key_num = 8;
  27.                         else if( KEY_ROW4 ==0 )
  28.                                 key_num = 12;
  29.                                 
  30.                         //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  31.                         KEY_COL1 = 1;
  32.                         KEY_COL2 = 1;
  33.                         KEY_COL3 = 1;
  34.                         KEY_COL4 = 1;
  35.                         KEY_ROW1 = 0;
  36.                         KEY_ROW2 = 0;
  37.                         KEY_ROW3 = 0;
  38.                         KEY_ROW4 = 0;
  39.                         
  40.                         if( KEY_COL1 ==0 )                                //判断哪一列,叠加按键的序号
  41.                         {
  42. //                                key_num = key_num ;
  43.                         }
  44.                         else if( KEY_COL2 ==0 )
  45.                         {
  46.                                 key_num = key_num + 1;
  47.                         }
  48.                         else if( KEY_COL3 ==0 )
  49.                         {
  50.                                 key_num = key_num + 2;
  51.                         }
  52.                         else if( KEY_COL4 ==0 )
  53.                         {
  54.                                 key_num = key_num + 3;
  55.                         }
  56.                         
  57.         
  58.                 }
  59.                 KEY_COL1 = 0;
  60.                 KEY_COL2 = 0;
  61.                 KEY_COL3 = 0;
  62.                 KEY_COL4 = 0;
  63.                 KEY_ROW1 = 1;
  64.                 KEY_ROW2 = 1;               
  65.                 KEY_ROW3 = 1;
  66.                 KEY_ROW4 = 1;
  67.         }
  68.         else
  69.         {
  70.                 key_num = 0xff;
  71.         }
  72.         
  73.         //③第三步:行列组合一下就可以判断出是哪个按键按下了。
  74. }
复制代码
三、在点阵屏上显示

  1. void matrix_Task(void)
  2. {
  3.     static u8 num=0;
  4.         
  5.     if(key_num!=0xff) num=key_num;
  6.         
  7.     clear_matrix8x8();
  8.         
  9.     if(num!=0xff){
  10.         set_matrix8x8(4,num%10);
  11.         set_matrix8x8(0,num/10);
  12.     }
  13.     show_matrix8x8(matrix1);                //显示
  14. }
复制代码


下面是595的驱动控制:
  1. void show_matrix8x8(u8 *pBuff)
  2. {
  3.     unsigned char k;
  4.     unsigned int m,n;
  5.        for(m=0;m<32;m++)    //为移动预留
  6.        {
  7.            
  8.                for(k=0;k<8;k++)   //行扫描
  9.                {
  10.                                                                  for(n=0;n<32;n++)//控制显示速度,防止闪烁
  11.                                                                 {
  12.                    HC595(~pos[k],0);
  13.                    HC595(pBuff[k],0);
  14.                    //delay_us(10);
  15.                    LED_RCK_CLR;
  16.                    LED_RCK_SET;    //并行输出
  17.                                                                          delay_us(5);
  18.                 }
  19.                                                         
  20.             }
  21.        }
  22. }
复制代码

  1. void HC595(u8 c,u8 PN)
  2. {
  3.     u8 i;
  4.     for(i=0;i<8;i++){
  5.         if(PN==0){                       //正常显示
  6.             if((c>>i) & 0x01) LED_SER_SET;
  7.             else LED_SER_CLR;
  8.         }
  9.         else{                                //反显
  10.             if((c>>i) & 0x01) LED_SER_CLR;
  11.             else LED_SER_SET;
  12.         }
  13.         LED_SRCK_CLR;
  14.         LED_SRCK_SET;     // 上升沿进行一次数据移入
  15.     }
  16. }
复制代码

  1. void set_matrix8x8(u8 startPos,u8 num)
  2. {
  3.         u8 i;
  4.         for(i=0;i<3;i++)
  5.         {
  6.                 matrix1[i+startPos]=NUM[i+num*3];
  7.         }
  8. }
  9. void clear_matrix8x8()
  10. {
  11.         u8 i;
  12.         for(i=0;i<8;i++)
  13.         {
  14.                 matrix1[i]=0x00;
  15.         }
  16. }
复制代码


全貌
2.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-08-13 13:37:55
已绑定手机

6

主题

31

回帖

320

积分

中级会员

积分
320
发表于 2025-1-9 12:54:59 | 显示全部楼层
写的不错,学习了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:605
  • 最近打卡:2025-08-13 07:56:05

17

主题

65

回帖

2112

积分

金牌会员

积分
2112
发表于 2025-1-14 10:37:37 | 显示全部楼层
《第十二集 复位系统》

一、看门狗复位
为了解决单片机死机问题,设计者给单片机设计了一种叫做看门狗的模块

16.png

17.png

二、软件复位
15.png

IAP_CONTR=0x60;触发软件复位,软件复位后从系统ISP区开始执行代码


三、实验
1、显示版本"U1.00"
条件有限只能先用虚拟数码管显示一下
  1. void SEG7_show_verion(void)
  2. {
  3.         BYTE cod[8];
  4.         cod[0] = 0x00;
  5.         cod[1] = 0x00;
  6.         cod[2] = 0x00;
  7.         cod[3] = 0x00;
  8.         cod[4] = 0x3e;
  9.         cod[5] = 0x86;
  10.         cod[6] = 0x3f;
  11.         cod[7] = 0x3f;
  12.         SEG7_ShowCode(cod);
  13. }
复制代码


14.png
2、按键复位

  1. void KEY_Task(void)
  2. {
  3.                
  4.         if(KEY1==0)                       
  5.                 {
  6.                         delay_ms(10);
  7.                         if(KEY1==0){
  8.                                 LED2=~LED2;
  9.                                        
  10.                                 IAP_CONTR=0x60;
  11.                         }
  12.                         while(KEY1==0);
  13.                 }
复制代码
3、看门狗设置

  1.        
  2.         WDT_CONTR=0x24;        //看门狗设置
  3.         while(1)
  4.         {
  5.                 Task_Pro_Handler_Callback();                                //执行功能函数       
  6.                
  7.                 WDT_CONTR=0x34;                //喂狗
复制代码


条件有限先完成这些
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-14 06:20 , Processed in 0.563012 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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