语言:C 图片:16F84A 程序:CCS PCW
当我编译以下代码时,我的编译器抱怨 FOR 总是为真(也许 int i 不支持负值?):
#include <16F84A.h>
#FUSES XT
#use delay(clock=4M)
byte const display[10] = {63,6,91,79,102,109,124,7,127,103};
void main()
{
set_tris_b(0);
while(True)
{
int i;
for(i=9;i>=0;--i)
{
output_b(display[i]);
delay_ms(300);
}
}
}
PIC倒计时项目,所以: 9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,.. . 但它在第一个周期后停止。
使用
signed int i;
代替
int i;
整数在 CCS 编译器中默认是无符号的。
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf
查看第 38 页
“默认情况下,除 float 之外的所有类型都是无符号的;但是,[它们]前面可能有无符号或有符号。
你的编译器要么坏了,要么是一些非标准的垃圾,其中
int
默认是无符号的。
我建议改用真正的、符合标准的 C 编译器。
查看编译器生成的汇编代码,你就知道了。或者在这里发布,这样我们就不必拥有/安装特定的编译器。组装的好想法(特别是在像 PIC16 这样的简单微处理器上)是它永远无法隐藏它实际做了什么 :-)
我同意这里关于某些工具质量的一些评论,而且 Microchip 从来没有自己的 PIC16 C 编译器,所以我们不能责怪他们:-(
我只是弄清楚它与for条件有关并且 递减 for.
上的变量类型*使用变量类型作为 signed int8 或 signed int16,
*停止条件设为 i>-1;
这消除了警告并且代码运行正常。
...
#include <16f84a.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
void main(){
set_tris_b(0x00);
output_b(0x00);
signed int16 i, unid, dec, dato;
while(true){
for(i=99; i>-1; i--){
dec = i/10;
unid = i - (dec*10);
dato = (dec<<4) + unid;
output_b((int8)dato);
delay_ms(50);
}
}
}
...
以下代码的类似问题,图片在第一轮运行正常, 但是当它再次启动时它显示其他值,这发生了 当我看到同样的警告时,我不知道我需要修改什么 在防止此类警告的代码中,请帮助
#include <16f84a.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
void main(){
set_tris_b(0x00);
unsigned int i, unid, dec, dato;
while(TRUE){
for(i=99; i>=0; i--){
dec = i/10;
unid = i - (dec*10);
dato = (dec<<4) + unid;
output_b(dato);
delay_ms(50);
}
}
}