自己编程犯的错

自己编程犯错汇总

脑残入坑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;
	}


猜你喜欢

转载自blog.csdn.net/diiiiiiiiiiiiiiii/article/details/80916802