LPC2124 实时时钟 望能够相助
我的代码折腾了几天,在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); //显示时
}
}

顶一顶
