MJBZ 发表于 2025-11-22 22:32:20

今天我学习了《Ai8051U深度入门》教学视频第9课 数码管的静态数码管部分,看了视频才知道,原来数码管显示还能用上结构体,74hc595的控制程序还能这样写,这是以前各种8051单片机书上没有看过的内容,每年这么多单片机的课本的都是无脑重复,真的想起一句话,学校里学的单片机太简单基础,都不知道现在公司里的单片机技术发展到什么样子。

MJBZ 发表于 2025-11-23 09:09:22

今天学习了 《Ai8051U深度入门》教学视频第9节 第二个任务,动态显示0-7,我学到了 断码和位码都可以设定为数组,通过循环调用数组,每个数码管显示1ms,8个数码管时间不超过20ms防止闪烁,就可以固定的动态的显示0-7,调用数组号,如果需要增加,每次+1要写在[]方括号里。

MJBZ 发表于 2025-11-24 20:20:25

今天在B站学习了《Ai8051U深度入门》第9节 数码管的第三个任务,显示动态电子时钟,学习到 if else语句可以写很长,使用结构体的时候,每个数码管写一个seg_no ,1ms扫显示一个,8个数码管循环扫描,在从Task任务里 写一个shi fen miao的自加函数,就可以做成一个简易的电子时钟。我还发现B站的教学视频可以达到1080p,比在论坛里的视频看的清楚。

MJBZ 发表于 2025-11-25 11:30:44

今天学习了《Ai8051U深度入门》视频第9节课的 虚拟数码管部分,学习到了使用ISP软件+实验箱/擎天柱开发板进行虚拟数码管显示,还了解到了ISP软件在数码管显示方面的许多功能和强大的实力。不过视频里的ISP软甲版本是V6.94Y,我用的版本是V6.96E,比视频里的功能又增加了不少。

MJBZ 发表于 2025-11-25 20:55:53

今天复习了结构体流水灯和虚拟led端口显示,使用数组的形式显示火车流水灯,但是在怎样只开P2口并做到虚拟显示的函数PLED_40这里,我还是没理解端口设置,在cod = ~T_NUM;                //P2 保持段码输出 这里 把~T_NUM换掉,ISP软件的虚拟显示就不工作了。。。。
#include "io.h"

u8 T_NUM =
{
        0X01,0X03,0X07,0X0F,0X1F,0X3F,0X7F,0XFF,
        0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00
};

u8 state_now = 0;

void PLED_40(void)
{
        u8 cod;
        cod = 0x0f;                //表示开启P0-P3
        cod = 0X00;                //关闭P0端口       
        cod = 0X00;                //关闭P1
        cod = ~T_NUM;                //P2 保持段码输出
        cod = 0X00;                //关闭P3
        LED40_SendData( cod,5 ); //仍发送前5个元素(使能P0-P3配置)
       
        P2 = ~T_NUM;//直接控制P2输出
       
        state_now++;
        if( state_now>15 )
                state_now = 0;

       
}

#include "task.h"
#include "io.h"




static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
       
{0, 150,   150,   PLED_40},      /* task 1 Period: 150ms */

};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
      if(Task_Comps.TIMCount)      /* If the time is not 0 */
      {
            Task_Comps.TIMCount--;   /* Time counter decrement */
            if(Task_Comps.TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime;
                Task_Comps.Run = 1;      /* The task can be run */
            }
      }
    }
}

//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
      if(Task_Comps.Run) /* If task can be run */
      {
            Task_Comps.Run = 0;      /* Flag clear 0 */
            Task_Comps.TaskHook();   /* Run task */
      }
    }
}

MJBZ 发表于 2025-11-27 13:41:07

今天搞懂了 控制DIP40的各个管脚上LED状态的 库函数调用,前天学习代码的时候,void PLED_40(void)我并没有看懂命令格式,今天看懂了,1-4字节的4CH 45H 44H 28H 是固定的不能变动,第5字节的意思是 之后有效数据长度,这个可以在代码写完再改,第6字节是P0-P5端口的屏蔽为,ISP软件的示例3 第6字节是0FH,就是

0-0-0-0--1--1--1--1,
0-0-0-0-P4-P3-P2-P4
意思就是打开P0-P4口,
从第7字节开始,代码开始描述端口状态,
那么 4CH 45H 44H 28H 05H 0FH 11H 22H 33H 44H
      -----命令头--------|长度|端口|2灯|4灯|6灯|2灯      
反过来再看命令,因为在第6字节描述哪个端口开关之后,又用了4个字节描述每个端口的状态,所以4+1是5,在第5字节描述有效数据长度就是05H,
我前天使用虚拟显示的时候,用P2端口显示流水灯,但是其他端口也有虚拟端口亮,当时不知道为什么,
今天想明白了,因为用的是取反,所以 其他口我以为是灭,其实是亮

MJBZ 发表于 2025-11-27 13:41:58

当我把代码改为如下就只有P2口流水灯了
#include "io.h"

