找回密码
 立即注册
楼主: 乐高

AI8051U教学视频课后小练 | 高质量打卡

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-19 10:12:52 | 显示全部楼层
神*** 发表于 2025-1-19 09:16
《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套 - TinyML,Ai8051U  ...

这一段只详细讲了功能2:在数码管上显示4字节长整型数;功能1没有展开讲,只是一笔带过。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-20 14:59:08 | 显示全部楼层
第11集  矩阵按键  课后小练
简易洗衣机面板
1.按下开机键后,数码管显示1,表示默认为清洗模式1;
2.用矩阵按键模拟洗衣机的操作面板,前五个按键模拟1-5的清洗模式按键,选择几的时候数码管显示数字几,表示以当前为第几个功能;
3.按下启动后,按照选择的模式对应的时间开始倒计时,倒计时结束后,数码管熄灭,表示清洗完成(清洗时间自己随意设置)。
因为手头没有合适的矩阵键盘所以今天现焊了一块4 x 4的矩阵键盘。
IMG_20250120_143852.jpg   1-5键设置了模式参数,16键设置为启动键。6-15键没设置,为空键。
矩阵键盘接口为P2口。数码管显示采用HC595驱动的8位数码管,但只驱动了末后两位。程序在冲哥的第11集DEMO程序的基础上稍作了一些增减。
下面为矩阵键盘扫描程序
  1. void KEY_Task(void)                           //4*4矩阵键盘扫描
  2. {  //#define key P2                                        //矩阵键盘的数据口为P2
  3.         u8 key_temp;
  4.          u8 key1,key2;
  5.          key=0xf0;
  6.         key1=key;
  7.         if(key1 != 0xf0 )
  8.         {
  9.                 key1=key&0xf0;                          //确定哪一行的按键按下        
  10.                 key=0x0f;
  11.                 key2=key;
  12.                 if(key2 != 0x0f )
  13.                         key2=key&0x0f;                  //确定哪一列的按键按下
  14.                 key_temp=key1|key2;                  //确定按键位置
  15.     }
  16. //        else
  17. //                key_temp = no_key ;
  18.         switch(key_temp)                //当确定按键按下后,列举所有的按键情况
  19.         {
  20.                  case 0xee: key_value=0;break;
  21.                  case 0xde: key_value=1;break;
  22.                  case 0xbe: key_value=2;break;
  23.                  case 0x7e: key_value=3;break;
  24.                  case 0xed: key_value=4;break;
  25.                  case 0xdd: key_value=5;break;
  26.                  case 0xbd: key_value=6;break;
  27.                  case 0x7d: key_value=7;break;
  28.                  case 0xeb: key_value=8;break;
  29.                  case 0xdb: key_value=9;break;
  30.                  case 0xbb: key_value=10;break;
  31.                  case 0x7b: key_value=11;break;
  32.                  case 0xe7: key_value=12;break;
  33.                  case 0xd7: key_value=13;break;
  34.                  case 0xb7: key_value=14;break;
  35.                  case 0x77: key_value=15;break;
  36.                 // case 0xff: key_value=16;break;                        
  37.         }
  38.         switch(key_value)
  39.         {
  40.                 case 0: fen = 10;break;                                //赋予1-5各按键所表示模式运行时间
  41.                 case 1: fen = 11;break;
  42.                 case 2: fen = 12;break;
  43.                 case 3: fen = 13;break;
  44.                 case 4: fen = 14;break;
  45.                 case 15: start = 1;break;                        //第16键设置为启动工作键
  46.         }
  47. }
复制代码
数码管显示程序:
  1. u8 SEG_NUM[]=          //数码管段码数组
  2. {
  3.     0x3F,       /*'0', 0*/
  4.     0x06,       /*'1', 1*/
  5.     0x5B,       /*'2', 2*/
  6.     0x4F,       /*'3', 3*/
  7.     0x66,       /*'4', 4*/
  8.     0x6D,       /*'5', 5*/
  9.     0x7D,       /*'6', 6*/
  10.     0x07,       /*'7', 7*/
  11.     0x7F,       /*'8', 8*/
  12.     0x6F,       /*'9', 9*/
  13.     0x77,       /*'A', 10*/
  14.     0x7C,       /*'B', 11*/
  15.     0x39,       /*'C', 12*/
  16.     0x5E,       /*'D', 13*/
  17.     0x79,       /*'E', 14*/
  18.     0x71,       /*'F', 15*/
  19.     0x40,       /*'-', 16*/
  20.     0x00,       /*' ', 17*/
  21.     0x80,       /*'.', 18*/
  22. };
