完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我想要实现4位数码管从9999倒计时到0,每秒减1.
功能已经实现,现在想把中断里面数字递减的部分内容移到主函数里面,该怎么弄啊,我试了几次,数码管都乱码了。 程序如下: #include #include "derivative.h" #define CONT1 PORTK_PK3 #define CONT2 PORTK_PK2 #define CONT3 PORTK_PK1 #define CONT4 PORTK_PK0 #define CONT1_dir DDRK_DDRK3 #define CONT2_dir DDRK_DDRK2 #define CONT3_dir DDRK_DDRK1 #define CONT4_dir DDRK_DDRK0 #define DATA PTP #define DATA_dir DDRP #define BUS_CLOCK 32000000 #define OSC_CLOCK 16000000 byte data1=9; byte data2=9; byte data3=9; byte data4=9; unsigned long int temp=9999; unsigned char y=0; byte single=1; byte shuma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void init_pll(void)//锁相环初始化 { CLKSEL&=0x7f; PLLCTL&=0x8F; CRGINT&=0xDF; SYNR=0x43; REFDV=0x81; PLLCTL=PLLCTL|0x70; asm NOP; asm NOP; while(!(CRGFLG&0x08)); CLKSEL|= 0x80; } void init_port(void)//接口初始化 { CONT1_dir=1; CONT2_dir=1; CONT3_dir=1; CONT4_dir=1; CONT1=0; CONT2=0; CONT3=0; CONT4=0; DATA_dir=0xff; DATA=0x00; } void delay(void) //延时 { unsigned int i,j; for(j=0;j<200;j++) for(i=0;i<60000;i++); } void init_tim(void)//定时器初始化 { TSCR1_TFFCA = 1; TSCR1_TEN = 1; TIOS = 0xff; TCTL1 = 0x00; TCTL2 = 0x00; TIE = 0x01; TSCR2 = 0x07; TFLG1 = 0xff; TFLG2 = 0xff; } void init_pit(void)//PIT初始化 { PITCFLMT=0X80; PITCE_PCE0=1; PITINTE_PINTE0=1; PITMTLD0=249; PITLD0=12799; } #pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt void scan(void) //扫描中断 { if(TFLG1_C0F==1) { TFLG1_C0F=1; TC0=TCNT+1250; } switch(single) { case 1: CONT1 = 1; CONT2 = 0; CONT3 = 0; CONT4 = 0; DATA=shuma[data1]; break; case 2: CONT1 = 0; CONT2 = 1; CONT3 = 0; CONT4 = 0; DATA=shuma[data2]; break; case 3: CONT1 = 0; CONT2 = 0; CONT3 = 1; CONT4 = 0; DATA=shuma[data3]; break; case 4: CONT1 = 0; CONT2 = 0; CONT3 = 0; CONT4 = 1; DATA=shuma[data4]; break; default: break; } single+=1; if(single==5) single=1; } interrupt void PIT_INTER(void)//数字递减 { if(PITTF_PTF0==1) PITTF_PTF0=1; y++; if(y>10){ temp=temp-1; y=0; data4=temp%10; data3=temp/10%10; data2=temp/100%10; data1=temp/1000%10; if(temp==0) temp=9999; } } #pragma CODE_SEG DEFAULT void main(void)//主函数 { DisableInterrupts; init_pll(); init_tim(); init_port(); init_pit(); EnableInterrupts; TFLG1_C0F = 1; TC0 = TCNT + 1250; for(;;) { } } |
|
相关推荐
4个回答
|
|
不是乱码,是你数据更新的太快,比如从100变更为99时,LED正显示到一半,你的数据又由99变更到98,看起来像是乱码,建议你将数据变更后面加个比较长的延时再看看。
|
|
|
|
这是改过的程序,能帮忙看下延时加在哪里吗,或者帮我改正下该怎么挪动程序,非常感谢。我加在中断里面,数码管黑了不显示了,加在主函数里面没变化。
interrupt void PIT_INTER(void)//数字递减 { if(p==1) PITTF_PTF0=1; temp=temp-1; p=0; y=0; data4=temp%10; data3=temp/10%10; data2=temp/100%10; data1=temp/1000%10; if(temp==0) temp=9999; } #pragma CODE_SEG DEFAULT void main(void)//主函数 { DisableInterrupts; init_pll(); init_tim(); init_port(); init_pit(); EnableInterrupts; for(;;) { if(PITTF_PTF0==1) { PITTF_PTF0=1; y++; if(y>10) p=1; } } } |
|
|
|
你先把 4位数码管固定显示1234 剩下就好解决了
|
|
|
|
什么意思,详细点啊,或者帮我改下啊
|
|
|
|
只有小组成员才能发言,加入小组>>
1912个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36369 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4404 浏览 0 评论
6063 浏览 1 评论
6771 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4221 浏览 0 评论
625浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
621浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
615浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
698浏览 2评论
802浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 22:26 , Processed in 1.144015 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号