本帖最后由 wgtwgtwgt 于 2024-4-18 18:18 编辑
在Keil C51中,char默认是有符号类型,即char等效于signed char。如果:
那么,用“==”判断c是否与0xff相等时,例如:
则表达式c == 0xff的值为0,而不是1。
测试代码:
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define TIME 1000
void delay_ms(unsigned int n)
{
unsigned int i, j;
for(i = n; i > 0; i--)
for(j = 114; j > 0; j--);
}
void main(void)
{
char c = 0xff;
SCON = 0x52;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1)
{
printf("%bd\n", c==0xff);
delay_ms(TIME);
}
}
解决方法:
1.将变量c的数据类型char改为unsigned char。代码:
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define TIME 1000
void delay_ms(unsigned int n)
{
unsigned int i, j;
for(i = n; i > 0; i--)
for(j = 114; j > 0; j--);
}
void main(void)
{
unsigned char c = 0xff;//改动在这里
SCON = 0x52;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1)
{
printf("%bd\n", c==0xff);
delay_ms(TIME);
}
}
或者:
2.强制表达式c == 0xff中的0xff为char类型。
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define TIME 1000
void delay_ms(unsigned int n)
{
unsigned int i, j;
for(i = n; i > 0; i--)
for(j = 114; j > 0; j--);
}
void main(void)
{
char c = 0xff;
SCON = 0x52;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1)
{
printf("%bd\n", c==(char)0xff);//改动在这里
delay_ms(TIME);
}
}
/***********************************************************************************************/
使用Keil C51的printf函数打印变量值时,若变量是一个字节存储的,例如char,则用%bd;若变量是两个字节存储的,例如int,则用%hd;若变量是四个字节存储的,例如long,则用%ld。测试代码:
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define TIME 1000
void delay_ms(unsigned int n)
{
unsigned int i, j;
for(i = n; i > 0; i--)
for(j = 114; j > 0; j--);
}
void main(void)
{
char c = -3;
int i = -5;
long l = -9;
SCON = 0x52;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1)
{
printf("%bd\n", c);
printf("%hd\n", i);
printf("%ld\n", l);
delay_ms(TIME);
}
}
/***********************************************************************************************/
Keil C51要求局部变量定义在函数的顶部,也就是在一个函数内,局部变量前面不能出现任何语句。
|