复制代码
  1. void Seg_Task(void)
  2. {
  3.         if(key_value != 15)                                                                   //按任意一个模式选择键,回到等待启动状态
  4.                 start = 0;
  5.         if(start)                                                                                   //启动工作后数码管显示倒计时时间,否则显示模式编号
  6.                 num = fen;        
  7.         else
  8.            num = key_value+1;                                           //+1        为默认模式号为1                                
  9.         
  10.         
  11.         if( Seg_no ==0 )                                                               
  12.         {
  13.                 if(num%10==0&&num/10==0)                                                //如果十位和个位都为0,则消隐
  14.                         Display_Seg( SEG_NUM[17] , ~T_NUM[7]);               
  15.                 else
  16.                         Display_Seg( SEG_NUM[num%10] , ~T_NUM[7]);        //显示个位数字
  17.         }
  18.         else if( Seg_no ==1 )                                                        
  19.         {
  20.                 if(num/10==0)                                                                        //如果十位为0,则消隐
  21.                         Display_Seg( SEG_NUM[17] , ~T_NUM[6]);
  22.                 else
  23.                         Display_Seg( SEG_NUM[num/10] , ~T_NUM[6]);               
  24.         }        
  25.         else
  26.         {        }
  27.         Seg_no ++;
  28.         if( Seg_no>1 )
  29.                 Seg_no=0;
  30. }
复制代码
ISP软件端虚拟数码管显示程序:
  1. void SEG_PC( void )                              //只显示末两位
  2. {
  3.         u8 cod[8];        
  4.         cod[0] = SEG_NUM[17];                                         
  5.         cod[1] = SEG_NUM[17];
  6.         cod[2] =SEG_NUM[17];                                                
  7.         cod[3] = SEG_NUM[17];                                          
  8.         cod[4] = SEG_NUM[17];
  9.         cod[5] = SEG_NUM[17];                                                        
  10.     if(num/10==0)                                        //如果十位为0,则消隐
  11.                 cod[6] = SEG_NUM[17];               
  12.         else
  13.                 cod[6] = SEG_NUM[num/10];        
  14.         if(num/10==0 && num%10==0)                //如果十位和个位都为0,则消隐
  15.                 cod[7] = SEG_NUM[17];
  16.         else
  17.             cod[7] = SEG_NUM[num%10];
  18.         
  19.         SEG7_ShowCode(cod);
  20. }
复制代码
放上完整演示视频





11.矩阵键盘.zip

154.65 KB, 下载次数: 24

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-21 09:58:01 | 显示全部楼层
第十一集  矩阵键盘     任意端口组合矩阵键盘数据口
前面的矩阵键盘接口程序用了一个完整的8位P2口,这样编写程序比较简单明了。如果矩阵键盘接的不在一个口上,就不能用前面的程序了,需要加以处理才能使用。
如果矩阵键盘8个接口如下
  1. sbit COL1 =        P2^0;                        //矩阵键盘的数据口端口定义
  2. sbit COL2 =        P2^1;
  3. sbit COL3 =        P2^2;                        
  4. sbit COL4 =        P2^3;
  5. sbit ROW1 =        P5^7;
  6. sbit ROW2 =        P5^6;
  7. sbit ROW3 =        P3^7;
  8. sbit ROW4 =        P3^6;
复制代码
需要使用如下的代码进行处理
  1. //矩阵端口数据处理,逐位放入对应的IO口
  2. void Matrixkey_W(u8 m)            //向8个管脚写入数据
  3. {
  4.         COL1 = m & (0x01<<0);
  5.         COL2 = m & (0x01<<1);
  6.         COL3 = m & (0x01<<2);
  7.         COL4 = m & (0x01<<3);
  8.         ROW1 = m & (0x01<<4);
  9.         ROW2 = m & (0x01<<5);
  10.         ROW3 = m & (0x01<<6);
  11.         ROW4 = m & (0x01<<7);
  12. }
  13. u8 Matrixkey_R()                                 //从8个管脚读出数据
  14. {
  15.   u8 n;
  16.    n  &= (u8)COL1;
  17. // if(COL1)     //这个地方有个疑问,如用了这两行代码,程序跑起来就不正常,        
  18. //   n |= 0x01;                                         //改用上一条代码,程序就正常,真是奇了怪了!
  19.    if(COL2)
  20.          n |= 0x02;
  21.    if(COL3)
  22.         n  |= 0x04;
  23.    if(COL4)
  24.          n |= 0x08;
  25.    if(ROW1)
  26.          n |= 0x10;
  27.    if(ROW2)
  28.          n |= 0x20;
  29.    if(ROW3)
  30.          n |= 0x40;
  31.    if(ROW4)
  32.          n |= 0x80;
  33.    return n;
  34. }
