keil中c语言问题汇总(佛科院——深夜学习)
目录
一、不理解该函数
1.TH0,TL0的解释:
在16位定时器模式下,TH0相当于计数器0的高8位,TL0相当于定时器0的低8位。
2.分析:
假设TH0=200,TL0=100,用二进制表示应该是TH0=1100 1000,TL0=0110 0100.
TH0<<8:将TH0右移8位 (TH0<<8)=1100 1000 0000 0000
(TH0<<8)| TL0:将(TH0<<8)与 TL0进行与运算,也就是只要一方某一位为1,最后结果该位也为1,(TH0<<8)| TL0=1100 1000 0110 0100
3.总结:
这是最常见的处理16位数据的方法,应为一般一个字节只有8位,如果一个数据是16位,最好是把它分为高8位和低8位
二、如何理解左移右移操作:
1、移位操作会导致位溢出和位补偿0
2、具体溢出看具体定义的类型,unsign char 为8位,unsign int 为16位,unsigned long 为32位
3、左移右移操作还可以用在串行通信上:
//高位先行,也就是先发高位
void Write_byte(u8 w_data)
{
u8 i;
for(i=0;i<8;i++)
{
SDA=w_data>>7;//将低七位都溢出,留下最高位发送
w_data<<=1;//将次高位变成最高位
/*后面是发送的步骤*/
SCL=1;
delay_us(5);
SCL=0;
delay_us(5);
}
}
三、如何关闭未调用函数警告:
找到Disable Warning Number输入相应警告的编号,就能关闭该警告
就例如这个警告的编号是16
三、sprintf函数的使用:
1、作用:
将不同的格式数据全部统一成字符串,而且可以指定字符串的格式
1、调用库:
#include "stdio.h"
2、函数参数解释:
int sprintf( char *buffer, const char *format [, argument] … );
- buffer:指向字符数组的指针,格式化后的字符串会存储在这里。
- format:格式化的字符串,可以指定字符串的格式
- argument:根据语法格式替换format中%标签
3、格式化符号:
- %o 无符号8进制整数
- %u 无符号10进制整数
- %x 无符号的16进制数字,并以小写abcdef表示
- %X 无符号的16进制数字,并以大写ABCDEF表示
4、基本功能:
1、格式化数字:
(1)基本操作:
sprintf(s, "%d", 123); // 产生"123"
(2)指定宽度:
sprintf(s, "%8d%8d", 123, 4567); // 产生:" 123 4567"
(3)左对齐:
sprintf(s, "%-8d%8d", 123, 4567); // 产生:"123
(4)16进制打印:
sprintf(s, "%8x", 4567); // 小写16进制,宽度占8个位置,右对齐
sprintf(s, "%-8X", 4568); // 大写16进制,宽度占8个位置,左对齐
(5)左边补0的16进制字符串:
sprintf(s, "%08X", 4567); // 产生:"000011D7"
5、注意:
(1) spritnf 是个变参函数,除了前两个参数不会变之外,后面的参数都会都会因为格式符而发生变化,例如:
unsigned char ucSec;
sprintf(pucSeg_Buf, " %04u", (unsigned int)ucSec);
由于unsigned char 是八位的数据,而%u是无符号整形(unsigned int)是十六位的数据,在传递过程中就会出错,所以我们在传入数据前最好先统一格式
四、\r,\n,\r\n的理解
1、\r代表回车,即回到当前行的行首,继续输入就会覆盖掉之前输入的信息
2、\n代表换行,即换到当前位置的下一行
3、\r\n则是代表先回车再换行,即换到下一行的行首