durongze 发表于 2024-5-4 11:30:51

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



注意事项:
    通常每个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位寄存器)
--------------------------------------------------------------------------------------------------

原理图:






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

    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;      
        P6 = ~t_display];
    if(++display_index >= 8)    display_index = 0;//8位结束回0
}

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

}



durongze 发表于 2024-5-4 11:33:36

P6和P7一个是正极,一个是负极。
   P6M1 = 0xff;   P6M0 = 0xff;   
   P7M1 = 0x00;   P7M0 = 0x00;
页: [1]
查看完整版本: 【官网例子分析系列】例子04--数码管