麦丽素 发表于 2024-11-29 11:39:41

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

跟着冲哥打卡第五集 C语言基础 完成
C语言USB-CDC串口之printf趣数的实现
1.打开USB库中的PRINTF.HIQ宏定义(去掉//)
2.理解PRINTF的函数原型的定义 #define printf printf_hid int printf_hid (const char *fmt; ...);
参数fmt --是格式控制字符串,包含了两种类型的对象:普通字符和转换说明普通字符:在输出时,普通字符将原样不动地复制到标准输出。

转换说明简介
1.类型:根据不同的fmt字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了fmt参数中指定的每个%标签。关子附加参数,既可以是变量,也可以是常量。
2.位置: printf()函数的普通字符和转换说明放在""双引号内,附加参数放在双引号外,每个附加参数之间用逗号隔开。
3.数量:printf()的附加参数与转换说明符是。一对应关系,如果有n个转换说明符;,printf)的参数就应该有n+1个。如果参数个数少于对应的转换说明符,printf(可能会输出内存中的任意值。


麦丽素 发表于 2024-12-5 14:13:39

第六集I/O口输入输出 打卡完成
代码测试已通过


麦丽素 发表于 2024-12-5 14:25:08

第七集定时器中断 打卡完成
代码测试已通过

麦丽素 发表于 2024-12-10 16:32:59

第八课:定时器周期性调度任务。编译过程中也出现了很多错误,一个分号的失误也是排查了很久,不能遗漏小小的一个符号
任务1:用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED30.9秒取反一次
任务2:数组点亮LED,实现流水灯
任务3:按键1按一下,LED通过数组移动一下

麦丽素 发表于 2024-12-26 16:26:50

任务一:数码管静态显示一个数字

麦丽素 发表于 2024-12-27 14:59:44

任务2:数码管显示 12345678

麦丽素 发表于 2024-12-27 15:41:05

任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1;

麦丽素 发表于 2024-12-27 16:42:02

任务四:虚拟显示——LED和数码管

麦丽素 发表于 2024-12-30 16:26:11

第十集 虚拟LED数码管,已手敲代码,编译通过
任务1: P2口流水灯,P10闪烁

#include "io.h"

u8 State1 = 0;                              //LED1初始状态
u8 State2 = 0;                              //LED2初始状态      
u8 State3 = 0;                              //LED3初始状态
u16 Key_Vol = 0;                        //按键按下持续时间

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( P32 == 0 )
      {
                Key_Vol++;
                if(Key_Vol==5)
                {
                //按键按下的任务
                        printf("按键单击\r\n");
                }
      }
      else
      {
                Key_Vol = 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);
      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;      
}

任务2:左边数码管显示P32按下次数,右边数码管显示P33按下次数

#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;

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);
      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 );
}
任务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;

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);
      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 );
}



麦丽素 发表于 2024-12-31 11:35:21

第十一课:矩阵按键
独立按键:一端接单片机引脚,一端接地或电源,一个按键对应一个端口。
矩阵按键:有限端口实现更多按键,按键检测比独立按键慢。
按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。①第一步:现将P0.0-P0.3输出低电平,P0.6- P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。③第三步:行列组合一下就可以判断出是哪个按键按下了。

#include "io.h"

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

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

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 =
{
        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( P32 == 0 )
        {
                Key_Vol++;
                if( Key_Vol==5 )
                {
                        //按键按下的任务
                        printf( "按键单击\r\n" );
                }
        }
        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;

//任务一:数码管显示当前的按键号
void Task_1(void)
{
       
        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( ROW1 ==0 )
                                key_num = 4;
                       
                        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 , ~T_NUM);
        else
        Display_Seg( SEG_NUM , ~T_NUM);
}

页: [1] 2
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习打卡