fei2568 发表于 2024-12-24 12:50:08

<p>下面代码是数码管时钟的代码,断断续续学习了好几天</p>
<pre><code>MAIN.C
#include &quot;config.h&quot;
#include &quot;task.h&quot;
#include &quot;io.h&quot;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;

void main(void)
{
        Sys_init();
        usb_init();                                     //USB CDC 接口配置
        Timer0_Init();                                                                        //定时器初始化
        IE2|=0x80;                                                                                //使能USB中断
        Init_595();                                                                //595端口的初始化
        EA = 1;                                                                                        //开总中断吗?
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
        P40=0;

        while (1)
        {
                if (bUsbOutReady)                                                        //如果接收到了数据
                {
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                        usb_OUT_done();
                }
                //下面写代码
                Task_Pro_Handler_Callback();
        }
}

void Timer0_Isr(void) interrupt 1                                //1m秒中断执行一次
{
        Task_Marks_Handler_Callback();
}
</code></pre>
<pre><code>CONFIG.C
#include &quot;config.h&quot;

void Sys_init(void)
{
    WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;                                        //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;                                        //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;                                        //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;                                        //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;                                        //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;                                        //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;                                        //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;                                        //设置为准双向口
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &amp;= 0x7F;                        //定时器时钟12T模式
        TMOD &amp;= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
</code></pre>
<pre><code>////////TASK.C
#include &quot;task.h&quot;
#include &quot;io.h&quot;

static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
//    {0, 1,   1,   Sample_Display},      /* task 1 Period: 1ms */
//    {0, 10,10,Sample_MatrixKey},    /* task 2 Period: 10ms */
//    {0, 10,10,Sample_adcKey},       /* task 3 Period: 10ms */
//    {0, 300, 300, Sample_NTC},          /* task 4 Period: 300ms */
//    {0, 500, 500, Sample_RTC},          /* task 5 Period: 500ms */
//    /* Add new task here */
//        {0,300,300,LED0_Blink},
//        {0,600,600,LED1_Blink},
//        {0,2000,2000,LED2_Blink},
        {0,10,10,Key_Task},
        {0,1,1,Seg_Task},
        {0,1000,1000,run},
};

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&lt;Tasks_Max; i++)                                                                                                //循环好几次,几个任务几个循环
    {
      if(Task_Comps.TIMCount)      /* If the time is not 0 */                        //如果计数不为0
      {
            Task_Comps.TIMCount--;   /* Time counter decrement */                //计数减减
            if(Task_Comps.TIMCount == 0) /* If time arrives */                        //如果计数减到0
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime;                        //重装计数
                Task_Comps.Run = 1;      /* The task can be run */                //将run置为1
            }
      }
    }
}

//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i&lt;Tasks_Max; i++)                                                                                                //循环好几次,几个任务几个循环
    {
      if(Task_Comps.Run) /* If task can be run */                                                //如果哪个任务的run参数为1
      {
            Task_Comps.Run = 0;      /* Flag clear 0 */                                        //那么就将rin标志清0
            Task_Comps.TaskHook();   /* Run task */                                                //并且执行这个任务的任务
      }
    }
}

</code></pre>
<pre><code>////////IO.C
#include &quot;io.h&quot;

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 wei[]=
{
        0xfe,                /*'0', 0*/
        0xfd,                /*'1', 1*/
        0xfb,                /*'2', 2*/
        0xf7,                /*'3', 3*/
        0xef,                /*'4', 4*/
        0xdf,                /*'5', 5*/
        0xbf,                /*'6', 6*/
        0x7f,                /*'7', 7*/
};

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

u16 key_vol=0;

u8 shi=00;
u8 fen=00;
u8 miao=00;

void LED0_Blink(void)
{
        State0=!State0;
        P00=State0;
}

void LED1_Blink(void)
{
        State1=!State1;
        P01=State1;
}

void LED2_Blink(void)
{
        State2=!State2;
        P02=State2;
}

void Key_Task(void)
{
        if(P33==0)
        {
                key_vol++;
                if(key_vol==5)
                {
                        //执行按键按下的代码
                        printf(&quot;按键单击\r\n&quot;);
                        shi=0;
                        fen=0;
                        miao=0;
                }
        }
        else
        {
                key_vol=0;
        }
}

u8 shishi[]=
{
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,

};

