找回密码
 立即注册
查看: 87|回复: 1

【官网例子分析系列】例子04--数码管

[复制链接]
  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    682

    积分

    高级会员

    积分
    682
    发表于 2024-5-4 11:30:51 | 显示全部楼层 |阅读模式


    注意事项:
        通常每个io口有8种模式:浮空输入,上拉输入,下拉输入,模拟输入,推挽输出,复用推挽,开漏输出,复用开漏
        但本mcu有4种:00准双向口,01推挽输出,10高阻输入,11开漏模式。
    --------------------------------------------------------------------------------------------------
    概念介绍:
    总共 8个 端口,端口数据寄存器用Px表示,位用Px.n表示
    1.每个端口2个配置寄存器,PxM0,PxM1;两个模式寄存器对应的指定位有四种配置:
      00准双向口,01推挽输出,10高阻输入,11开漏模式
    2.每个端口1个上拉电阻控制寄存器,PxPU;
      0:禁止端口内部的 :禁止端口内部的 4.1K上拉
      1:使能端口内部的 :使能端口内部的 4.1K上拉
    3.每个端口1个施密特触发控制寄存器,PxNCS;
      0:使能端口的施密特触发功能。(上电复位后默认使能施密特触发)
      1:禁止端口的施密特触发功能。
    4.每个端口1个电平转换速度控制寄存器,PxSR;
      0:电平转换速度快,相应的上下冲会比较大
      1:电平转换速度慢,相应的上下冲比较小
    5.每个端口1个驱动电流控制寄存器,PxDR;
      0:增强驱动能力
      1:一般驱动能力
    6.每个端口1个数字信号输入使能控制寄存器,PxIE;
      0:禁止数字信号输入。
      1:使能数字信号输入。
    7.每个端口1个下拉电阻控制寄存器,PxPD;
      0:禁止端口内部的下拉电阻
      1:使能端口内部的下拉电阻


    EA:总中断允许控制位。
    ELVD:低压检测中断允许位。
    EADC:A/D 转换中断允许位。
    ESn:串行口 n 中断允许位。
    ETn:定时/计数器 Tn 的溢出中断允许位。
    EXn:外部中断 n 中断允许位。
    EUSB:USB 中断允许位。
    ESPI:SPI 中断允许位。

    ET0 :   见中断相关寄存器 --> IE(中断允许寄存器)           --> ET0
    PT0 : 见中断相关寄存器 --> IP(中断优先级控制寄存器) --> PT0
    TMOD: 特殊功能寄存器列表 --> TMOD(定时器模式寄存器)  --> GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0
    T0_CT: 定时器 0/1 模式寄存器(TMOD)--> T0_CT
    T0CLKO: 特殊功能寄存器列表 --> INTCLKO(中断与时钟输出控制寄存器)  --> T0CLKO (定时器 0时钟分频输出)
    T0x12: 定时器的相关寄存器 --> AUXR(辅助寄存器1)  -->  T0x12
    TH0: 定时器的相关寄存器 --> TH0(定时器 0高 8位寄存器)
    TL0: 定时器的相关寄存器 --> TL0(定时器 0低 8位寄存器)
    --------------------------------------------------------------------------------------------------

    原理图:
    seven_segment.png seven_segment_mcu.png
    PWM1-4.png PWM5-8.png
    Pin6.0-Pin6.7.png
    Pin6all-Pin7all.png


    --------------------------------------------------------------------------------------------------
    例子分析:

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

        P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
        P1M1 = 0x30;   P1M0 = 0x30;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
        P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
        P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
        P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
        P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
        P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
        P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

        T0x12 = 1;  //Timer0 set as 1T, 16 bits timer auto-reload,
        TH0 = (u8)(Timer0_Reload / 256);
        TL0 = (u8)(Timer0_Reload % 256);
        ET0 = 1;    //Timer0 interrupt enable
        TR0 = 1;    //Tiner0 run
        EA = 1;     //打开总中断
       
        display_index = 0;
        hour   = 11;    //初始化时间值
        minute = 59;
        second = 58;
        RTC();    // 主要是时分秒的计算
        DisplayRTC(); // 把时分秒的数字转成数码管的需要的形式。
       
    //  for(i=0; i<8; i++)  LED8 = DIS_BLACK;    //上电消隐
        for(i=0; i<8; i++)  LED8 = i;    //显示01234567
        k = 0;

        while(1)
        {
            if(B_1ms)   //1ms到
            {
                B_1ms = 0;
                if(++msecond >= 1000)   //1秒到
                {
                    msecond = 0;
                    RTC();// 主要是时分秒的计算
                    DisplayRTC();// 把时分秒的数字转成数码管的需要的形式。
                }
            }
        }
    }

    /********************** 显示扫描函数 ************************/
    void DisplayScan(void)
    {   
           //控制p7和p6的所有引脚进行显示
            P7 = ~T_COM[7-display_index];        
            P6 = ~t_display[LED8[display_index]];
        if(++display_index >= 8)    display_index = 0;  //8位结束回0
    }

    /********************** Timer0 1ms中断函数 ************************/
    void timer0 (void) interrupt 1
    {
        DisplayScan();  //1ms扫描显示一位
        B_1ms = 1;      //1ms标志

    }



    Pin7.0-Pin7.3

    49.12 KB, 下载次数: 5

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    682

    积分

    高级会员

    积分
    682
     楼主| 发表于 2024-5-4 11:33:36 | 显示全部楼层
    P6和P7一个是正极,一个是负极。
       P6M1 = 0xff;   P6M0 = 0xff;     
       P7M1 = 0x00;   P7M0 = 0x00;  
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-13 14:23 , Processed in 0.073588 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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