理由呢?是谁教你的? |
zl2168 发表于 2016-10-12 15:14 这个程序我没看~我只是提出对这个写法的意见~写一个比较的时候,常量放在前,变量放在后,这样可以防止出现if(a==0)写成if(a=0)这样的情况~ |
luoluoluo136 发表于 2016-10-12 14:37 这是优点吗?好像没有因果关系。 |
zl2168 发表于 2016-10-11 21:20 if(0 == KEY1) 这种写法优于if(KEY1 ==0 ) ,因为后面这种会有可能写成if(KEY1 =0 ) |
if(0 == KEY1) 不是赋值语句,而是条件判断。但一般不这样写,而是写成: if(KEY1 ==0 ) KYE1按下时,P3.4端(即定义为KYE1)为0,这是电路连接的结果 |
zl2168 发表于 2016-10-11 21:20 嗯,这个明白。 |
本帖最后由 zl2168 于 2016-10-11 21:53 编辑 实例5 4种不同方式键控信号灯 按键按能否锁定可分为有锁按键和无锁按键。有锁按键是按下即能锁定闭合状态,只有再次按一下才能解除闭合状态,回归断开状态。无锁按键不能锁定闭合状态,除非按住键不予释放,典型的例子就是电脑键盘上的按键。 单片机应用系统中,根据按键闭合和释放状态,有多种不同的键控方式,可编写不同的程序予以实现。本例要求按以下4种不同方式分别键控VD0~ VD3。 ⒈ 电路设计 P1.0~P1.3分别接VD0~VD3发光二极管,输出低电平时亮,输出高电平时暗。R0~R3为限流电阻,取330Ω。S0~S3为无锁按键,键信号输入端分别为P1.4~P1.7,按键闭合时输入0,按键断开时输入1。R4~R7为上拉电阻,取10kΩ,接+5V,如图3-7所示。 ① 无锁按键:S0按下,VD0亮;S0释放,VD0暗; ② 无锁按键(前沿有效):S1按下,VD1亮;S1释放,VD1延时2s后暗。 ③ 无锁按键(后沿有效):S2按下,VD2不亮;S2释放,VD2亮,并延时2s后暗。 ④ 模拟有锁按键:S3按第一次,VD3亮,并继续保持;按第二次,VD3才暗。 ![]() 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1 书中电路和程序设计有详细说明,程序语句条条有注解。 |
本帖最后由 zl2168 于 2016-10-11 21:47 编辑 问题2.!KEY2按照解释不应该是弹起,当延时确认是弹起才会控制LED1灭。 if(!KEY2)与 if(KEY2==0)作用相同。KEY2未按下时,KEY2=1,!KEY2=0,则不会进入后面的程序,直至KEY2按下,才会进入后面的程序。 后面的 if(!KEY2)隶属于前面的 if(!KEY2),此时已KEY2=0,!KEY2=1。延时去抖后,控制LED1灭,不需要KEY2弹起。 while(!KEY1)是等待KEY1再次按下。 |
本帖最后由 zl2168 于 2016-10-11 21:27 编辑 问题1.为什么0赋给KYE1来判断是否按键有输入信号,而不是1的时候? if(0 == KEY1) 不是赋值语句,而是条件判断。但一般不这样写,而是写成: if(KEY1 ==0 ) KYE1按下时,P3.4端(即定义为KYE1)为0,这是电路连接的结果,请看你自己的连接电路。 |
zl2168 发表于 2016-10-11 18:40 #include <reg52.h> /* ***************************************************** */ // 为已知类型起别名 /* ***************************************************** */ typedef unsigned int uInt16; /* ***************************************************** */ // 位定义 /* ***************************************************** */ sbit LED1 = P2^0; sbit KEY1 = P3^4; sbit KEY2 = P3^5; /* ***************************************************** */ // 函数名称:DelyaMS() // 函数功能:毫秒延时 // 入口参数:延时毫秒数 // 出口参数:无 /* ***************************************************** */ void DelayMS(uInt16 ValMS) { uInt16 uiVal,ujVal; for(uiVal = 0; uiVal < ValMS; uiVal++) for(ujVal = 0; ujVal < 113; ujVal++); } /* ***************************************************** */ // 函数名称:main() // 函数功能:扫描按键并做出相应LED灯亮灭动作 // 入口参数:无 // 出口参数:无 /* ***************************************************** */ void main(void) { while(1) { if(0 == KEY1) // 检测按键是否按下 { DelayMS(5); // 延时去抖 if(0 == KEY1) // 再次检测 { LED1 = 0; // 点亮LED灯 while(!KEY1); // 等待按键弹起 } } if(!KEY2) { DelayMS(5); if(!KEY2) { LED1 = 1; while(!KEY2); } } } } |
#include <reg52.h> /* ***************************************************** */ // 为已知类型起别名 /* ***************************************************** */ typedef unsigned int uInt16; /* ***************************************************** */ // 位定义 /* ***************************************************** */ sbit LED1 = P2^0; sbit KEY1 = P3^4; sbit KEY2 = P3^5; /* ***************************************************** */ // 函数名称:DelyaMS() // 函数功能:毫秒延时 // 入口参数:延时毫秒数 // 出口参数:无 /* ***************************************************** */ void DelayMS(uInt16 ValMS) { uInt16 uiVal,ujVal; for(uiVal = 0; uiVal < ValMS; uiVal++) for(ujVal = 0; ujVal < 113; ujVal++); } /* ***************************************************** */ // 函数名称:main() // 函数功能:扫描按键并做出相应LED灯亮灭动作 // 入口参数:无 // 出口参数:无 /* ***************************************************** */ void main(void) { while(1) { if(0 == KEY1) // 检测按键是否按下 { DelayMS(5); // 延时去抖 if(0 == KEY1) // 再次检测 { LED1 = 0; // 点亮LED灯 while(!KEY1); // 等待按键弹起 } } if(!KEY2) { DelayMS(5); if(!KEY2) { LED1 = 1; while(!KEY2); } } } } |
程序不完整,你都没有定义KEY1、KEY2,叫人家怎么解答你的问题?本网站不会提问的人太多! |