第五课 C语言基础 关于C语言基础。 这一讲开篇就开始讲解的是printf函数的定义及fmt格式控制字符串,但是我感觉在讲之前可以先说一下流程图,我个人感觉流程图虽然不是C语言的基础但是一开始就能把整个编程思路理清楚能让我们更快速的去开发程序。 #define printf printf_hid int printf_hid (const char *fmt, ...); 这是print函数的原型的定义, 参数fmt -- 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明 。 普通字符:在输出时,普通字符将原样不动地复制到标准输出。 printf("8051U深度入门到32位51大型实战视频\r\n"); 转换说明:不直接输出,用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明符结束,从而说明输出数据的类型、宽度、精度等。 printf("8051U深度入门到32位51大型实战视频,%s\r\n","加油"); 转换说明简介: 1.类型:根据不同的 fmt 字符串,函数可能需要一系列的附加参数,每个 参数包含了一个要被插入的值,替换了 fmt 参数中指定的每个 % 标签。 关于附加参数,既可以是变量,也可以是常量。 2.位置:printf()函数的普通字符和转换说明放在" "双引号内,附加参数 放在双引号外,每个附加参数之间用逗号隔开。 3.数量:printf() 的附加参数与转换说明符是⼀⼀对应关系,如果有 n 个转 换说明符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的转 换说明符,printf() 可能会输出内存中的任意值。 转换说明简介: 1.类型:根据不同的 fmt 字符串,函数可能需要一系列的附加参数,每个 参数包含了一个要被插入的值,替换了 fmt 参数中指定的每个 % 标签。 关于附加参数,既可以是变量,也可以是常量。 2.位置:printf()函数的普通字符和转换说明放在" "双引号内,附加参数 放在双引号外,每个附加参数之间用逗号隔开。 3.数量:printf() 的附加参数与转换说明符是⼀⼀对应关系,如果有 n 个转 换说明符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的转 换说明符,printf() 可能会输出内存中的任意值。 printf("今天是%d年%d月%d日\r\n",24,11,16);这段直接使用C语言编译显示如下
1.转换说明符
%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)
%c 字符
%d 有符号十进制整数
%f 浮点数(包括float和double)
%e(%E) 浮点数指数输出[e-(E-)记数法]
%g(%G) 浮点数不显无意义的零"0"
%i 有符号十进制整数(与%d相同)
%u 无符号十进制整数
%o 八进制整数 e.g. 0123
%x(%X) 十六进制整数 e.g. 0x1234
%p 指针
%s 字符串
%% "%" 2.标志
左对齐:"-" e.g. "%-20s"
右对齐:"+" e.g. "%+20s"
空格:若符号为正,则显示空格,负则显示"-" e.g. "% "
#:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;
对e,g,f 类当结果有小数时才给出小数点。 3.格式字符串(格式)
[标志][输出最少宽度][.精度][长度]类型
"%-md" :左对齐,若m比实际少时,按实际输出。
"%m.ns":输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n
e.g. "%7.2s" 输入CHINA
输出" CH"
"%m.nf":输出浮点数,m为宽度,n为小数点右边数位
e.g. "%" 输入3852.99
输出3853.0
长度:为h短整形量,l为长整形量 接下来就是ASCII了,正常我们显示的字都是ASCII字不是进制数。 还有就是计算机采用的进制数了,有数的进制:2进制、10进制、16进制 2进制转16进制一般是421模式的,16进制转2进制就是反过来算。 C51数据的基本类型有:
bit,signed char,unsigned char,enum,signed short int,unsigned short int,signed int,unsigned int,
unsigned int,signed long int,float,double,idata*,data*,pdata*,near*,xdata*,code*,far*,huge*,
sbit,sfr,sfr16
如果想要使用64位的变量,需要在程序文件里面添加:#pragma float64
常用运算符:+、-、*、/
逻辑运算符:
&:逻辑与(and两个都为真结果为真)
|:逻辑或(or两个中任一个结果为真)
!:逻辑非(not真变假、假变真)
运算符:
==:判断运算符,判断两边数是否相等。 =:赋值运算符,把右边的操作数赋给左边的操作数
+=:加且赋值运算符,把左边的操作数加上右边的操作数结果再赋给左边的操作数
-=:减且赋值运算符,把左边的操作数减去右边的操作数结果再赋给左边的操作数
*=:乘且赋值运算符,把左边的操作数乘右边的操作数结果再赋给左边的操作数
/=:除且赋值运算符,把左边的操作数除以右边的操作数结果再赋给左边的操作数
%=:求模且赋值运算符,把两个操作数的模运算结果赋给左边的操作数
<<=:左移且赋值运算符
>>=:右移且赋值运算符
&=:按位与且赋值运算符
^=:按位异或且赋值运算符
|=:按位或且赋值运算符
以下是示例程序 - #include "ai8051u.h" //调用头文件
- #include "stc32_stc8_usb.h" //调用头文件
-
-
- #define u8 unsigned char //8位无符号变量(0-255)
- #define u16 unsigned int //16位无符号变量(0-65535)
-
- u8 X = 10;
- u8 Y = 10;
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
-
- void GPIO_Init()
- {
- P0M1 = 0x00; P0M0 = 0x00;
- P1M1 = 0x00; P1M0 = 0x00;
- P2M1 = 0x00; P2M0 = 0x00;
- P3M1 = 0x00; P3M0 = 0x00;
- P4M1 = 0x00; P4M0 = 0x00;
- P5M1 = 0x00; P5M0 = 0x00;
- P6M1 = 0x00; P6M0 = 0x00;
- P7M1 = 0x00; P7M0 = 0x00;
- }
- void main(void)
- {
- P_SW2 |= 0x80; //B7位写1,使能访问XFR
-
- usb_init(); //USB CDC 接口配置
-
- IE2 |= 0x80; //使能USB中断
- EA = 1; //IE |= 0X80;
-
- while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
-
- while(1)
- {
-
- if (bUsbOutReady) //如果接收到了数据
- {
- //USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
-
- if( X && Y ) //如果条件为真,输出什么
- {
- printf("条件为真\r\n");
- }
- else
- {
- printf("条件为假\r\n");
- }
-
-
-
- usb_OUT_done(); //
- }
-
- }
- }
复制代码
|