望相助!LPC 2124 实时时钟

2019-07-15 17:25发布

我是一名大二学生,今年初学51单片机,但我们考试是一个LPC的大作业。

我的代码折腾了几天,在keil上一直能编译成功,但在proteus上八位数码管一直不亮,这两天就快截止日期了。但作业还是没有成功,天天机房,整天心塞塞。盼望贵坛各位能够帮忙看看,感激之情无以言表。真诚感恩。
这是keil代码:
#include "config.h"uint32   second=0;          //秒初始化uint32   minute=0;          //分初始化uint32   hour=9;         //时初始化uint32   keyr=1<<23;        //定义P1.23为复位按键uint32   key=1<<16;         //定义P1.16为停止按键uint32   keyadd1=1<<17;         //定义P1.17为秒加按键uint32   keysec1=1<<18;         //定义P1.18为秒减按键uint32   keyadd2=1<<19;         //定义P1.19为分加按键uint32   keysec2=1<<20;         //定义P1.20为分减按键uint32   keyadd3=1<<21;         //定义P1.21为时加按键uint32   keysec3=1<<22;         //定义P1.22为时减按键uint32   num_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     //共阴极数码管段选uint32   weis[]={0xfe00,0xfd00};                               //共阴极数码管秒位选uint32   weim[]={0xf700,0xef00};                               //共阴极数码管分位选uint32   weih[]={0xbf00,0x7f00};                               //共阴极数码管时位选/******************************* 函数名称 :delay()** 函数功能 :延时******************************/void  delay(uint32  dly)                      //延时函数{  uint32  i;   for(; dly>0; dly--)   for(i=0; i<3400; i++);                     //初定为3400个自减变量,用于数码管延时显示}/******************************* 函数名称 :IRQ_timer0()** 函数功能 :定时器中断******************************/void __irq IRQ_Timer0 (void)      {    if((hour==9)&(minute==30)&(second==0))    //若时间为9点30分时,则执行下面程序    {       IO0SET=1<<16;            //给P0.16口一个高电平,即使发声器响,从而实现闹钟功能    }    else   {       IO0CLR=1<<16;            //否则不响    }    if((IO1PIN&keyr)==0)        //当复位按键按下时,时分秒均为零,实现复位功能    {       second=0;    minute=0;    hour=0;    }    if((IO1PIN&key)!=0)             //当停止键没有按下时时间计数,否则时间停止计数    {       second++;    }    if((IO1PIN&keyadd1)==0)         //当秒加按键按下时,秒开始加    {       second++;    }    if((IO1PIN&keysec1)==0)         //当秒减按键按下时,秒开始减    {       second--;
    if((IO1PIN&keyadd2)==0)         //当分加按键按下时,分开始加    {       minute++;    }    if((IO1PIN&keysec2)==0)         //当分减按键按下时,分开始减    {       minute--;    }    if((IO1PIN&keyadd3)==0)         //当时加按键按下时,时开始加    {       hour++;    }    if((IO1PIN&keysec3)==0)         //当时减按键按下时,时开始减    {       hour--;    }       if((second>60))             //当秒加到大于60时,秒变为59    {         second=59;    }    if((minute>60))             //当分加到大于60时,分变为59    {         minute=59;    }      if((second==60))            //当秒等于60时,分加1,秒清零    {         minute++;    second=0;    }    if((minute==60))            //当分等于60时,时加1,分清零    {         hour++;        minute=0;       second=0;    }    if((hour==24))                  //当小时为24时,时清零    {         hour=0;    }    T0IR = 0x01;             // 打开定时器    VICVectAddr = 0x00;                 //向量IRQ通道0的中断服务程序地址为0}/******************************* 函数名称 :Time0Init()** 函数功能 :定时器0初始化******************************/void Time0Init(void)        {    T0TC   = 0;                            //定时器设置为0    T0PR   = 0;                            //时钟不分频      T0MCR  = 0x03;                         // 设置T0MR0匹配后复位T0TC,并产生中断标志    T0MR0  = Fpclk /3;          //设置匹配寄存器的值    T0TCR  = 0x01;                         // 启动定时器0                                           VICIntSelect = 0x00;                   //所有中断通道设置为IRQ中断    VICVectCntl0 = 0x20 | 0x04;            // 设置定时器0中断通道分配最高优先级    VICVectAddr0 = (uint32)IRQ_Timer0;     // 设置中断服务程序地址    VICIntEnable = 1 << 0x04;              // 使能定时器0中断}/******************************* 函数名称 :displays()** 函数功能 :秒显示程序******************************/void displays(unsigned int second){       uint32 i;                              uint32 dis_num[2];                        uint32 temp;    temp=second;    for(i=0;i<2;i++)                     //限定2位显示    {              dis_num=temp%10;             //把最低位的模取出来取余,显示个位数        temp=temp/10;                   //除法,显示十位数IO0CLR=0xffff;                  //清显示        IO0SET=num_code[dis_num];    //送往P0.0-P0.8显示        IO0SET=weis;                 //位的切换        delay(2);    }}      /******************************* 函数名称 :displaym()** 函数功能 :分显示程序******************************/void displaym(unsigned int minute){   uint32 i;    uint32 dis_num[2];    uint32 temp;    temp=minute;    for(i=0;i<2;i++)                     //限定2位显示    {              dis_num=temp%10;              //把最低位的模取出来取余,显示个位数        temp=temp/10;                     //除法,显示十位数        IO0CLR=0xffff;                    //清显示        IO0SET=num_code[dis_num];     //送往P0.0-P0.8显示        IO0SET=weim;                   //位的切换        delay(2);    }}                           /******************************* 函数名称 :displayh()** 函数功能 :时显示程序******************************/void displayh(unsigned int hour)   {       uint32 i;    uint32 dis_num[2];    uint32 temp;    temp=hour;    for(i=0;i<2;i++)                     //限定2位显示    {              dis_num=temp%10;              //把最低位的模取出来取余,显示个位数        temp=temp/10;                     //除法,显示十位数        IO0CLR=0xffff;                    //清显示        IO0SET=num_code[dis_num];     //送往P0.0-P0.8显示        IO0SET=weih;                   //位的切换        delay(2);    }}/************************************************************************************************************ 函数名称 :main()** 函数功能 :使用定时器实现1秒钟定时,控并且在led数码管上显示。中断方式。**********************************************************************************************************/int main(void){    PINSEL0 = 0x00000000;           //设置P0引脚连接为GPIO    PINSEL1 = 0x00000000;          //设置P1引脚连接为GPIO    IO0DIR  = 0x000fffff;           //设置P0.0-P0.20为输出,其他为输入    IO0CLR  = 0x0;                         Time0Init();             //定时器0初始化    IO0CLR  = 0x0;    second=0;    minute=0;    hour=9;    while(1)    {    displays(second);        //显示秒       displaym(minute); //显示分       displayh(hour);         //显示时    }}#include "config.h"uint32   second=0;          //秒初始化uint32   minute=0;          //分初始化uint32   hour=9;         //时初始化uint32   keyr=1<<23;        //定义P1.23为复位按键uint32   key=1<<16;         //定义P1.16为停止按键uint32   keyadd1=1<<17;         //定义P1.17为秒加按键uint32   keysec1=1<<18;         //定义P1.18为秒减按键uint32   keyadd2=1<<19;         //定义P1.19为分加按键uint32   keysec2=1<<20;         //定义P1.20为分减按键uint32   keyadd3=1<<21;         //定义P1.21为时加按键uint32   keysec3=1<<22;         //定义P1.22为时减按键uint32   num_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     //共阴极数码管段选uint32   weis[]={0xfe00,0xfd00};                               //共阴极数码管秒位选uint32   weim[]={0xf700,0xef00};                               //共阴极数码管分位选uint32   weih[]={0xbf00,0x7f00};                               //共阴极数码管时位选/******************************* 函数名称 :delay()** 函数功能 :延时******************************/void  delay(uint32  dly)                      //延时函数{  uint32  i;   for(; dly>0; dly--)   for(i=0; i<3400; i++);                     //初定为3400个自减变量,用于数码管延时显示}/******************************* 函数名称 :IRQ_Timer0()** 函数功能 :定时器中断******************************/void __irq IRQ_Timer0 (void)      {    if((hour==9)&(minute==30)&(second==0))    //若时间为9点30分时,则执行下面程序    {       IO0SET=1<<16;            //给P0.16口一个高电平,即使发声器响,从而实现闹钟功能    }    else   {       IO0CLR=1<<16;            //否则不响    }    if((IO1PIN&keyr)==0)        //当复位按键按下时,时分秒均为零,实现复位功能    {       second=0;    minute=0;    hour=0;    }    if((IO1PIN&key)!=0)             //当停止键没有按下时时间计数,否则时间停止计数    {       second++;    }    if((IO1PIN&keyadd1)==0)         //当秒加按键按下时,秒开始加    {       second++;    }    if((IO1PIN&keysec1)==0)         //当秒减按键按下时,秒开始减    {       second--;
    if((IO1PIN&keyadd2)==0)         //当分加按键按下时,分开始加    {       minute++;    }    if((IO1PIN&keysec2)==0)         //当分减按键按下时,分开始减    {       minute--;    }    if((IO1PIN&keyadd3)==0)         //当时加按键按下时,时开始加    {       hour++;    }    if((IO1PIN&keysec3)==0)         //当时减按键按下时,时开始减    {       hour--;    }       if((second>60))             //当秒加到大于60时,秒变为59    {         second=59;    }    if((minute>60))             //当分加到大于60时,分变为59    {         minute=59;    }      if((second==60))            //当秒等于60时,分加1,秒清零    {         minute++;    second=0;    }    if((minute==60))            //当分等于60时,时加1,分清零    {         hour++;        minute=0;       second=0;    }    if((hour==24))                  //当小时为24时,时清零    {         hour=0;    }    T0IR = 0x01;             // 打开定时器    VICVectAddr = 0x00;                 //向量IRQ通道0的中断服务程序地址为0}/******************************* 函数名称 :Time0Init()** 函数功能 :定时器0初始化******************************/void Time0Init(void)        {    T0TC   = 0;                            //定时器设置为0    T0PR   = 0;                            //时钟不分频      T0MCR  = 0x03;                         // 设置T0MR0匹配后复位T0TC,并产生中断标志    T0MR0  = Fpclk /3;          //设置匹配寄存器的值    T0TCR  = 0x01;                         // 启动定时器0                                           VICIntSelect = 0x00;                   //所有中断通道设置为IRQ中断    VICVectCntl0 = 0x20 | 0x04;            // 设置定时器0中断通道分配最高优先级    VICVectAddr0 = (uint32)IRQ_Timer0;     // 设置中断服务程序地址    VICIntEnable = 1 << 0x04;              // 使能定时器0中断}/******************************* 函数名称 :displays()** 函数功能 :秒显示程序******************************/void displays(unsigned int second){       uint32 i;                              uint32 dis_num[2];                        uint32 temp;    temp=second;    for(i=0;i<2;i++)                     //限定2位显示    {              dis_num=temp%10;             //把最低位的模取出来取余,显示个位数        temp=temp/10;                   //除法,显示十位数IO0CLR=0xffff;                  //清显示        IO0SET=num_code[dis_num];    //送往P0.0-P0.8显示        IO0SET=weis;                 //位的切换        delay(2);    }}      /******************************* 函数名称 :displaym()** 函数功能 :分显示程序******************************/void displaym(unsigned int minute){   uint32 i;    uint32 dis_num[2];    uint32 temp;    temp=minute;    for(i=0;i<2;i++)                     //限定2位显示    {              dis_num=temp%10;              //把最低位的模取出来取余,显示个位数        temp=temp/10;                     //除法,显示十位数        IO0CLR=0xffff;                    //清显示        IO0SET=num_code[dis_num];     //送往P0.0-P0.8显示        IO0SET=weim;                   //位的切换        delay(2);    }}                           /******************************* 函数名称 :displayh()** 函数功能 :时显示程序******************************/void displayh(unsigned int hour)   {       uint32 i;    uint32 dis_num[2];    uint32 temp;    temp=hour;    for(i=0;i<2;i++)                     //限定2位显示    {              dis_num=temp%10;              //把最低位的模取出来取余,显示个位数        temp=temp/10;                     //除法,显示十位数        IO0CLR=0xffff;                    //清显示        IO0SET=num_code[dis_num];     //送往P0.0-P0.8显示        IO0SET=weih;                   //位的切换        delay(2);    }}/************************************************************************************************************ 函数名称 :main()** 函数功能 :使用定时器实现1秒钟定时,控并且在led数码管上显示。中断方式。**********************************************************************************************************/int main(void){    PINSEL0 = 0x00000000;           //设置P0引脚连接为GPIO    PINSEL1 = 0x00000000;          //设置P1引脚连接为GPIO    IO0DIR  = 0x000fffff;           //设置P0.0-P0.20为输出,其他为输入    IO0CLR  = 0x0;                         Time0Init();             //定时器0初始化    IO0CLR  = 0x0;    second=0;    minute=0;    hour=9;    while(1)    {    displays(second);        //显示秒       displaym(minute); //显示分       displayh(hour);         //显示时    }
}



奖励1积分

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。