复制代码
  1. void KEY_Task(void)                                                            //4*4矩阵键盘扫描
  2. {  
  3.         u8 key_temp;
  4.         u8 key1,key2;
  5.         Matrixkey_W(0xf0);
  6.         key1 = Matrixkey_R();
  7.         if(key1 != 0xf0 )
  8.         {
  9.                 key1 = Matrixkey_R()&0xf0;                                    //确定哪一行的按键按下       
  10.                 Matrixkey_W(0x0f);
  11.                 key2 = Matrixkey_R();
  12.                 if(key2 != 0x0f)
  13.                         key2 = Matrixkey_R()&0x0f;                    //确定哪一列的按键按下
  14.                 key_temp=key1|key2;                                    //确定按键位置
  15.                
  16.     }
  17.         switch(key_temp)                                                //当确定按键按下后,列举所有的按键情况
  18.         {
  19.                  case 0xee: key_value=0;break;
  20.                  case 0xde: key_value=1;break;
  21.                  case 0xbe: key_value=2;break;
  22.                  case 0x7e: key_value=3;break;
  23.                  case 0xed: key_value=4;break;
  24.                  case 0xdd: key_value=5;break;
  25.                  case 0xbd: key_value=6;break;
  26.                  case 0x7d: key_value=7;break;
  27.                  case 0xeb: key_value=8;break;
  28.                  case 0xdb: key_value=9;break;
  29.                  case 0xbb: key_value=10;break;
  30.                  case 0x7b: key_value=11;break;
  31.                  case 0xe7: key_value=12;break;
  32.                  case 0xd7: key_value=13;break;
  33.                  case 0xb7: key_value=14;break;
  34.                  case 0x77: key_value=15;break;
  35.                
  36.                 // case 0xff: key_value=16;break;                       
  37.         }
  38.         switch(key_value)
  39.         {
  40.                 case 0: fen = 10;break;                                //赋予1-5各按键所表示模式运行时间
  41.                 case 1: fen = 11;break;
  42.                 case 2: fen = 12;break;
  43.                 case 3: fen = 13;break;
  44.                 case 4: fen = 14;break;
  45.                 case 15: start = 1;break;                        //第16键设置为启动工作键
  46.         }
  47. }
复制代码

其他代码不变,还是沿用前面附件里的程序。
11.矩阵键盘 自由组合IO.zip (160.08 KB, 下载次数: 30)



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-02-14 13:39:49
已绑定手机

19

主题

273

回帖

2152

积分

金牌会员

积分
2152
QQ
发表于 2025-1-21 11:40:59 | 显示全部楼层
感谢您的支持与任何,今天给您免费包邮送AI8051U实验箱,期待您更多的测评
QQ:1638975601
手机:19952583876(微信同号)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2025-1-21 12:04:03 | 显示全部楼层
乐*** 发表于 2025-1-19 08:44
有一个问题想请教一下:
STC_ISP 调试仿真接口下面的调试接口协议中,7段数码管接口的功能1:


和printf用法一样的,只是要考虑数码管不能显示一些特殊的字符和汉字等等,只要能显示的字符和数字就能直接当printf这么用~!

截图202501211203088178.jpg
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-21 12:19:20 | 显示全部楼层
电子DI*** 发表于 2025-1-21 12:04
和printf用法一样的,只是要考虑数码管不能显示一些特殊的字符和汉字等等,只要能显示的字符和数字就能 ...

谢谢版主的回复,现在明白了!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-21 14:08:31 | 显示全部楼层
第13楼   矩阵键盘     任意端口组合矩阵键盘数据口

