一、使用标志位时记得在判断成功后清除标志位
if(count == 500) { sprintf(SEG_COT, "%4u--%02u", year,(u16)month); SEG_TSL(SEG_COT,SEG_Code); if(month == 12) month = 0; month++; count = 0; }
讯享网
二、使用定时器前记得初始化定时器,用STC-ISP生成定时器初始化时记得开中断
三、除了主函数外的函数,局部变量必须显式初始化
当你定义一个局部变量时,编译器会从堆栈中分配一定的内存给这个局部变量,而这个局部变量的初值是否为”0“我们是不能保证的,因为分配内存的地址是随机的,这个地址可能是其他函数用过的或者是第一次进入本函数用过的(这时候局部变量就相当于静态局部变量了)
例:
讯享网/* 输入变量:num,一个小于65535的数;D_num,存放分割好数据的数组 输出变量: 功能:将一个小于65535数的每一位分割出来 */ void SEG_TSL(u8 *input,u8 *output) { u8 i=0,temp=0,j; for(i=0;i<8;i++,j++) { switch(input[j]) { case '0': temp = 0xc0; break; case '1': temp = 0xf9; break; case '2': temp = 0xa4; break; case '3': temp = 0xb0; break; case '4': temp = 0x99; break; case '5': temp = 0x92; break; case '6': temp = 0x82; break; case '7': temp = 0xf8; break; case '8': temp = 0x80; break; case '9': temp = 0x90; break; case 'A': temp = 0x88; break; case 'B': temp = 0x83; break; case 'C': temp = 0xc6; break; case 'D': temp = 0xA1; break; case 'E': temp = 0x86; break; case 'F': temp = 0x8E; break; case 'H': temp = 0x89; break; case 'L': temp = 0xC7; break; case 'N': temp = 0xC8; break; case 'P': temp = 0x8c; break; case 'U': temp = 0xC1; break; case '-': temp = 0xbf; break; case ' ': temp = 0xff; break; default: temp = 0xff; } if(input[j+1] == ".") { temp &= 0x7f; j++; } output[i] = temp; } }
我们可以看到定义的j变量,由于我一开始没有对它置数导致j就在一直累加,而在我当时的想法它只是一个局部变量,初值一定为"0",然后我就大错特错了。
四、除了自己事先编写好的函数要引用,我们现场写的具体功能的函数也要记得引用,例如:按键检测的函数
五、并不是所有寄存器上电后都默认为0x00,AUXR辅助寄存器上电后默认为0x01
六、“\0”不等于‘\0'
void Uart_1_TX_String(u8 *S_dat) { while(*S_dat != "\0") { SBUF = *S_dat; while(TI == 0); TI = 0; S_dat++; } }
本来while中我是想判断当传入数据为空字符时跳出的,但是用了双引号表示字符串而不是字符,判断就出错了,然后我就想看看“\0”是什么,结果好像是乱码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/17114.html