51单片机 独立按键
代码烧录到开发板不起作用怎么回事?
#include <regx52.h>
void Delay (unsigned int xms){
unsigned char k , j;
while(xms){
k = 2;
j = 236;
do{
while(--k);}
while(--j);
xms--;
}
}
sbit k1 = P3^1;
sbit k2 = P3^0;
sbit k3 = P3^2;
sbit k4 = P3^3;
unsigned char Key(){
unsigned char KeyNumber = 0;
if(k1 == 0){Delay(10);if(k1==0){KeyNumber == 1;}while(!k1);}
if(k2 == 0){Delay(10);if(k2==0){KeyNumber == 2;}while(!k2);}
if(k3 == 0){Delay(10);if(k3==0){KeyNumber == 3;}while(!k3);}
if(k4 == 0){Delay(10);if(k4==0){KeyNumber == 4;}while(!k4);}
return KeyNumber;
}
unsigned char KeyNum;
int main(void){
while (1){
KeyNum = Key();
if(KeyNum == 1){P2 = 0xfe;}
}
}
常用惯例, P3.0, P3.1 会是 UART TX/RD.
怀疑你硬件干扰, 或是51零件本身初始化干扰。
main程序改成
int main( void )
{
P3 = 0xFF; /* 初始 P3, 避免预设错误 */
P2 = 0x00; /* 全亮, 表示LED 驱动OK. 也确认51有动作 */
while (1)
{
KeyNum = Key( );
if( 0 != KeyNum )
{
P2 = KeyNum; /* 看灯号对按键 */
}
}
}
2022/08/14
这几个指令没指值 KeyNumber = 1; <- 是 = , 不是 ==
if(k1 == 0){Delay(10);if(k1==0){**KeyNumber == 1; **}while(!k1);}
if(k2 == 0){Delay(10);if(k2==0){KeyNumber == 2;}while(!k2);}
if(k3 == 0){Delay(10);if(k3==0){KeyNumber == 3;}while(!k3);}
指值用 =
P3 = 0xFF;
逻辑比较符 == , 返回 1 or 0 ( TRUE, FALSE )
( 0 == k1 ) 使用时, 要注意 “强制型别转换” 所带来的隐性错误
无图无真相,单片机代码必须结合电路图才行,不然无法给出解释