自己编程犯错汇总
脑残入坑for循环
for(k=0;k<50;k++) //哈哈,最近特别喜欢用局部变量来节省空间,导致两个for循环用的一个变量,
{ //出现问题自己推演了很久,才找出来问题关键。坑死自己啦。
for(k=0;k<50000;k++)
{
if(k==2)
{sec+=10;}
}
}
优先级混淆导致判断出错
错误代码
for(i=0;i<4;i++)
{
if(keybuf[index][i]&0x0f==0x0f) keySta[index][i]=1;
else if(keybuf[index][i]&0x0f==0x00)keySta[index][i]=0;
}
自己来回看这段代码硬是没看出哪有不一样!一个一个对才把优先级问题给找出来;
因为丢了&运算的括号,导致先进行了==运算,再进行&运算,导致判断逻辑错误
正确代码
for (i=0; i<4; i++) //每行4个按键,所以循环4次
{
if ((keybuf[index][i] & 0x0F) == 0x00)keySta[index][i] = 0;
else if ((keybuf[index][i] & 0x0F) == 0x0F)keySta[index][i] = 1;
}
定时器:
void main()
{
unsigned char cnt = 0;
unsigned char i = 0;
TMOD = 0x01; //定时器0 模式1
TH0 = 0xB0; //0.02ms定时
TL0 = 0x00;
TR0 = 1;
while(1)
{
if(TR0==1) //这里TF0被自己写错 写成TR0 进入死循环
{
TR0 = 0; //在用软件判断进入中断后,第一件事就是清TF
TH0 = 0xB0; //千万记得要reload TH TL否则他就会从0开始计时;
TL0 = 0x00;
cnt++;
if(cnt>=50)
{
cnt = 0;
i++;
P0=NumberLED[i]; //这里P0 写成过P0^0 编译通过 显示异常 脑残的一B
if(i>=10)
i = 0;
}
}
}
中断
使用中断前记得打开总中断EA = 1;和自己的中断ET0 = 1;
void InterruptTime0() interrupt 1 //中断向量要计算正确 计算公式为 x*8+3=中断向量地址
{
TH0 = 0xfc; //进入中断TR1 = 1是硬件自动操作的
TL0 = 0x67; //TH0 和TL0 记得要自己设置
sec++;
P0=0xff; //P0=0xff 是消除鬼影的作用
switch(num)
{
case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=Numbuf[num];num++;break;
case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=Numbuf[num];num++;break;
case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=Numbuf[num];num++;break;
case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=Numbuf[num];num++;break;
case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=Numbuf[num];num++;break;
case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=Numbuf[num];num=0;break;
default:break;
}