C语言总结Word格式文档下载.docx
《C语言总结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言总结Word格式文档下载.docx(28页珍藏版)》请在冰豆网上搜索。
若a>
b,则为真,值为1,所以c为1
5、逻辑运算
(1)逻辑与&
&
(2)逻辑或|
(3)逻辑非!
6、位运算
(1)按位与&
(2)按位或|
(3)按位异或^
(4)按位取反~
(5)位左移<
<
后面补零
(6)位右移>
>
7、自增运算
(1)++i先加1再使用--I先减1再使用
(2)i++先使用再加1i--先使用再减1
8、复合运算
变量复合赋值运算符表达式
a+=3等价于a=a+3<
=左移赋值
七、C语言结构语句
1.顺序结构0条语句
2.选择语句2条语句
(1)if单选if—else两选
(2)Switch—case—break,三者合起来才算选着语句
3.循环语句3条语句
(1)for(初值;
条件;
增值)
(2)do语句;
while(表达式)先执行后判断
(3)while(表达式)语句;
4.Break:
跳出循环语句,专用于switch语句和循环语句
Continue:
结束本次循环,专用于循环体中。
例:
ucharx=1,y=1;
for(i=0;
i<
2;
i++)
{x=x+1;
break;
y=y+1;
}循环结束后x=2,y=1,只执行一次程序
如果把break换成continue则x=3,y=1跳出本次循环执行下一次循环
5.Return子程序返回
八、函数
1.函数组成
(1)函数声明
(2)子函数
(3)函数的调用
2.如果函数有类型,那么一定有返回值
如果函数有形式参数,那么一定有实参向形参判定
九、数组、指针
1.数组类型数组名数组长度数组个数数组值
Inta[10]={0,1,2,3,4,5,6,7,8,9}后面5个数全赋值0
2.字符数组
Charc[]=“Cprogram”用字符串赋值比用字符逐个赋值要多占一个字节,用于存放”\0”标志
3.指针
uchar*spsp表示指向地址的数
*sp++表示指针是指向sp加1后的地址,但是数值时sp地址内的数值
4.P[i]与*(p+i)等价
十、跑马灯
1.延时1s函数
voiddelay1s()
{
uinti;
uintj;
for(i=1000;
i>
0;
i--)
for(j=110;
j>
j--)
}
2.数组方法实现
ucharcodeshu[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchari;
P1=0xff;
while
(1)
{
for(i=0;
8;
{
P1=shu[i];
delay(30000);
}}
3.指针
ucharcodeshu[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchart;
for(t=0;
t<
t++)
{
P1=*(shu+t);
delay();
}}
4.Switch—case—break语句
while
(1)//循环
{uchari;
{switch(i)
case0:
P1=0xfe;
break;
case1:
P1=0xfd;
case2:
P1=0xfb;
case3:
P1=0xf7;
case4:
P1=0xef;
case5:
P1=0xdf;
case6:
P1=0xbf;
default:
P1=0x7f;
//default可换成case7}
}
5.For语句
P1=0xff;
while
(1)
{for(i=0;
{a++;
if(a>
8)a=0;
b=(a-1);
P1=~(0x01<
b);
delay();
}}
6while语句
for(;
;
a=0)//无限循环
{a=0;
while(a<
8)
{P1=~(0x01<
a);
a++;
}}
十中断、定时器
1.定时查询4+1
(1)设置TMOD,定时器工作方式
(2)装预置数(THX,TLX)
(3)开定时器(TRX)
(4)TFX=0
查询溢出标志位TFX,若TFX由0到1,说明定时时间已到,硬件自动置1,软件清零
(5)记满重装预置数
2.中断
(3)设置IE,ITX,开总中断,开定时器中断
(4)设置TRX,开定时器
(5)中断时间到,处理中断服务函数
(6)记满重装预置数
3.中断函数语法
返回值函数名([参数])[模式][重入]interruptn[usingm]
外部中断0、定时器0、外部中断1、定时器1、串口、定时器2中断源编号为0、1、2、3、4、5
4.利用定时查询和中断方法实现跑马灯
(1)定时查询
voidled()
{unsignedchari;
20;
{
while(!
TF0);
TF0=0;
TH0=0x3c;
//重装预置数
TL0=0xb0;
}
voidmain()
{TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
//开定时器中断
TF0=0;
//开定时器溢出中断
while
(1)
{unsignedchari;
for(i=0;
{P1=~(0x01<
i);
led();
}}}
(2)中断
voidtimer0(void)interrupt1//定时器0中断服务程序
TH0=0x3c;
TL0=0xb0;
i++;
voidmain()//主程序
TMOD=0x01;
//定时器0,方式1
//装预置数
EA=1;
ET0=1;
TR0=1;
P1=0xfe;
{
while(i!
=20);
P1=_crol_(P1,1);
//左移指令,_cror_右移指令
i=0;
}}}
十一串行通信
1.串口3+2
(1)设置传输格式
(2)设置波特率
(3)设置串口工作方式
(4)若R1由0到1,表示接收完毕,只要把数据从接收SBUF取出来就可以了
(5)只要将数据放入SBUF中,若TI由0到1,则发送完毕
2.例子程序
(1)串口中断
main()
delay(1000);
TMOD=0x20;
//设置波特率
TH1=0xfd;
//Baudrate=9600;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
//串行通信设置
EA=1;
ES=1;
TR1=1;
P0=m[0];
P1=0xfe;
delay(200);
}
voidurat1(void)interrupt4
{if(RI)
{RI=0;
m[0]=SBUF;
}}
十二矩阵键盘
1、扫描键盘函数
P2=0xf0;
a=P2;
if(a!
=0xf0)
delayms(5);
P2=0xf0;
if(a!
key1=P2;
P2=0x0f;
key2=P2;
key=key2|key1;
gotopp1;
}elsekey=0xff;
2、松键处理
KEY=0xff;
//先将KEY赋值为无键按下
k=Keyscan();
//调用键盘扫描函数
if(k!
=0xff)//如果有键按下,则k不等于0xff
while(k==keyscan())//当键一直按着,则一直在循环这条语句,并不赋值,
P1=0xff;
//这个时候直接让他不显示
}
3、数值处理
{k=key();
//调用查询键值函数
if(k<
=0x0f)//如果k小于15,则往下执行
display[0]=k/10;
display[1]=k%10;
//分离将个位和十位分开
for(i=0;
P1=(~(0x01<
i));
//依次选中第一个和第二个数码管
P0=shu[display[i]];
//依次给个位和十位赋值
delay(100);
十三字符液晶屏
1.初始化
(1)显示模式设置0x38
(2)关显示
(3)清屏
(4)显示开关及光标设置
(5)显示状态(动态0x07,静态0x6)
voidinitlcd()
sendcommandbyte(0x38);
//设置工作方式,不检测判忙信号
sendcommandbyte(0x01);
//清屏
sendcommandbyte(0x0c);
//显示状态设置,开显示
sendcommandbyte(0x06);
//输入方式设置,不滚屏,0x07滚屏
2、写指令
3.写数据
voidsenddatabyte(ucharch)
RS=1;
RW=0;
P0=ch;
E=0;
delay
(1);
E=1;
delay(1000);
voidsendcommandbyte(ucharch)
RS=0;
//延时40us
如果在E=1后面延时之后再将E置0,则在初始化程序中只写一次0x38
4、指针
voiddisplay(uchar*p)
ucharcount;
//局部变量定义
sendcommandbyte(0xc0);
for(count=0;
count<
16;
count++)
senddatabyte(*p++);
main()
charcodemsg[16]="
liuhankan"
initlcd();
{display1(msg1);
十四电子表
1.只有第一个键按下其他按键才有效
case3:
if(TR0==1)
break;
shi++;
if(shi==24)
shi=0;
case4:
miao=0;
}
k=keyscan();
if(k!
=0xff)
switch(k)
case1:
TR0=!
TR0;
case2:
fen++;
if(fen==60)
fen=0;
2中断函数处理
voidtime0(void)interrupt1using1
//重装初值50ms
msecond++;
if(msecond==20)
msecond=0;
miao++;
//秒个位加1
if(miao==60)
{miao=0;
fen++;
if(fen==60)
{fen=0;
shi++;
if(shi==24)
{shi=0;
}}}}}
3、键盘扫描函数
if(!
k2)
{
delay(10);
if(!
{while(!
k2)display();
a=2;
gotopp1;
}
ucharkeyscan(void)
uchara,key;
P2=0xfe;
//让第一行为低电平
if(!
k1)//第一个按键按下
//延时去抖
k1)
{
while(!
k1)display();
a=1;
gotopp1;
}
{uchara,key;
十五点阵液晶屏
1.硬件设计要点
(1)芯片概述,管脚图,真值表
(2)功能
(3)典型电路
2.软件设计:
(1)概述,特点
(2)指令说明和时序
(3)典型子程序和程序流程
3.12864可以显示汉字4排,每排8个汉字,一个汉字=16行*16列=2页*16列,8行为一列,1个ASCII字符=16行*8列=2页*8列
4.管脚
R/W=0,硬件已经接地
CS1=1选中右半屏CS2=1选中左半屏
5.步骤
(1)初始化
(2)清内存
(3)显示
6.定义寄存器命令存储器
#defineDisp_On0x3f//定义显示开关开
#defineDisp_Off0x3e//定义显示开关关
#defineCol_Add0x40//设置Y的起始地址
#definePage_Add0xb8//设置起始页地址
#defineStart_Line0xc0//从哪一行开始
显示:
0011111(1/0)为0表示关,1表示开
显示起始行:
11(0…63)
设置X地址,页地址:
10111(0^7)
设置Y地址列:
01(0^63)
7.写命令
/*------------------写命令到LCD-----------------------------*/
voidwrite_com(unsignedcharcmdcode)
//RW=0
Lcd_Bus=cmdcode;
delay
(2);
8.写数据
/*------------------写数据到LCD-----------------------------*/
voidwrite_data(unsignedcharDispdata)
//RW=0;
Lcd_Bus=Dispdata;
9.清内存
/*------------------清除内存-----------------------------*/
voidClr_Src()
ucharj,k;
CS1=1;
CS2=1;
write_com(Page_Add+0);
write_com(Col_Add+0);
for(k=0;
k<
k++)
{
write_com(Page_Add+k);
for(j=0;
j<
64;
j++)
write_data(0x00);
10.指定位置显示汉字
/*-------------------指定位置显示汉字16*16-----------------------*/
voidhz(ucharpag,ucharcol,uintss)//pag代表第几页;
col代表第几列,ss代表显示那个字。
ucharj=0,i=0;
ss=ss*32;
write_com(Page_Add+pag+j);
write_com(Col_Add+col);
write_data(HZ_Store[16*j+i+ss]);
11.文字从上往下移动
for(i=64;
CS1=1;
CS2=0;
//左屏
hz(0,0,0);
//中
hz(2,0,4);
//电
hz(0,16,1);
//华
hz(2,16,5);
//话
hz(0,32,2);
//人
hz(0,48,3);
//民
//hz(0,48,3);
//hz(0,48,3);
hz1(2,32,10);
//写“:
”
hz1(2,40,1);
//1
hz1(2,48,5);
//5
hz1(2,56,1);
//1
write_com(Disp_Off);
write_com(Page_Add+0);
write_com(Col_Add+0);
write_com(Start_Line+i);
//改变初始状态的行值,每来一次就改变一次
write_com(Disp_On);
12.初始化液晶屏
/*------------------初始化LCD屏--------------------------*/
voidinit_lcd()
delay(100);
write_com(Disp_Off);
write_com(Start_Line+0);
write_com(Disp_On);
十六I2C总线
1、I2C:
由数据线SDA和时钟总线SCL两条线构成的通信线路,既可以接收数据,也可以发送数据。
2、单片机向I2C写数据单片机读I2C数据
(1)开始
(1)开始
(2)写芯片地址
(2)写芯片地址
(3)应答(3)应答
(4)写芯片内部地址(4)写芯片内部地址
(5)应答(5)应答
(6)写数据(6)把写转换成读
(7)应答开始
(8)结束读芯片地址
应答
(7)读数据
(8)结束
3.I2C协议
(1)只有在总线空闲时才允许启动数据传送(两条线为高电平)
(2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,数据线的任何跳变都会被看作起始信号或停止信号
4.启动信号
SCL为高电平期间,SDA出现下降则为启动信号
/**********启动信号*************/
VoidStart()
{SDA=1;
delay();
SCL=1;
delay();
SDA=0;
5.寻址信号
芯片寻址:
AT24C02地址控制字1010A2A1A0R/W(R/W为0写,1读)
片内寻址