今天我学习了《Ai8051U深度入门》教学视频第9课 数码管的静态数码管部分,看了视频才知道,原来数码管显示还能用上结构体,74hc595的控制程序还能这样写,这是以前各种8051单片机书上没有看过的内容,每年这么多单片机的课本的都是无脑重复,真的想起一句话,学校里学的单片机太简单基础,都不知道现在公司里的单片机技术发展到什么样子。
今天学习了 《Ai8051U深度入门》教学视频第9节 第二个任务,动态显示0-7,我学到了 断码和位码都可以设定为数组,通过循环调用数组,每个数码管显示1ms,8个数码管时间不超过20ms防止闪烁,就可以固定的动态的显示0-7,调用数组号,如果需要增加,每次+1要写在[]方括号里。
今天在B站学习了《Ai8051U深度入门》第9节 数码管的第三个任务,显示动态电子时钟,学习到 if else语句可以写很长,使用结构体的时候,每个数码管写一个seg_no ,1ms扫显示一个,8个数码管循环扫描,在从Task任务里 写一个shi fen miao的自加函数,就可以做成一个简易的电子时钟。我还发现B站的教学视频可以达到1080p,比在论坛里的视频看的清楚。
今天学习了《Ai8051U深度入门》视频第9节课的 虚拟数码管部分,学习到了使用ISP软件+实验箱/擎天柱开发板进行虚拟数码管显示,还了解到了ISP软件在数码管显示方面的许多功能和强大的实力。不过视频里的ISP软甲版本是V6.94Y,我用的版本是V6.96E,比视频里的功能又增加了不少。
今天复习了结构体流水灯和虚拟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 */
}
}
}
今天搞懂了 控制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端口显示流水灯,但是其他端口也有虚拟端口亮,当时不知道为什么,
今天想明白了,因为用的是取反,所以 其他口我以为是灭,其实是亮
当我把代码改为如下就只有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;
}
今天又研究了一下虚拟显示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;
}
今天看了《Ai8051U深度入门》教学视频第10节的前半部分,明白了 LED虚拟显示的 命令格式
例如 功能1控制DIP40各个管脚上LED状态和功能2指定管脚上的LED状态,命令格式类似,但是库函数名称不一样
格式都是: 4CH|45H|44H|28H|02H|01H|55H
描述 : -----------------固定头---------|-长度--|--端口-|-状态-
今天看了《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口 我有点懵,