完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
开篇先说一句废话····
本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 缘由 本来按照我的学习计划,我现在应该是单片机的学习过程,应该写单片机学习篇,但是因为在10月中旬收到一则私信,说让我帮忙写一个用独立按键控制数码管的小程序,我看到消息之后,构思了一下,我觉得这里应该会回到定时器中断来控制秒数,所以先去学习中断然后去写,不断的调试,弄好之后,最近学模数数模转换模块有点难,我觉得先缓一下,然后想起这事,特来写一篇文章总结一下。 项目需求 直接上图– 项目分析 其实上面的需求也算大概分析啦,细致的分析一下。
项目代码 数码管循环显示00–59 //数码管显示函数 void Showsmg(u8 shi,u8 ge){ //十位 个位 //十位 LSA=1;LSB=1;LSC=1; P0=smgduan[shi]; Delay(1); P0=0x00; //个位 LSA=0;LSB=1;LSC=1; P0=smgduan[ge]; Delay(1); P0=0x00; } //延时函数 void Delay(u16 i) //11.0592 1ms { while(i--){ unsigned char i, j; _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } //初始化定时器函数 void Init(){ t0=0; num=0; shi=0; ge=0; flag=0; TMOD=0x01; TH0=(65536-9174)/256; //10ms TL0=(65536-9174)%256; EA=1; ET0=1; TR0=1; } void main(){ Init(); while(1){ shi=num/10; ge=num%10; Showsmg(shi,ge); } } void Timer0() interrupt 1{ TH0=(65536-9174)/256; //重置 TL0=(65536-9174)%256; t0++; if(t0==100){ t0=0; num++; if(num==60) num=0; } } 独立按键的检测 //按键检测 void KeyDown(){ GPIO_KEY=0x0f; //独立按键端口 if(GPIO_KEY!=0x0f){ Delay(10); if(GPIO_KEY!=0x0f){ GPIO_KEY=0x0f; switch(GPIO_KEY){ case 0x0d : Key0();break; //k0 case 0x0e : Key1(flag);break; //k1 case 0x0b : Key2(flag);break; //k2 case 0x07 : Key3();break; //k3 } }while(GPIO_KEY!=0x0f); //松手检测 } } 独立按键处理函数 void Key0(){ TR0=0; if(flag==0) //第一次按K0 flag=1; else //第二次按K0 flag=2; } void Key1(u8 flag){ switch(flag){ case 0: break; case 1: num+=1;if(num>=60) num=0;break; //num超过59处理 case 2: num+=10;if(num>60) num-=60;break; //十位大于5处理 } } void Key2(u8 flag){ switch(flag){ case 0: break; case 1: num-=1;if(num>59) num=59;break; case 2: {if(num>9) num-=10; else num+=50;}break; } } void Key3(){ TR0=1; //定时器启动 flag=0; //标志位清零 } 上面是每部分的代码,可以对应项目分析阅读,送上完整版。 smg.h #include "reg52.h" #include "intrins.h" typedef unsigned int u16; typedef unsigned char u8; #define GPIO_KEY P3 u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; u8 t0,shi,ge,flag; u16 num; //38译码器 ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; //独立按键 ***it k0=P3^1; ***it k1=P3^0; ***it k2=P3^2; ***it k3=P3^3; //数码管显示函数 void Showsmg(u8 decade,u8 unit); //延时函数 void Delay(u16 i); //初始化函数 void Init(); //按键检测 void KeyDown(); void Key0(); void Key1(u8 flag); void Key2(u8 flag); void Key3(); main.c #include "smg.h" void main(){ Init(); while(1){ KeyDown(); shi=num/10; ge=num%10; Showsmg(shi,ge); } } //数码管显示函数 void Showsmg(u8 shi,u8 ge){ //十位 个位 //十位 LSA=1;LSB=1;LSC=1; P0=smgduan[shi]; Delay(1); P0=0x00; //个位 LSA=0;LSB=1;LSC=1; P0=smgduan[ge]; Delay(1); P0=0x00; } //延时函数 void Delay(u16 i) //11.0592 1ms { while(i--){ unsigned char i, j; _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } //初始化函数 void Init(){ t0=0; num=0; shi=0; ge=0; flag=0; TMOD=0x01; TH0=(65536-9174)/256; //10ms TL0=(65536-9174)%256; EA=1; ET0=1; TR0=1; } //按键检测 void KeyDown(){ GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f){ Delay(10); if(GPIO_KEY!=0x0f){ GPIO_KEY=0x0f; switch(GPIO_KEY){ case 0x0d : Key0();break; //k0 case 0x0e : Key1(flag);break; //k1 case 0x0b : Key2(flag);break; //k2 case 0x07 : Key3();break; //k3 } }while(GPIO_KEY!=0x0f); //松手检测 } } void Key0(){ TR0=0; if(flag==0) //第一次按K0 flag=1; else //第二次按K0 flag=2; } void Key1(u8 flag){ switch(flag){ case 0: break; case 1: num+=1;if(num>=60) num=0;break; case 2: num+=10;if(num>60) num-=60;break; //十位大于5处理 } } void Key2(u8 flag){ switch(flag){ case 0: break; case 1: num-=1;if(num>59) num=59;break; case 2: {if(num>9) num-=10; else num+=50;}break; } } void Key3(){ TR0=1; //定时器启动 flag=0; //标志位清零 } void Timer0() interrupt 1{ TH0=(65536-9174)/256; //重置 TL0=(65536-9174)%256; t0++; if(t0==100){ t0=0; num++; if(num==60) num=0; } } |
|
|
|
只有小组成员才能发言,加入小组>>
2562 浏览 0 评论
1159浏览 2评论
762浏览 1评论
515浏览 0评论
272浏览 0评论
453浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 20:03 , Processed in 1.255674 second(s), Total 46, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号