完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
使用独立按键来控制数码管显示数字
第一颗按键,计数加1 第二颗按键,计数减1 第三颗按键,计数清零 第四颗按键,自动计数 #include #define uchar unsigned char #define uint unsigned int ***it dlkey1 = P3^1; //独立按键位控制 ***it dlkey2 = P3^0; ***it dlkey3 = P3^2; ***it dlkey4 = P3^3; ***it led2 = P2^2; //控制数码管位选的位 ***it led3 = P2^3; ***it led4 = P2^4; uchar code duanxuan[] = {0x3f,0x06,0x5b,0x4f, //0,1,2,3 0x66,0x6d,0x7d,0x07, //4,5,6,7 0x7f,0x6f,0x77,0x7c, //8,9,A,B 0x39,0x5e,0x79,0x71}; //C,D,E,F 段选 uint numt0;int num; void delay_xms(uint m) //延时ms操作 { int i; for(;m>0;m--) for(i=110;i>0;i--); } void Init() //初始化内容 { TMOD = 0X01; //定时器工作模式设置为01 TH0 = (65536-45872)/256;//计数器高八位赋初值 TL0 = (65536-45872)%256;//计数器低八位赋初值 EA = 1; //中断总开关 ET0 = 1; //定时器T0中断开关 } void keyscan() //按键检测函数 { if(dlkey1==0) //按键1按下后,num加一 { delay_xms(10); if(dlkey1==0) { num++; //先加数,后检测 if(num>60) { num=0; } while(!dlkey1); //按住按键时,没有反应,松开按键反应 } } if(dlkey2==0) //按键2按下后,num减一 { delay_xms(10); if(dlkey2==0) { num--; //先减数,后检测 if(num<0) { num=60; } while(!dlkey2); //按住按键时,没有反应,松开按键反应 } } if(dlkey3==0) //按键3按下后,num清零 { delay_xms(10); if(dlkey3==0) { num=0; while(!dlkey3); //按住按键时,没有反应,松开按键反应 } } if(dlkey4==0) //按键4按下后,自动计数开启/关闭 { delay_xms(10); if(dlkey4==0) { while(!dlkey1); TR0 = ~TR0; //按住按键时,没有反应,松开按键反应 } } } void display(int i,int j,int k) //数码管显示函数 { switch(i) { case(0):P0=duanxuan[j];led2=1,led3=1,led4=1;break; case(1):P0=duanxuan[k];led2=0,led3=1,led4=1;break; case(2):led2=1,led3=0,led4=1;break; case(3):led2=0,led3=0,led4=1;break; case(4):led2=1,led3=1,led4=0;break; case(5):led2=0,led3=1,led4=0;break; case(6):led2=1,led3=0,led4=0;break; case(7):led2=0,led3=0,led4=0;break; } } void main() { int i=0,j,k; Init(); while(1) { keyscan(); //先按键检测对num值改变后 j=num/10,k=num%10; //再进行j、k的赋值操作 display(i,j,k); //数码管显示 if(numt0 >= 20) //20次50ms的中断检测为1s { num++; //计数加一 if(num >60) { num = 0; } numt0 = 0; } i=(i+1)%2; //i控制数码管的显示位置,目前为1号位和2号位 P0 = 0; //消影 } } void TR0_time() interrupt 1 //50ms中断系统 { TH0 = (65536-45872)/256; TL0 = (65536-45872)%256; numt0++; } 该实验对于num小于0的情况作出改进,如果num选用uint类型,那么num–,小于0之后就会出现bug,但是num使用int类型则不会。 |
|
|
|
只有小组成员才能发言,加入小组>>
3254 浏览 9 评论
2937 浏览 16 评论
3439 浏览 1 评论
8941 浏览 16 评论
4030 浏览 18 评论
1068浏览 3评论
555浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
549浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2284浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1842浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 05:45 , Processed in 1.149517 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号