完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
|
鸿哥的例程更新到了50章,好久没有看本帖了,本人整理的鸿哥的例程稍稍慢了步伐。也一直在看鸿哥的例程的确受益匪浅。参加了今年的全国大学生电子设计大赛,硬件电路,程序都是自己亲手搞的,累的要死。12864液晶功能界面的切换有点纠结,好在老师给我整理了一下程序,界面切换简洁完美。自己在程序设计上层次还不够清晰。
|
|
|
|
|
|
|
|
|
鸿哥好,我学了一段时间51单片机了,最近看见您的功力,对我是这个打击啊,您也太牛了,所以要向您学习学习,曾经一段时间看见嵌入式很好就想学,学了一段时间感觉费点劲,从看了您发的那个嵌入式与单片机的帖子自己反思一下,有点好高骛远,所以要脚踏实地的学习,打算先把51学精通了,但是怎么学习有点没头绪,您是牛人就想请教一下您,知道您很忙但非常希望您给我指导一下,站在巨人的肩膀上才能看得远嘛,再次先谢谢鸿哥了,亲别介意我幼稚啊。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
学单片机主要靠兴趣和自己学能力,自己多动手动脑,我的东西只能给你们初学者一个参考的作用,最终还是要靠个人的悟性与自学能力。 |
|
|
|
|
|
|
|
|
有道理,我现在通过做东西一步步学习,我还是很喜欢单片机的,通过看您的帖子有很大的感触,谢谢鸿个的指点。非常感谢 |
|
|
|
|
|
|
|
|
鸿哥,有个问题想请教一下。就是我看了鸿哥前面几节的按键扫描,如果按键有压下和释放功能,鸿哥你会怎么处理?貌似我看到程序中只有压下功能,并没有按键释放功能。不知道是不是我没看懂你的程序?还请指教。
|
|
|
|
|
|
|
|
|
支持,加油!辛苦整理,自己应该也收获很多,但是能拿出来分享,就值得我们敬佩。
|
|
|
|
|
|
|
|
|
压下就是检测下降沿,释放就是检测上升沿,这些都是可以触类旁通的,我只能提示到这里,剩下的要靠你自己动脑筋。当然,等我把“单片机中的战斗机”系列写完了,我也会出一个新的系列“按键的花样技巧”系列,里面会有按键的各种触发技巧,但是都离不开我之前的按键编程思想。“按键的花样技巧”系列估计要两三个月后的事情了,所以还是要靠你自己动脑筋,想当年我就是靠自己动脑筋自己摸索出来的。相信你自己,鸿哥能干的事情,你也可以做到的。 |
|
|
|
|
|
|
|
|
现在在《山东职业学院》上大学,今年开始大三。高中的时候不喜欢英语和语文,个性强几乎不学,但是很喜欢喜学生物和物理,所以有个外号叫物理专业户。呵呵。至此来到了专科学校。这个学校是铁路背景的专科学校,全国的很多铁路局来这里要人所以好多同学不学习,你只要在学校认真学习就会很快冒尖,老师也会很容易发现你。我小时候就很喜欢电子,现在在学校又是学的电子所以比起别的同学更专业点。老师都是很厉害的,由于和老师走的比较近,他们也会带着我做点小工程,受益许多。如今我发现自己还要学的东西越来越多,还有一年就走出校门了,真是害怕自己出去搞电子技术还不够。也在犹豫是不是要去铁路局,追求一份稳定的工作,饿不着的就这样活着,还是自己去追求自己喜欢的事业。哎,知道现实和理想是有差距的,可对我一个涉世未深的青年怎样选择!!其实我是这样想的,如果济南铁路局要我的话(家离济南近,或许济南局会把我分到我们家乡工作),我就去济南局签五年合同(第一次只能签五年)。在里面继续修炼自己的内功(铁路局工作空闲时间很多)。五年后再看情况是否出来干电子。这样既有一份稳定的工作又可以很好地在社会上观察世态动向(也许我很天真,哈哈!)。现在说多了都是瞎扯淡,还是抓紧时间学习吧。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
,明白。感谢你的回复,我已经懂了。
|
|
|
|
|
|
|
|
|
我当时移植程序的时候,就是把按键释放搞了,正如鸿哥所说,检测上升沿,在这里分享下,希望你自己能够独立实践,这样才锻炼人。 按键检测部分
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
好东西那就顶起~~~
|
|
|
|
|
|
|
|
|
哪位大侠有试过将鸿哥的“第九节:串口通讯之485通讯”移植到51上,能提供一下参考程序呀。
发送一组数据到单片机,愣是收不到返回数据,编译也正常。 俺是新手,在此拜谢。 |
|
|
|
|
|
|
|
|
建议不要一字不改照抄移植。应该先读懂了大概的编程思路,然后自己一步一步增加代码调试,比如第一步编写最简单的程序确保能收或者能发数据,这样能排除硬件上的问题,然后再一步一步往上增加代码。 |
|
|
|
|
|
|
|
|
第五十一节:单片机中的战斗机switch---按键设置跑马灯的速度
开场白: Switch语句是单片机中的战斗机,是整个程序的灵魂,这句话一点都不夸张。我们只要以Switch语句为支点,再复杂再繁琐的程序都可以轻松地编写出来。 在鸿哥的编程体系中,Switch括号里面的全局变量就是最核心的变量,鸿哥把它定义为步骤变量,后缀统一用_step命名。我们只要根据实际情况灵活控制步骤变量,就可以演绎出无穷的单片机程序。接下来,我将会专门花几个章节来讲switch语句的实战用法。 (1) 功能需求: 让8个LED灯正向循环依次点亮,同一时刻只有一个LED灯点亮。用两个独立按键实时设置此跑马灯的速度。其中一个独立按键是加速,另外一个独立按键是减速。 (2) 硬件原理: 利用单片机的16个IO口引脚分别连接到16个LED灯的负极,16个LED的正极分别串接一个510欧的电阻,电阻的另一端都连接到电源VCC上。一般来说,单片机IO口的灌电流比输出的驱动电流要大,所以驱动LED灯的时候,我喜欢用IO口接LED灯的负极,正极经过限流电阻后直接连VCC。 独立按键和有源蜂鸣器的硬件原理请参考本连载文章的第二节。 (3) 源码适合的单片机: PIC16F73,晶振为3.579545MHz。 (4)单片机的C语言源代码讲解: #include #define cnt_delay_cnt1 25 //按键去抖动延时阀值 #define cnt_voice_time 60 //蜂鸣器响的声音长短的延时阀值 //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的IO后缀都是_sr #define one_led_dr1 RC0 //控制发光二极管 #define one_led_dr2 RC1 //控制发光二极管 #define one_led_dr3 RC2 //控制发光二极管 #define one_led_dr4 RC3 //控制发光二极管 #define one_led_dr5 RC4 //控制发光二极管 #define one_led_dr6 RC5 //控制发光二极管 #define one_led_dr7 RC6 //控制发光二极管 #define one_led_dr8 RC7 //控制发光二极管 #define beep_dr RB1 //蜂鸣器输出 #define key_sr1 RB6 //独立按键输入 #define key_sr2 RB7 //独立按键输入 //补充说明:吴坚鸿程序风格是这样的,按键扫描函数通常放在定时中 //断里,按键服务程序通常放在main函数循环里。有人说不应该把子程序放在中断里,别听他们,信鸿哥无坎坷。 void key_scan(); //按键扫描函数,放在定时中断里 void key_service(); //按键服务函数,放在main函数循环里 void one_led_run(); //跑马灯程序 unsigned long one_led_cnt=0; //延时计数器 unsigned long one_led_on_time_set=1000; //控制跑马灯速度的变量,按键设置速度的本质就是更改此变量的数值.当然此数据的大小我没仔细验证过,读者根据实际情况来调整. unsigned char one_run_step=0; //步骤变量,这就是鸿哥传说中的步骤变量,单片机程序的核心 unsigned char key_lock1=0; //按键自锁标志 unsigned char key_lock2=0; //按键自锁标志 unsigned int delay_cnt1=0; //延时计数器的变量 unsigned int delay_cnt2=0; //延时计数器的变量 unsigned int voice_time_cnt; //蜂鸣器响的声音长短的计数延时 unsigned char key_sec=0; //哪个按键被触发 main() //主程序 { ADCON0=0x41; //设置AD模式 ADCON1=0x04; //RA0作为AD输入通道,本程序中没有用到AD,不用管它 TRISC=0x00; //LED灯的IO口设置成输出 one_led_dr1=1; //初始化,全部LED灯都灭 one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; TRISB1=0; //蜂鸣器设置成输出 beep_dr=0; //上电初始化蜂鸣器 TRISB6=1; //独立按键设置成输入 TRISB7=1; //独立按键设置成输入 T1CON=0x24; //定时中断配置 TMR1H=0xFE; TMR1L=0xEF; INTCON=0xC0; TMR1IF=0; TMR1IE=1; PEIE=1; //外围中断允许 GIE=1; //开总中断 TMR1ON=1; //启动定时器中断 while(1) { CLRWDT(); //喂单片机内部自带的看门狗,大家可以不管它 one_led_run(); //跑马灯程序 key_service(); //按键服务 } } void one_led_run() //跑马灯程序 { switch(one_run_step) { case 0: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=0; //第1个LED灯被点亮 one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=1; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 1: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=0; //第2个LED灯被点亮 one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=2; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 2: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=0; //第3个LED灯被点亮 one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=3; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 3: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=0; //第4个LED灯被点亮 one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=4; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 4: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=0; //第5个LED灯被点亮 one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=5; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 5: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=0; //第6个LED灯被点亮 one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=6; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 6: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=0; //第7个LED灯被点亮 one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=7; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 7: if(one_led_cnt>one_led_on_time_set) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=0; //第8个LED灯被点亮 one_led_cnt=0; //延时计数器清零 one_run_step=0; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; } } void key_scan() //按键扫描函数 { if(key_sr1==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙,仔细品味,回味无穷,在按键去抖动期间,如果低电平掺杂了干扰的高电平,则计数器重新清零计数,极大增强了抗干扰的能力。 } else if(key_lock1==0) //有按键按下,且是第一次被按下 { ++delay_cnt1; //延时计数器 if(delay_cnt1>cnt_delay_cnt1) { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=1; //触发1号键 } } if(key_sr2==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { key_lock2=0; //按键自锁标志清零 delay_cnt2=0; //按键去抖动延时计数器清零,此行非常巧妙,仔细品味,回味无穷,在按键去抖动期间,如果低电平掺杂了干扰的高电平,则计数器重新清零计数,极大增强了抗干扰的能力。 } else if(key_lock2==0) //有按键按下,且是第一次被按下 { ++delay_cnt2; //延时计数器 if(delay_cnt2>cnt_delay_cnt1) { delay_cnt2=0; key_lock2=1; //自锁按键置位,避免一直触发 key_sec=2; //触发2号键 } } } void key_service() //按键服务函数 { switch(key_sec) //按键服务状态切换 { case 1:// 1号键 加速按键 one_led_on_time_set=one_led_on_time_set-100; //每一步减去100,读者根据实际情况修改此数值 if(one_led_on_time_set<200) //限定一个最低数值,此数值越低,跑马灯的速度就越快 { one_led_on_time_set=200; } voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零,避免一直触发 break; case 2:// 2号键 减速按键 one_led_on_time_set=one_led_on_time_set+100; //每一步加上100,读者根据实际情况修改此数值 if(one_led_on_time_set>10000) //限定一个最高数值,此数值越高,跑马灯的速度就越慢 { one_led_on_time_set=10000; } voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零,避免一直触发 break; } } void interrupt timer1rbint(void) //中断程序入口 { if(TMR1IE==1&&TMR1IF==1) //定时中断程序 { TMR1IF=0; TMR1ON=0; key_scan(); //按键扫描函数 if(one_led_cnt<0xffffffff) //不要超过最大long类型范围 { one_led_cnt++; //第1路延时计数器 } TMR1H=0xFF; TMR1L=0xC8; TMR1ON=1; } } (5)下集预告: 单片机中的战斗机switch---按键设置跑马灯的方向。 (未完待续,下节更精彩,不要走开哦!) |
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2013-9-13 11:38 编辑
第五十二节:单片机中的战斗机switch---按键设置跑马灯的方向 开场白: Switch语句是单片机中的战斗机,是整个程序的灵魂,这句话一点都不夸张。我们只要以Switch语句为支点,再复杂再繁琐的程序都可以轻松地编写出来。 在鸿哥的编程体系中,Switch括号里面的全局变量就是最核心的变量,鸿哥把它定义为步骤变量,后缀统一用_step命名。我们只要根据实际情况灵活控制步骤变量,就可以演绎出无穷的单片机程序。接下来,我将会专门花几个章节来讲switch语句的实战用法。 (1) 功能需求: 让8个LED灯循环依次点亮,同一时刻只有一个LED灯点亮。用一个独立按键实时设置此跑马灯的方向。按一次为反向,再按一次为正向,依次切换。 (2) 硬件原理: 利用单片机的16个IO口引脚分别连接到16个LED灯的负极,16个LED的正极分别串接一个510欧的电阻,电阻的另一端都连接到电源VCC上。一般来说,单片机IO口的灌电流比输出的驱动电流要大,所以驱动LED灯的时候,我喜欢用IO口接LED灯的负极,正极经过限流电阻后直接连VCC。 独立按键和有源蜂鸣器的硬件原理请参考本连载文章的第二节。 (3) 源码适合的单片机: PIC16F73,晶振为3.579545MHz。 (4)单片机的C语言源代码讲解: #include #define const_led_on_time 1000 //控制跑马灯速度的数据,当然此数据的大小我没仔细验证过,读者根据实际情况来调整. #define cnt_delay_cnt1 25 //按键去抖动延时阀值 #define cnt_voice_time 60 //蜂鸣器响的声音长短的延时阀值 //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的IO后缀都是_sr #define one_led_dr1 RC0 //控制发光二极管 #define one_led_dr2 RC1 //控制发光二极管 #define one_led_dr3 RC2 //控制发光二极管 #define one_led_dr4 RC3 //控制发光二极管 #define one_led_dr5 RC4 //控制发光二极管 #define one_led_dr6 RC5 //控制发光二极管 #define one_led_dr7 RC6 //控制发光二极管 #define one_led_dr8 RC7 //控制发光二极管 #define beep_dr RB1 //蜂鸣器输出 #define key_sr1 RB6 //独立按键输入 //补充说明:吴坚鸿程序风格是这样的,按键扫描函数通常放在定时中 //断里,按键服务程序通常放在main函数循环里。有人说不应该把子程序放在中断里,别听他们,信鸿哥无坎坷。 void key_scan(); //按键扫描函数,放在定时中断里 void key_service(); //按键服务函数,放在main函数循环里 void one_led_run(); //跑马灯程序 unsigned long one_led_cnt=0; //延时计数器 unsigned char one_run_step=0; //步骤变量,这就是鸿哥传说中的步骤变量,单片机程序的核心 unsigned char key_lock1=0; //按键自锁标志 unsigned char key_lock2=0; //按键自锁标志 unsigned int delay_cnt1=0; //延时计数器的变量 unsigned int delay_cnt2=0; //延时计数器的变量 unsigned int voice_time_cnt; //蜂鸣器响的声音长短的计数延时 unsigned char key_sec=0; //哪个按键被触发 unsigned char direction_flag=0; //跑马灯的方向变量,它为0时代表正向,为1时代表反向。 main() //主程序 { ADCON0=0x41; //设置AD模式 ADCON1=0x04; //RA0作为AD输入通道,本程序中没有用到AD,不用管它 TRISC=0x00; //LED灯的IO口设置成输出 one_led_dr1=1; //初始化,全部LED灯都灭 one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; TRISB1=0; //蜂鸣器设置成输出 beep_dr=0; //上电初始化蜂鸣器 TRISB6=1; //独立按键设置成输入 T1CON=0x24; //定时中断配置 TMR1H=0xFE; TMR1L=0xEF; INTCON=0xC0; TMR1IF=0; TMR1IE=1; PEIE=1; //外围中断允许 GIE=1; //开总中断 TMR1ON=1; //启动定时器中断 while(1) { CLRWDT(); //喂单片机内部自带的看门狗,大家可以不管它 one_led_run(); //跑马灯程序 key_service(); //按键服务 } } void one_led_run() //跑马灯程序 { switch(one_run_step) { case 0: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=0; //第1个LED灯被点亮 one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=1; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=7; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 1: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=0; //第2个LED灯被点亮 one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=2; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=0; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 2: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=0; //第3个LED灯被点亮 one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=3; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=1; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 3: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=0; //第4个LED灯被点亮 one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=4; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=2; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 4: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=0; //第5个LED灯被点亮 one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=5; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=3; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 5: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=0; //第6个LED灯被点亮 one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=6; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=4; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 6: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=0; //第7个LED灯被点亮 one_led_dr8=1; one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=7; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=5; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; case 7: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=0; //第8个LED灯被点亮 one_led_cnt=0; //延时计数器清零 if(direction_flag==0) //正向 { one_run_step=0; //这就是鸿哥传说中的怎样灵活控制步骤变量 } else //反向 { one_run_step=6; //这就是鸿哥传说中的怎样灵活控制步骤变量 } } break; } } void key_scan() //按键扫描函数 { if(key_sr1==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙,仔细品味,回味无穷,在按键去抖动期间,如果低电平掺杂了干扰的高电平,则计数器重新清零计数,极大增强了抗干扰的能力。 } else if(key_lock1==0) //有按键按下,且是第一次被按下 { ++delay_cnt1; //延时计数器 if(delay_cnt1>cnt_delay_cnt1) { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=1; //触发1号键 } } } void key_service() //按键服务函数 { switch(key_sec) //按键服务状态切换 { case 1:// 1号键 控制方向的按键 if(direction_flag==0) //更改方向变量的标志就是更改跑马灯的方向 { direction_flag=1; //反向 } else { direction_flag=0; //正向 } voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零,避免一直触发 break; } } void interrupt timer1rbint(void) //中断程序入口 { if(TMR1IE==1&&TMR1IF==1) //定时中断程序 { TMR1IF=0; TMR1ON=0; key_scan(); //按键扫描函数 if(one_led_cnt<0xffffffff) //不要超过最大long类型范围 { one_led_cnt++; //第1路延时计数器 } TMR1H=0xFF; TMR1L=0xC8; TMR1ON=1; } } (5)下集预告: 单片机中的战斗机switch---按键控制跑马灯的启动,停止和暂停 (未完待续,下节更精彩,不要走开哦!) |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2382 浏览 1 评论
4241 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2619 浏览 2 评论
3118 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4577 浏览 5 评论
有套STM32与西门子200程序需要代写,有兴趣的工程师与有联系!
2489浏览 1评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6799浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-15 15:00 , Processed in 1.637736 second(s), Total 84, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