u8 T_NUM =
{
        0X01,0X03,0X07,0X0F,0X1F,0X3F,0X7F,0XFF
};

u8 state_now = 0;

void PLED_40(void)
{
        u8 cod;
        cod = 0x0f;                //表示开启P0-P3
        cod = 0Xff;                //P0端口       
        cod = 0Xff;                //P1
        cod = ~T_NUM;                //P2
        cod = 0Xff;                //P3
        LED40_SendData( cod,5 );
       
        P2 = ~T_NUM;
       
        state_now++;
        if( state_now>7 )
                state_now = 0;

}

MJBZ 发表于 2025-11-30 21:38:00

今天又研究了一下虚拟显示LED的代码,搞明白了,虚拟显示和实际显示是两回事,PLED-40()函数只是把LED信息打包放在信封里,发给单片机,其实虚拟显示和实际显示可以自己显示自己的,互不干扰,互不影响,我有修改了代码,让P0口,P1口和P2口 分别显示P2口的流水灯,但是擎天柱开发板上只有P2显示,
#include "io.h"

u8 T_NUM =
{
        0X01,0X03,0X07,0X0F,0X1F,0X3F,0X7F,0XFF,
        0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00
};

u8 state_now = 0;

void PLED_40(void)
{
        u8 cod;
        cod = 0x0f;                //表示开启P0-P3
        cod =~T_NUM;        //关闭P0端口       
        cod = ~T_NUM;        //关闭P1
        cod = ~T_NUM;                //P2 保持段码输出
        cod = 0XFF;                //关闭P3
        LED40_SendData( cod,5 ); //仍发送前5个元素(使能P0-P3配置)
       
        P2 = ~T_NUM;//直接控制P2输出
       
        state_now++;
        if( state_now>15 )
                state_now = 0;

       
}

MJBZ 发表于 2025-12-1 12:02:23

今天看了《Ai8051U深度入门》教学视频第10节的前半部分,明白了 LED虚拟显示的 命令格式

例如 功能1控制DIP40各个管脚上LED状态和功能2指定管脚上的LED状态,命令格式类似,但是库函数名称不一样
格式都是: 4CH|45H|44H|28H|02H|01H|55H
描述   :    -----------------固定头---------|-长度--|--端口-|-状态-

MJBZ 发表于 2025-12-1 16:17:35

今天看了《Ai8051U深度入门》教学视频第10节的前半部分,明白了 LED虚拟显示的 命令格式

例如 功能1控制DIP40各个管脚上LED状态和功能2指定管脚上的LED状态,命令格式类似,但是库函数名称不一样,功能3控制
功能3    格式             4CH|45H|44H|28H| x1   |   x2   |pn
   字节顺序                1字节|2字节|3字节 |4字节| 5字节 |6字节 |7字节
示例:                  4CH|45H|44H|28H|02H|01H|55H
             描述   :    -----------------固定头---------|-长度--|--端口-|-状态-
第6字节组成:    bit7   bit6    bit5    bit4    bit3    bit2    bit1    bit0
代表端口                               P5      P4      P3      P2   P1      P0         
计算                   8      4      2      1      8       4       2       1
3示1   01H          0      0      0      0      0      0       0       1    --设置P0口
3示2   04H          0      0      0      0      0      1       0       0    --设置P2口

第7字节组成:    bit7   bit6    bit5    bit4    bit3    bit2    bit1    bit0
计算                   8      4      2      1      8       4       2       1
3示1   55H          0      1      0      1      0       1       0       1
3示2   AAH         1         0      1       0      1       0       1       0

第5字节长度的意思就是从第五字节向后还有几个字节,第5字节就写几,示例中第5字节后面还有两个字节,所以第五字节就是02H

功能1和功能2指定管脚输出低/高电平
功能1/2    格式             4CH|45H|44H|28H| 02H   |00H   |px
   字节顺序                   1字节|2字节|3字节 |4字节| 5字节 |6字节 |7字节
描述   :                     -----------------固定头---------|-长度--|-固定-|-状态-

示例1                           4CH      45H    44H    28H|02H|00H | 03H
描述   :                     |----------------固定头---------|-长度--|-固定-|-状态-

第7字节组成:                  bit7   |   bit6    bit5    bit4    bit3 |bit2    bit1    bit0 |
描述                        高平1/低0 |------指定管脚-------------|-----指定第几位----|
含义                                 1/0      8       4       2       1    |    4      2       1
计算                                  8         4      2       1      8          4      2       1
功1示1第7字节03H         0          0       0       0       0         0      1       1
含义                            低电平   |--------P0管脚--------------|------第3位-------
功1示2 第7字节   25H         0         0      1      0       0          1      0      1                  
含义                            低电平   |--------P4管脚--------------|------第5位-------   

说实话第7字节为25H,代表P4.5口 我有点懵,
页: 1 2 3 4 [5] 6
查看完整版本: Ai8051U学习打卡