void run(void)
{
        miao++;
        if(miao&gt;=60)
        {
                miao=0;
                fen++;
                if(fen&gt;=60)
                {
                        shi++;
                        if(shi&gt;=24)
                        {
                                shi=0;
                        }
                }
        }
        shishi=shi/10;
        shishi=shi%10;
        shishi=16;
        shishi=fen/10;
        shishi=fen%10;
        shishi=16;
        shishi=miao/10;
        shishi=miao%10;
}

void Init_595(void)
{
        HC595_SER=0;
        HC595_RCK=0;
        HC595_SCK=0;
}

void Send_595(u8 dat)
{
        u8 i;
        for(i=0;i&lt;8;i++)
        {
                dat&lt;&lt;=1;                                                                //dat左移一位
                HC595_SER=CY;                                                        //然后给到数据引脚
                HC595_SCK=1;                                                        //输出上升沿的时钟信号
                HC595_SCK=0;                                                        //请0以备下次输出
                //printf(&quot;%d\r\n&quot;,HC595_SER);
        }
}

void Display_Seg(u8 HC595_1,u8 HC595_2)
{
        Send_595(HC595_1);                                                        //段码输出,高电平点亮
        Send_595(HC595_2);                                                        //位码输出,低电平点亮
        HC595_RCK=1;
        HC595_RCK=0;
}

u8 i=0;
u8 num=0;
void Seg_Task(void)
{
        if(i==0)
        {
                num=shi/10;
        }
        else if(i==1)
        {
                num=shi%10;
        }
        else if(i==2)
        {
                num=18;
        }
        else if(i==3)
        {
                num=fen/10;
        }
        else if(i==4)
        {
                num=fen%10;
        }
        else if(i==5)
        {
                num=18;
        }
        else if(i==6)
        {
                num=miao/10;
        }
        else if(i==7)
        {
                num=miao%10;
        }
        Display_Seg(SEG_NUM,wei);
        i++;
        if(i&gt;=8)
        {
                i=0;
        }

}
</code></pre>

fei2568 发表于 2024-12-27 08:02:54

<p>焊了2块擎天柱板子,第一块主控焊反了,尽然没烧,厉害,</p>
<p>第2块就是一次性点亮</p>
<p>下面是图片视频</p>
<p><img src="data/attachment/forum/202412/27/080209aa04xz5dsdy4xf79.jpg" alt="微信图片_20241227075634.jpg" title="微信图片_20241227075634.jpg" /></p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=76983"></video>

fei2568 发表于 2024-12-27 08:03:34

<p>下面代码是擎天柱所有流水灯的</p>
<pre><code>#include &quot;io.h&quot;


u16 key_vol=0;
u8 i=0;

void Key_Task(void)
{
        if(P33==0)
        {
                key_vol++;
                if(key_vol==5)
                {
                        //执行按键按下的代码
                        printf(&quot;按键单击\r\n&quot;);

                }
        }
        else
        {
                key_vol=0;
        }
}



void run(void)
{
        if(i==0)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P20=0;
        }
        if(i==1)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P21=0;
        }
        if(i==2)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P22=0;
        }
        if(i==3)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P23=0;
        }
        if(i==4)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P24=0;
        }
        if(i==5)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P25=0;
        }
        if(i==6)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P26=0;
        }
        if(i==7)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P27=0;
        }
        if(i==8)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P40=0;
        }
        if(i==9)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P45=0;
        }
        if(i==10)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P46=0;
        }
        if(i==11)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P07=0;
        }
        if(i==12)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P06=0;
        }
        if(i==13)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P05=0;
        }
        if(i==14)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P04=0;
        }
        if(i==15)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P03=0;
        }
        if(i==16)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P02=0;
        }
        if(i==17)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P01=0;
        }
        if(i==18)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P00=0;
        }
        if(i==19)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P10=0;
        }
        if(i==20)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P11=0;
        }
        if(i==21)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P12=0;
        }
        if(i==22)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P13=0;
        }
        if(i==23)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P14=0;
        }
        if(i==24)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P15=0;
        }
        if(i==25)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P16=0;
        }
        if(i==26)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P17=0;
        }
        if(i==27)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P50=0;
        }
        if(i==28)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P51=0;
        }
        if(i==29)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P32=0;
        }
        if(i==30)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P33=0;
        }
        if(i==31)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P34=0;
        }
        if(i==32)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P35=0;
        }
        if(i==33)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P36=0;
        }
        if(i==34)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P37=0;
        }
        if(i==35)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P56=0;
        }
        if(i==36)
        {
                P0=0xFF;
                P1=0xFF;
                P2=0xFF;
                P3=0xFF;
                P4=0xFF;
                P5=0xFF;
                P57=0;
        }
        i++;
        if(i&gt;=37)
        {
                i=0;
        }
}
</code></pre>

