微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LPC2124 实时时钟 望能够相助

LPC2124 实时时钟 望能够相助

时间:10-02 整理:3721RD 点击:
我是一名大二学生,今年初学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);         //显示时

    }

}



顶一顶

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top