本帖最后由 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要求局部变量定义在函数的顶部,也就是在一个函数内,局部变量前面不能出现任何语句。
|