程序的疑问已经解决。只要在Matrixkey_R()函数内定义n的时候预赋值为0就可以了。不是说好的定义默认值为0的吗?
  1. u8 Matrixkey_R()                                 //从8个管脚读出数据
  2. {
  3.   u8 n =0;
  4.   // n  &= (u8)COL1;  这条语句就不用了
  5.    if(COL1)                                                       
  6.          n |= 0x01;                                         
  7.    if(COL2)
  8.          n |= 0x02;
  9.    if(COL3)
  10.         n  |= 0x04;
  11.    if(COL4)
  12.          n |= 0x08;
  13.    if(ROW1)
  14.          n |= 0x10;
  15.    if(ROW2)
  16.          n |= 0x20;
  17.    if(ROW3)
  18.          n |= 0x40;
  19.    if(ROW4)
  20.          n |= 0x80;
  21.    return n;
  22. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-22 14:04:20 | 显示全部楼层
第12集 复位系统 课后小练

复位系统.png
这一课的课后小练是在第10课的基础上加了看门狗复位,开机LOGO,以及按键复位。
密码从“12345678”改为“12345670”,便于实验箱2x4矩阵键盘输入。
由于马上要回老家过年了,时间太仓促,程序没有整理。没有做完硬件矩阵按键数码管和虚拟键盘数码管共同操作的程序。
以后有时间再慢慢修改,完善。

12 看门狗.zip (177.27 KB, 下载次数: 26)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-28 20:30:55 | 显示全部楼层
第十三集   外部中断
第十三集 外部中断.png
  1. #include "ai8051u.h"
  2. #include "stc32_stc8_usb.h"
  3. #include "intrins.h"
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. void Delay20ms(void);
  8. void main()
  9. {
  10.     P_SW2 |= 0x80;                                                                  //外设端口切换寄存器,P_SW2第7位EAXFR置一使能访问XFR  
  11.     CKCON = 0x00;
  12.                 WTST = 0x00;
  13.           P0M1 = 0x00;   P0M0 = 0x00;
  14.     P1M1 = 0x00;   P1M0 = 0x00;
  15.     P2M1 = 0x00;   P2M0 = 0x00;
  16.     P3M1 = 0x00;   P3M0 = 0x00;
  17.     P4M1 = 0x00;   P4M0 = 0x00;                           
  18.     P5M1 = 0x00;   P5M0 = 0x00;
  19.     P6M1 = 0x00;   P6M0 = 0x00;
  20.     P7M1 = 0x00;   P7M0 = 0x00;
  21.     usb_init();                                     //USB CDC 接口配置   
  22.     IE2 |= 0x80;                                    //使能USB中断
  23.                 IT1 = 1;                                                                                                                                                                //使能INT1下降沿中断
  24.           EX1 = 1;                                                                                                                                                                //使能INT1中断
  25.           EA = 1;  
  26.                 P40 = 0;
  27.     P06=0;               
  28.     while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  29.     while (1)
  30.     {
  31.         if (bUsbOutReady)
  32.         {
  33.            USB_SendData(UsbOutBuffer,OutNumber);    //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  34.             
  35.             usb_OUT_done();
  36.         }
  37.                
  38.      if(P01==0)
  39.                  {
  40.                                 Delay20ms();
  41.                           if(P01==0)
  42.                                         P00 = 0;
  43.                                 while(P01==0);                                 
  44.                  }                        
  45.          }
  46. }
  47. void INT1_Isr() interrupt 2
  48. {
  49.   P00 = 1;
  50. }
  51. void Delay20ms(void)        //@24.000MHz
  52. {
  53.         unsigned long edata i;
  54.         _nop_();
  55.         _nop_();
  56.         i = 119998UL;
  57.         while (i) i--;
  58. }
复制代码



13 外部中断.zip

79.29 KB, 下载次数: 21

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-05-03 13:57:08
已绑定手机

1

主题

60

回帖

287

积分

中级会员

积分
287
发表于 2025-1-28 20:50:38 | 显示全部楼层
第十四集  IO中断
第十四集-IO中断.png
  1. void common_isr() interrupt 37
  2. {
  3.         u8 intf;
  4.         intf = P0INTF;
  5.         if(intf)
  6.         {
  7.                 P0INTF = 0x00;
  8.                 if(intf & 0x02)
  9.                 {key_num = 1;P0INTE = 0x00;
  10.                 P07 = !P07;
  11.                 }
  12.                 if(intf & 0x04)
  13.                 {key_num = 2;P0INTE = 0x00;}
  14.                 if(intf & 0x08)
  15.                 {key_num = 3;P0INTE = 0x00;}
  16.         }
  17. }
复制代码
14 IO中断.zip (152.69 KB, 下载次数: 28)
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:04 , Processed in 1.432103 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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