完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uchar unsigned char #define uint unsigned int unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码 unsigned char tab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //秒后带小数点的段码 uint x; ***it key=P3^2; //开始停止按键 void delay(uint i) // 1ms延时 { uchar j; while(i--) { for(j=0;j<120;j++); } } void display(uint x) //显示子程序 { P2=0xef; //十位秒显示 P0=smg[x/1000]; delay(3); P2=0xff; //关闭数码管 P0=0xff; delay(3); P2=0xdf; //个位秒显示,带小数点 P0=tab[x/100%10]; delay(3); P2=0xff; //关闭数码管 P0=0xff; delay(3); P2=0xbf; //小数点后一位显示 P0=smg[x/10%10]; delay(3); P2=0xff; P0=0xff; delay(3); P2=0x7f; //小数点后第二位显示 P0=smg[x%10]; delay(3); P2=0xff; P0=0xff; delay(3); } void main() { x=0; EA=1; //开总中断 EX0=1; //开外部中断0 IT0=1; //负跳变触发 TMOD=0x01; //定时器工作方式1; TR0=0; //启动定时器 TF0=0; //溢出标志位清0 TH0=(65536-10000)/256; //定时器0高8位赋值 TL0=(65536-10000)%256; //定时器0低8位赋值 while(1) { while(TF0==1) //当溢出时 ,标志位变1 { TF0=0; //标志位清0 x++; //计数 TH0=(65536-9000)/256; TL0=(65536-9000)%256; } display(x); //显示函数 if(x>10000) //超过10s后,归0 {x=0;} } } void int0(void) interrupt 0 using 0 //外中断0的中断编号为0 { TR0=~TR0; //定时器启动位取反 } 。。。。。。。。。。。。。。。。。。。。。。。。。 开始停止按键经常不管用,是不是该消抖呢,但该怎么消呢?求大神指点 |
|
相关推荐
17个回答
|
|
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{ if(key==0) //按键消抖 { delay(20); if(key==0) { TR0=~TR0; //定时器启动位取反 } } |
|
|
|
我建议你个思路。
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0 { TR0=~TR0; //定时器启动位取反 } 从你中断服务函数看,控制定时器的开启和关闭,可能造成原因,一次按下连续两次或多次进入中断0服务函数,造成开启或关闭。所以,你应该在中断服务函数里面加上这么些语句:while(!EXTI0); EXTI0在前面定义为***it EXTI0=P3^2;进入中断时关闭EX0,出中断前开启EX0用来保证一次触发只有一次中断。 |
|
|
|
感觉用上升沿或下降沿触发比较好
|
|
|
|
|
|
谢谢各位指点啊,我试试
|
|
|
|
试了,不行,按下按键后,只有一个数码管显示0,其他数码管都灭了 |
|
|
|
这个方法也不行,而且好像还不如原来好用。还有个问题想问一下:我的显示子程序里面的延时为什么会影响到计数的快慢啊???那不是数码管动态扫描显示用的吗?占用cpu时间了??还有动态扫描最好延时多长时间呢??麻烦您了!!! |
|
|
|
|
|
|
|
我很久没用数码管了,不过记得以前写数码管动态的时候是用定时器的,扫8位数码管。是3ms左右扫一次,一般喜欢用定时器去扫描,把扫描函数封装到定时器服务函数里,定时扫描。如果你放到main()下去显示的话,有中断打断的话则无法正常显示了。 然后给你解释下,为什么你按我的加while();的方法影响显示,这个语句你应该了解了吧,就是等待按键弹起避免一次按键多次中断。因为你采用的是动态显示扫描数码管,如果不扫描那么肯定数码管不会有显示了。当你按下按键,没有弹起前,一直停在中断那个while()里了。你可以试着用定时器中断去扫描它,然后把该定时器的中断优先级拉高,就算你按下按键未弹起还是可以进入中断扫描不会影响显示了。 |
|
|
|
下降沿触发即IT0=1;
|
|
|
|
谢谢前辈,学习了,我再试试 |
|
|
|
|
|
|
|
路过,看看,看看
|
|
|
|
硬件有没有问题
|
|
|
|
|
|
|
|
。。。路过,看看,看看,
|
|
|
|
不是因为你消抖动了,而是你没有消除抖动
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11771 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 19:24 , Processed in 0.817732 second(s), Total 72, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号