完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是一名大二学生,今年初学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个回答
|
|
顶一顶
|
|
|
|
只有小组成员才能发言,加入小组>>
1898个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36308 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4373 浏览 0 评论
6030 浏览 1 评论
6749 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4198 浏览 0 评论
607浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
600浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
593浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
680浏览 2评论
775浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 15:23 , Processed in 0.936988 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号