fei2568 发表于 2025-1-4 13:34:27

好几天没有学习更新了,今天是周六,没什么事摸鱼将矩阵按键学完,前几天矩阵按键的视频已经看了一半
为了减少IO口的占用引入了矩阵按键,下图是独立按键和矩阵按键的区别



fei2568 发表于 2025-1-4 13:38:21

矩阵按键的程序实现


按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。③第三步:行列组合一下就可以判断出是哪个按键按下了。
u8 key_num=0xff;
void Task(void)
{
        //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
        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( ROW2 ==0 )
                                key_num = 4;
                        //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
                        COL1 = 1;
                        COL2 = 1;
                        COL3 = 1;
                        COL4 = 1;
                        ROW1 = 0;
                        ROW2 = 0;
                        if( COL1 ==0 )                                //判断哪一列,叠加按键的序号
                        {
                                key_num = key_num + 0;
                        }
                        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;
        }
}

香河英茂工作室 发表于 2025-1-5 10:01:50

感谢分享

香河英茂工作室 发表于 2025-1-5 10:03:26

感谢分享

sunyu 发表于 2025-1-5 11:41:37

{:qiang:}{:qiang:}{:qiang:}

fei2568 发表于 2025-1-9 08:16:25

密码锁的代码照着冲哥的代码敲完了,运行正常,下面是代码
#include "io.h"


u8 SEG_NUM[]={                     //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black-   H    J    K    L    N    o   P    U   t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8 T_NUM =
{
        0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};


/*
        #define ROW1        P06                        //端口定义
        #define ROW2        P07
        #define COL1        P00
        #define COL2        P01
        #define COL3        P02
        #define COL4        P03
*/

u8 key_num = 0xff;

//任务1:数码管显示当前的按键号
void Task_1(void)
{
        //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
        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( ROW2 ==0 )
                                key_num = 4;
                               
                        //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
                        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;
}

u8 password={17,17,17,17,17,17,17,17};
u8 Seg_no = 0;

void SEG_Task(void)
{
        if( Seg_no ==0 )                                                                //小时十位
        {
                Display_Seg( SEG_NUM] , ~T_NUM);                //数码管刷段码和位码
        }
        else if(Seg_no==1)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else if(Seg_no==2)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else if(Seg_no==3)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else if(Seg_no==4)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else if(Seg_no==5)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else if(Seg_no==6)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else if(Seg_no==7)
        {
                Display_Seg(SEG_NUM],~T_NUM);
        }
        else
        {
               
        }
        Seg_no++;
        if(Seg_no>7)
        {
                Seg_no=0;
        }
}

u8 Key_Vol3=0;
u8 key_no=0;
void PW_write_Task(void)
{
        if(key_num<0xff)
        {
                Key_Vol3++;
                if(Key_Vol3==5)
                {
                        if(key_no==0)
                        {
                                password=17;
                                password=17;
                                password=17;
                                password=17;
                                password=17;
                                password=17;
                                password=17;
                                password=17;
                        }
                        password=key_num;
                        key_no++;
                        if(key_no>=8)
                        {
                                if((password==1) && (password==2) && (password==3) && (password==4) && (password==5) && (password==6) && (password==7) &&(password==0) )
                                {
                                        password = 1;
                                        password = 1;
                                        password = 23;
                                        password = 24;
                                        password = 14;
                                        password = 22;
                                        password = 1;
                                        password = 1;                                       
                                }
                                else
                                {
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                }
                                key_no=0;
                        }
                }
        }
        else
        {
                Key_Vol3=0;
        }
}
这个密码锁的程序,将以前的学习的定时器中断周期性任务数码管显示矩阵按键进行了综合

fei2568 发表于 2025-1-9 13:00:49

计划将之前学习的东西梳理复习一下,尤其是新工程的创建和周期性任务
功能如下:
1.同样是一个密码锁
2.开锁状态下长按可以修改密码并保存
3.P33按钮长按为设定密码功能,短按为确定功能
4.8位数码管平时显示时分秒毫秒
5.按数字键时显示输入密码
6.密码输入完成8位后按确定键和保存密码进行比较
7.正确后数码管显示open-***打开次数
--暂时就这些功能,想到再加吧
页: 1 2 3 4 5 [6] 7 8 9
查看完整版本: 8051U实验箱学习记录 | 学习打卡典范