|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、延时程序的处理:0 d! e' u6 R7 G* K& J
1、对于可以设置系统时钟的单片机,延时程序统一先把系统时钟设频率置为最低,然后按这个最低时钟频率写延时" v$ b& Y5 ?& [) `0 q
函数,这样的好处:第一,统一了不同系统时钟下的延时;第二,降低功耗 4 m8 F; J1 _$ i8 a
2、对于单片机系统,不同的外部时钟,延时程序对应的时间不同,为了方便使用,加入预编译指令#ifdef/#else/
# W! ^ ]4 Z% @! I% p* w #endif 这样如果预定义了一个系统时钟,则选择相应的延时参数进行编译,而延时程序主体不变,只是里面有+ d9 d O- y9 v1 Y/ y5 h4 a8 G
一个延时参数,根据预定义选择相应参数。
$ i+ S/ u6 A" f$ I4 o+ v二、for循环的处理:
6 B& ?- D) G( G 用for(i=XX,i>0,i--) 而不用for(i=0;i<XX,i++) 速度快
) L. n6 C9 o% f2 J& X' ` 对于两层或多层for循环,频繁的循环放在内层,减少循环间跳转花费的时间
C1 X! O# K) P$ a" w三、对外设的操作:可以把外设作为一个文件来操作,比如液晶,就可以把液晶看作一个文件,往液晶打印字符串或' H6 ] [9 h1 B/ X6 |3 @
者数据,就可以用fprintf()来做,(51的C标准库不支持,但是可以自己写一个文件操作的库)。只要是输入输出+ q. K( V% v5 a" t$ b" W; J3 e z2 _" C: X
设备,都试着用文件操作的方法去操作。
( a3 F. W T( \% x! D) u; w3 W. y& _
四、标准库函数的使用:8 D+ e* S1 E# Z& `
1、标准输入输出库(stdio.h):; V! K- V0 ^4 }$ {; T: c2 J
字符串夹杂变量数字(比如:发送完nihao字符串,然后发送变量i的值)往液晶显示或往串口发送的时候,往串口发2 @$ f$ h4 m, s
送可以使用格式输出函数printf("nihao%d",i);但是往LCD显示就不好做了,通常是写一个数字转字符串的函数,然
: U Y' }& N; X2 l; d7 Z 后先送原来的字符串,再送数字转换后的字符串,太麻烦,可以使用标准输入输出库里的sprintf()函数来完成,它
! a; M- S; @; Z W 的原型为:sprintf(char *buffer,const char *format, …),*buffer是要把字符串和变量写入的缓冲区,可以使
( T5 I6 ^' @0 M4 s0 h* G! A- k 用数组或者指针,后面的格式和printf()函数一样; 与之对应的还有sscanf()函数,从缓冲区读一个字符串把它
9 O# [' |0 L U) M1 Y$ Z9 M- y 转成相应的类型后赋给指定的变量。+ t" K @; |* D/ u1 i; C# q2 x
比如:
: n, W3 \9 J2 @: G- g/ i #include <stdio.h>: E/ B, q: R |: J- l3 ^
void PrintToLcd(unsigned char *str)7 L5 W6 ^" o* J b* q+ I( T$ A$ H& W
{
8 I" O) n' a3 ], G$ e2 V crazybc.com ^( }7 y0 a2 x/ X% h5 Z$ R* S, ^) [
}
- G# ^. X& ~/ O0 i; P3 m- e! N void main()
: B ^- R2 P) _/ y) [ {0 p$ W; G4 d6 ~$ ]& S$ w
unsigned char *p;0 b4 l5 l, h7 r, `- l/ J
unsigned char i = 50;3 q4 L; d7 z, u0 `7 \
sprintf(p,"nihao%d",i);, O; ^9 v/ I. U
PrintToLcd(p);
1 [3 n% ~" ?' Y& M }4 z0 ?1 }/ ~3 z9 r' a
2、字符串库(string.h)
+ O! t. @; G" U: ~ 字符串连接(相加) char*strcat(char *dest,const char *stc)! \8 O8 N/ n- q$ N
把src连接到dest字符串后面,返回指向dest的指针
! `& O' ?; O: T7 @1 L 字符串比较 int strcmp(char*str1,char *str2): v R& }8 o4 {5 D; N
返回值:小于0: str1<str2,等于0: str1=str2,大于0:str1>str26 V$ `" F. W9 E$ |
字符串拷贝1 char*strcpy(char *dest,const char *src)* i9 C; s6 i$ A$ O2 B
结果把src的内容拷进dest,两个字符串内容相同,返回指向dest的指针9 ]6 I5 l% {9 N1 ?) L* ]- C$ p
字符串拷贝2 char*strdup(const char *src)4 ^0 w/ J2 |4 P0 F
src:待拷贝的源字符串,返回值:指向拷贝后的字符串的指针$ D' w; g' Q; f
字符串倒序 char *strrev(char*s);
& ]+ f0 f' M' ^( o7 k5 x y3 ? 返回指向倒序后字符串的指针* K! K; y4 K" K8 p0 ]* `
3、类型转换(math.h; stdlib.h)$ l2 k- B+ t1 Y7 U' e
字符串转双精度(类似C++Builder里的StrToDouble) double atof(char *str); I5 P7 `: C3 E' t2 `
字符串转整数(类似StrToInt) int atoi(char *str) i; ~0 y0 B- ?0 v
字符串转长整型 long atol(char*str)+ V- H. O& k0 a- s, g3 T( S2 T
浮点数转字符串 char *ecvt(doublevalue,int ndigit,int*dec,int *sign)7 p& V4 w- c% f1 R: e) {
char *fcvt(double value,int ndigit,int*dec,int *sign)' R; o( k, x1 ^ Y8 a: q, {8 h
输入参数:value: 待转换浮点数,ndigit: 转换后的字符串长度
# t0 x1 \' u8 l9 U6 t 输出参数:dec: 小数点位置,sign: 符号+ ?# x9 y2 R: [, x" n
返回转换后的字符串指针
% i# F7 Y7 E; X 整型转字符串 char *itoa(intvalue,char *string,int radix), d5 I7 z9 L7 r9 u
输入参数:value: 要转换的数,radix: 转换的进制" I3 W! V5 r$ B T4 g9 ~( c6 K1 H* X4 ~. z
输出参数:string: 转换后的字符串; V* V7 q+ i4 Z, q
返回指向string的指针
2 D8 j& j0 V7 Z6 S$ \: u 长整型转字符串 char *ltoa(longvalue,char *string,int radix) |
|