我是一名大二学生,今年初学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; //清显示 I
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>