找回密码
 立即注册
楼主: 衫正

跟着冲哥学习stc32

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-4-20 13:40:36 | 显示全部楼层
衫*** 发表于 2025-3-12 21:19
第八集:学习定时器周期性调查

理解如何使用函数及变量,用数组定义变量U16 State[10]={0,1,2,3,4,5,6,7,8 ...

第九课,数码管的学习

使用位码和段码点亮数码管
这是IO口的配置

#include "io.h"

u8 SER_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[8]=
{
        0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};

u8 state1=0;                                        //LED1初始值
u8 state2=0;                                        //LED2初始值
u8 state3=0;                                        //LED3初始值
u8 state4=0;                                        //LED3初始值

u16 Key_vol[3];                                        //按键按下持续时间

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 LED3_Blink(void)
{
        state4 =!state4;
        P03 = state4;
}

void Key_Task(void)
{
//        if(P32==0)
//        {
//                Key_vol[0]++;
//                if(Key_vol==5)
//                {
//                        //按键按下的任务
//                        printf("按键单击\r\n");
//                }
//        }
//        else
//        {
//                Key_vol=0;
//        }
}

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)
{
        Display_Seg(SER_NUM[0],~T_NUM[0]);
}
数码管的动态显示

#include "io.h"

u8 SER_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[8]=
{
        0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};

u8 state1=0;                                        //LED1初始值
u8 state2=0;                                        //LED2初始值
u8 state3=0;                                        //LED3初始值
u8 state4=0;                                        //LED3初始值

u16 Key_vol[3];                                        //按键按下持续时间

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 LED3_Blink(void)
{
        state4 =!state4;
        P03 = state4;
}

void Key_Task(void)
{
//        if(P32==0)
//        {
//                Key_vol[0]++;
//                if(Key_vol==5)
//                {
//                        //按键按下的任务
//                        printf("按键单击\r\n");
//                }
//        }
//        else
//        {
//                Key_vol=0;
//        }
}

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

u8 Seg_no = 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)
{
        Display_Seg(SER_NUM[Seg_no+1],~T_NUM[Seg_no]);                        //数码管刷新段码和位码
        Seg_no++;
        if(Seg_no>7)
                Seg_no = 0;
}
使用数码管进行时分秒

u8 shi=0;
u8 fen=0;
u8 miao=0;

void Seg_Task(void)
{
        u8 num = 0;
        if(Seg_no==0)
        {
                num=shi/10;                                                                                //小时的十位
                Display_Seg(SER_NUM[num],~T_NUM[0]);                        //数码管刷新段码和位码
        }
        else if(Seg_no==1)
        {
                num=shi%10;                                                                                //小时的个位
                Display_Seg(SER_NUM[num],~T_NUM[1]);
        }
        else if(Seg_no==2)
        {
                Display_Seg(SER_NUM[16],~T_NUM[2]);                        //第一个横杠
        }
        else if(Seg_no==3)
        {
                num=fen/10;                                                                                //分钟的十位
                Display_Seg(SER_NUM[num],~T_NUM[3]);                        //数码管刷新段码和位码
        }
        else if(Seg_no==4)
        {
                num=fen%10;                                                                                //分钟的个位
                Display_Seg(SER_NUM[num],~T_NUM[4]);
        }
        else if(Seg_no==5)
        {
                Display_Seg(SER_NUM[16],~T_NUM[5]);                        //第二个横杠
        }
        else if(Seg_no==6)
        {
                num=miao/10;                                                                        //秒的十位
                Display_Seg(SER_NUM[num],~T_NUM[6]);                        //数码管刷新段码和位码
        }
        else if(Seg_no==7)
        {
                num=miao%10;                                                                        //秒的个位
                Display_Seg(SER_NUM[num],~T_NUM[7]);
        }
        else
        {
               
        }
        Seg_no ++;
        if(Seg_no>7)
                Seg_no = 0;
}

void TIMECOUNT_Task(void)
{
        miao++;
        if(miao>59)
        {
                miao=0;
                fen++;
                if(fen>59)
                {
                        fen=0;
                        shi++;
                        if(shi>23)
                                shi=0;
                }
        }
       
}

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 22:11 , Processed in 0.100003 second(s), 45 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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