在QT内的一些数组的计算:
char a[]={"abcdd"};
qDebug() << "strlen(a): "<< strlen(a) ;//5
qDebug() << "sizeof(a): "<< sizeof(a) ;//6
char b[10]={0};
b[0]=0;
b[1]=1;
b[2]=2;
b[3]=3;
b[4]=4;
qDebug() << "strlen(b): "<< strlen(b) ;//0 计算不了数值数组长度
qDebug() << "sizeof(b): "<< sizeof(b) ;//10
int c[]={1,2,3,4,5};
qDebug() << "sizeof(int): "<< sizeof(int) ;//4
qDebug() << "sizeof(c): "<< sizeof(c) ;//20
qDebug() << "sizeof(a)/sizeof(int): "<< sizeof(c)/sizeof(int) ;//20/4=5个数组成员 利用这种方法来计算
但是对于一些浮动数组,难以计算,尚未找到解决方法:
char d[100]={0};
d[0]=0;
d[1]=1;
d[2]=2;
d[3]=3;
d[4]=4;
d[5]=0;
d[6]=1;
d[7]=2;
d[8]=3;
d[9]=4;
qDebug() << "sizeof(d): "<< sizeof(d) ;//100
qDebug() << "strlen(d): "<< strlen(d) ;//0
char d[]={0};
d[0]=0;
d[1]=1;
d[2]=2;
d[3]=3;
d[4]=4;
d[5]=0;
d[6]=1;
d[7]=2;
d[8]=3;
d[9]=4;
qDebug() << "sizeof(d): "<< sizeof(d) ;//1——char的大小
qDebug() << "strlen(d): "<< strlen(d) ;//0——strlen计算的是字符串的大小
qDebug() << "sizeof(d)/sizeof(int): "<< sizeof(d)/sizeof(char) ;
数组归零算法:
//数组归零算法:
int i = 0, start = 0;
data[10]={0};
for (i = 0; i < 10; i++)
{
data[start++] = 2;
start = start % 10;//当start++到10时,来到这条语句,10%10又变回了0
}
判断数组地址是否结束:
unsigned char arr1[100] = {'a','b'};
unsigned char arr2[10];
int m = 0;
for (int i = 0; i < 10;i++)
{
arr2[i] = arr1[m];
//当m为2时,就能进入该if内,但如果数组为[]不确定数组时,则该数组没有'\0'结束符
if (arr1[m] == '\0')
{
m = 0;
}
m++;
}
小端序与大端序:
对于一个小端序的数据,接收后进行这样的算法即可换算过来
小端序数据->(arr[16]) + (arr[17]) * 256->大端序数据
外设内设:
Flash(常说得eeprom就是flash的一种):
DMA(分担CPU数据运输):
C51单片机寄存器的使用处理:
C51单片机命名:
STC8A8K64D4是STC8系列中A子系列8K字节SRAM,64字节片内flash,D4表示带DMA并有4个串口外设UART
C/C++细节操作:
位运算:
//将第7位置0,不影响其他位——
P0&=~(1<<7); //P0.7=0
//将第7位置1,不影响其他位——
P0|=(1<<7);
//将第3位取反,不影响其他位——
P0^=(1<<3);
if判断语句过长换行:
//判断转行 用 \
if (A == B\
&& C == D\
&& E == F
)
switch语句注意点:
switch语句注意点:
1、勿忘记添加break;否则语句会按顺序执行下去。
2、勿要把default:放在首位,这样即便switch的值与case值不符
却依旧能进入不应该执行的语句。
switch (2)
{
default:
case 3:
printf("为默认default,即便2不是3,依旧能进入");
case 1:
printf("上方无break,照常进入");
break;
}
宏定义注意点:
宏定义注意:
1、在使用宏定义判断的地方包含对应定义处的头文件,避免宏定义判断错乱。
2、在宏定义的.h头文件内,最好用括号将定义的值进行保护。
使用宏定义进行判断时:
某个头文件内:
A (1)
在某个.c利用其他.h文件内定义的宏进行判断(若未包含对应的.h,则可能出现if else错乱的现象):
#if A
#else
#endif
extern不能在.c内引用.cpp内的全局变量:
对于.cpp内定义的全局变量,在.c内extern引用将会报错,无法引用。两者文件后缀需一致。
全局定义结构体指针变量需给与确切空间:
无论是C还是C++,在全局定义一个结构体指针变量时,都要给与一个确切的地址
指向一片空间,不然在操作时将会程序错误。
注意:该片地址可以为sdram内的地址,但不能为NULL,否则程序也会错误。
消除按键抖动方式:
软件消抖方式:
//①按键延时消抖
static void Delayns(unsigned int n){while(n>0){n--;}}
//在读取按键之前加上延时
Delayns(65535);
//②通过判断两个状态是否相等来 判断状态确实有变化(类似于按键消抖过程)
if (input_status == input_status0)
硬件消抖方式:
在按键与IC引脚连接线中加一个对地电容,一脚接该连接线,一脚接电容
硬件消抖加电容
源码补码:
Keil软件操作:
Keil中对32单片机的debug处理方式
C51的Keil Debug:
出现以下问题,说明破解机不是C51版本的,Keil需要重新破解: