单片机原理与应用-基于AT89S51+Proteus仿真 第2版 课件 第4章 单片机的C语言程序设计_第1页
单片机原理与应用-基于AT89S51+Proteus仿真 第2版 课件 第4章 单片机的C语言程序设计_第2页
单片机原理与应用-基于AT89S51+Proteus仿真 第2版 课件 第4章 单片机的C语言程序设计_第3页
单片机原理与应用-基于AT89S51+Proteus仿真 第2版 课件 第4章 单片机的C语言程序设计_第4页
单片机原理与应用-基于AT89S51+Proteus仿真 第2版 课件 第4章 单片机的C语言程序设计_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理与应用第4章单片机的C语言程序设计内容指南本章主要介绍C51语言的数据结构和程序结构、C51语言的运算符与表达式、C51语言的函数等编程基础,在此基础上结合Keil

uVision编译调试环境和Proteus仿真设计环境,重点讨论了单片机并行I/O口的C51编程应用。学习目标掌握C51语言的数据结构和编程相关基础。熟悉KeiluVision编译调试环境和Proteus仿真设计环境的使用。掌握常用外设和单片机I/O的连接原理及编程方法。第4章单片机的C语言程序设计第4章单片机的C语言程序设计汇编语言能直接操作单片机的系统硬件,程序代码效率高。但其程序可读性差,且编写、移植困难。

C51是为51内核单片机设计的一种C语言,其特点:C51语言已成为51系列单片机程序开发的主流软件方法。结构化语言,代码紧凑——效率可与汇编语言媲美接近真实语言,程序可读性强——易于调试、维护库函数丰富,编程工作量小——产品开发周期短机器级控制能力,功能很强——适合于嵌入式系统开发与汇编指令无关,易于掌握——在单片机基础上上手快第4章单片机的C语言程序设计4.1C51语言的数据结构4.2C51语言的运算符与表达式

4.3C51语言的函数4.4C51的程序结构4.5C51开发调试环境4.6并行I/O口的应用编程

第4章单片机的C语言程序设计4.1C51的数据结构、C51的数据类型C51支持标准C中的基本数据类型,包括字符型char、整型int、长整型long和浮点型float。对整数类型,又可以分为signed(有符号数)和unsigned(无符号数)两种。若声明为signed,编译器会将整数部分的最高位解释为符号位。此外,根据51内核单片机存储结构的特点,C51增加了一些特有的数据类型,包括普通位类型bit、特殊功能寄存器可寻址位sbit、特殊功能寄存器sfr和sfr16。普通位类型bitAT89S51/S52单片机中,片内RAM地址0x20~0x2f共16个字节是可以位寻址的。因此,C51中专门规定了位变量类型来方便这部分内存的访问。在C51中,用关键词bit定义一个位变量,格式如下: bit

bit_name[=0或1]; 例如:bitdoor=0;//定义一个叫door的位变量且初值为0 可见与标准C的数据类型声明的语法规则是一致的。第4章单片机的C语言程序设计

特殊功能寄存器可寻址位sbit对于可位寻址的特殊功能寄存器,可以使用sbit关键字将特殊功能寄存器位声明为位变量以方便访问。C51提供了以下三种方法声明特殊功能寄存器位变量:(1)第1种方法

sbit

位名=特殊功能寄存器名^位置;(2)第2种方法

sbit

位名=字节地址^位置;(3)第3种方法

sbit

位名=位地址;第4章单片机的C语言程序设计例:

sfrPSW=0xD0;

sbitOV=PSW^2;

sbitOV=0xD0^2;

sbitOV=0xD2;第4章单片机的C语言程序设计特殊功能寄存器sfr和sfr16关键词sfr或sfr16用于定义SFR字节地址变量,格式如下:sfr

sfr_name=

字节地址常数;sfr16sfr_name=

字节地址常数;例如, sfrP0=0x80;//定义P0口地址80H

sfrPCON=0x87;//定义PCON地址87H sfr16DPTR=0x82;//定义DPTR的低地址82H第4章单片机的C语言程序设计第4章单片机的C语言程序设计2.C51的变量

在程序执行过程中,数值可以发生改变的量称为变量。变量的基本属性是变量名和变量值。变量名与存储单元地址相对应(变量名就是数据的符号地址),变量值与存储单元的内容相对应。例如第4章单片机的C语言程序设计【存储种类】

数据类型

【存储类型】

变量名;(标准C)(标准C)C51变量定义的四要素:(C51特有)(标准C+C51)括号项【】——可以缺省数据类型和变量名不能缺省要在C51程序中使用变量必须先对其进行定义。第4章单片机的C语言程序设计【存储种类】

数据类型

【存储类型】

变量名存储种类用于说明变量的作用范围:1、auto(自动型)——变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。2、extern(外部型)——在一个源文件中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。3、static(静态型)——利用static可使变量定义所在的函数或语句块执行结束后,其分配的内存单元继续保留。4、register(寄存器型)——目前已不推荐使用。缺省存储种类为auto(自动)型变量第4章单片机的C语言程序设计数据类型用于表示数据存放格式,C51支持的基本数据类型与标准C相同:*有符号数类型可以忽略signed标识符【存储种类】

数据类型

【存储类型】

变量名C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit类型变量。用一条预处理命令#include<REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。第4章单片机的C语言程序设计第4章单片机的C语言程序设计编程举例:【存储种类】

数据类型

【存储类型】

变量名存储类型体现了变量的存放区域。51系列单片机共有6个存储类型(分布在3个逻辑存储空间中)。data区code区xdata区bdata区pdata区idata区第4章单片机的C语言程序设计不同存储类型的特点SMALL系统COMPACT系统LARGE系统编译模式第4章单片机的C语言程序设计三种编译模式分别对应于三种缺省存储类型:如果定义变量时省略存储类型,编译器会自动默认存储类型(由编译模式决定存储类型,默认SMALL模式)3种编译模式分别对应于3种缺省存储类型:第4章单片机的C语言程序设计【存储种类】

数据类型

【存储类型】

变量名C51编译器可根据当前采取的编译模式自动认定默认的存储类型约定:若无特殊声明,一般均为“SMALL编译模式”变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。【存储种类】

数据类型

【存储类型】

变量名第4章单片机的C语言程序设计C51扩展的若干关键字一览表

变量名不得使用标准C语言和C51语言的关键字。第4章单片机的C语言程序设计unsignedchardatasystem_status=0;

//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。数据结构定义举例变量名为system_status位与片内RAM区无符号字符型自动型初值为零第4章单片机的C语言程序设计unsignedcharbdata

status_byte;

unsignedintcodeunit_id[2]={0x1234,0x89ab};

staticcharm,n;

//定义status_byte为无符号字符型自动变量,该变量位于bdata区//定义unit_id[2]为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0x1234和0x89ab。//定义m和n为2个位于data区中的有符号字符型静态变量。第4章单片机的C语言程序设计3、C51的数组构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定第4章单片机的C语言程序设计一维数组的定义:数据类型数组名[常量表达式];

合法标识符表示元素个数例

inta[6];a[0]a[1]a[2]a[3]a[4]a[5]a编译时分配连续存储地址存储字节数=数组维数*

sizeof(元素数据类型)数组名是表示数组首地址的地址常量第4章单片机的C语言程序设计一维数组的初始化

inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数当全部数组元素赋初值时,可不指定数组长度

inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数注意:数组的下标是从0开始第4章单片机的C语言程序设计一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组引用形式:数组名[下标]其中:下标从0开始到n-1,不能越界,下标可以是变量、常量或整型表达式。例inta[10];

printf(“%d”,a);(

)必须for(j=0;j<10;j++)

printf(“%d\t”,a[j]);(

)第4章单片机的C语言程序设计数组元素也可以用指针来引用指向数组元素的指针变量例intarray[10];

int*p=&array[0](或int*p=array);array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]parray[i]

*(p+i)这里的*是取值运算符第4章单片机的C语言程序设计4、C51的指针

指针:一个变量的地址称为该变量的“指针”指针变量:存储变量地址(指针)的变量称为“指针变量”指针的值:某个变量在内存中的首地址指针的类型:该指针所指向的变量的类型直接访问(直接寻址):通过变量名来访问间接访问(间接寻址):通过变量的指针来访问第4章单片机的C语言程序设计指针指针变量指针的值指针的类型直接寻址间接寻址第4章单片机的C语言程序设计chara,b;char*p;p=&a;*p=10;b=*p指针有关的运算符*取值运算符&取地址运算符(直接寻址)(间接寻址)char*p=&a;标准C语言指针的一般定义形式为:

数据类型*指针变量名[=&被指向变量名];其中,数据类型说明了该指针变量所指向的变量的类型。第4章单片机的C语言程序设计例:int*pointer;//定义一个指向整型变量的指针变量pointer注意:指针变量名前的“*”号表示该变量为指针变量,但指针变量名是pointer而不是*pointer。

例:inta=’A’;int*p1=&a;这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址。对于C51,除了数据类型外,指针定义中还应包含以下信息:1)指针变量自身位于哪个存储区中?

2)被指向变量位于哪个存储区中?故C51指针的一般定义形式:数据类型[存储类型1]*[存储类型2]指针变量名[=&被指向变量名]数据类型——被指向变量的类型,如int型或char型存储类型1——被指向变量所在的存储区,缺省时由地址赋值关系决定存储类型2——指针变量所在的存储区,缺省时为编译器默认的存储区第4章单片机的C语言程序设计第4章单片机的C语言程序设计如缺省存储类型,C51编译器会根据当前编译模式默认存储类型,例如:

inta=’A’; int*p1=&a;这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址,而a和p1两个变量都位于C编译器默认的内存区中。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式1.算术运算符C51语言的运算符与表达式与标准C语言相同C51语言中的算术运算符有:+加法运算符-减法运算符*乘法运算符。/除法运算符。%模(求余)运算符。用算术运算符和括号将运算对象连接起来的式子称为算术表达式,其中的运算对象包括常量,变量,函数,数组等等。算术运算符的优先级规定为先乘除模,后加减,括号最优先。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式2.赋值运算符C51语言的运算符与表达式与标准C语言相同 在C51语言中,赋值运算符有两类,一类是基本赋值运算符“=”,一类是基本赋值运算符派生出来的复合赋值运算符,包括:+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=。 赋值运算符将运算符右侧操作数的值赋给左侧操作数或变量。复合赋值运算符则首先对变量进行某种运算之后再将运算结果赋给该变量。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式3.关系运算符C51语言的运算符与表达式与标准C语言相同C51的关系运算符有6种:<(小于)>(大于)<=(小于等于)>=(大于等于)==(等于)!=(不等于)前四种关系运算符(<,>,<=,>=)的优先级相同,后两种也相同;前四种优先级高于后两种。关系运算符的优先级低于算术运算符,高于赋值运算符。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式4.逻辑运算符C51语言的运算符与表达式与标准C语言相同C51的逻辑运算符有3种:&& 逻辑与(AND)|| 逻辑或(OR)! 逻辑非(NOT)逻辑与&&和逻辑或||是双目运算符,要求有两个运算对象;而逻辑非!是单目运算符,只要求一个运算对象。C51逻辑运算符与算术运算符、关系运算符、赋值运算符之间优先级的次序为:逻辑非!运算符优先级最高,关系运算符低于算术运算符但高于逻辑与&&和逻辑或||运算符,最低的是赋值运算符。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式5.位操作运算符C51语言的运算符与表达式与标准C语言相同 C51有如下位操作运算符: &按位与 |接位或 ^接位异或 ~按位取反 <<位左移 >>位右移除了按位取反运算符~以外,以上位操作运算符都是两目运算符,即要求运算符两侧各有一个运算对象。位运算对象只能是整型或字符型数,不能为实型数据。第4章单片机的C语言程序设计4.3C51语言的函数标准库函数:标准库函数是由C51编译器提供的,用户可直接调用C51库函数而不需为这个函数编写任何代码,只需要包含具有该函数说明的头文件即可。例如调用正弦计算函数sin(x)时,要包含数学运算库文件: #include<math.h>用户自定义函数:用户自定义函数是用户根据需要所编写的函数。从函数定义的形式分为无参函数、有参函数和空函数。中断函数:中断函数是C51所特有的,使用interrupt关键字可以将一个函数定义成中断服务函数。①预处理命令(文件包含、宏定义)全局变量定义、函数原型说明;②程序由函数组成,函数由局部变量定义和语句(程序体)组成;③程序从主函数开始执行,主函数中的所有语句执行完毕,则程序结束。④函数和变量都需遵循先定义后使用的基本原则;第4章单片机的C语言程序设计C51与标准C程序结构完全相同4.4C51的程序结构

函数原型声明C语言程序的结构特点:1.一个程序由一个或多个源程序文件组成小程序往往只包括一个源程序文件一个源程序文件中可以包括三个部分:预处理指令全局声明若干个函数#include<stdio.h>等全局变量及函数原型的声明每个函数用来实现一定的功能第4章单片机的C语言程序设计2.函数是C程序的组成部分一个C程序是由一个或多个函数组成的.必须包含一个main函数(且只能有一个).每个函数都用来实现一个或几个特定功能被调用的函数可以是库函数,也可以是自己编制设计的函数.第4章单片机的C语言程序设计3.一个函数包括两个部分:函数首部intmax(intx,

inty)函数的第1行函数类型函数名参数类型参数名若函数无参,在括弧中写void或空括弧函数体

{}括起来部分声明部分定义在本函数中所用到的变量执行部分:由若干个语句组成,指定在函数中所进行的操作;语句以;结束。第4章单片机的C语言程序设计4.程序总是从main函数开始执行5.C程序对机器的操作由C语句完成C程序书写格式是比较自由的一行内可以写几个语句一个语句可以分写在多行上为清晰起见,习惯上每行只写一个语句6.数据声明和语句最后必须有分号7.程序应当包含注释,增加可读性第4章单片机的C语言程序设计C程序格式特点:习惯用小写字母不使用行号,无程序行概念可使用空行和空格常用锯齿形书写格式main(){

inti,j,sum;sum=0;

for(i=1;i<10;i++){

for(j=1;j<10;j++){sum+=i*j;}}

printf(“%d\n”,sum);}优秀程序员的素质之一:使用TAB缩进{}对齐有足够的注释有合适的空行第4章单片机的C语言程序设计第4章单片机的C语言程序设计举例:LED闪烁控制功能LOOP:CLRP1.0ACALLDEL50SETBP1.0ACALLDEL50SJMPLOOPDEL50:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND30p30p第4章单片机的C语言程序设计预处理命令---------函数声明------------全局变量定义------

主函数------------自定义函数---------局部变量定义---------

程序体

程序体------将P1.0端口定义为p1_0位变量第4章单片机的C语言程序设计1、将Keil编译形成的*.hex文件加载到*.DSN文件中,通过proteus控制仿真运行(无法在运行过程中进行调试)在Keil

uVision进行程序开发调试的步骤我们在第一章进行了介绍。这里我们结合单片机仿真软件Proteus来说明仿真开发运行的两种方式。4.5C51的程序开发与仿真调试

第4章单片机的C语言程序设计2、在Keil软件里控制Proteus仿真运行(可以在运行过程中进行调试)步骤:下载()→运行()→停止()第4章单片机的C语言程序设计4.1C51语言的数据结构4.2C51语言的运算符与表达式

4.3C51语言的函数4.4C51的程序结构4.5C51开发调试环境4.6并行I/O口的C51编程应用第4章单片机的C语言程序设计基本输出元件:发光二极管(LightEmittingDiode)低电平驱动高电平驱动灌电流拉电流基本I/O设备与单片机的连接灌入的最大电流为

10mA

拉出的最大电流为

1mA

单片机输出低电平时驱动能力尚可,输出高电平时驱动能力很差。

基本输入元件:按钮(Button)或开关(Switch)第4章单片机的C语言程序设计当按键未按下压时,Px.n端口为高电平;按压按键后为低电平。【例4-1】如图4-11单片机I/O引脚连接一开关和一LED,编程实现K1合上时L1点亮,K1断开时L1熄灭(模拟开关灯)。

while(1) {L1=K1;}第4章单片机的C语言程序设计【例4-2】如图4-13,P0口低四位连接了4个按钮,P2口低四位连接了4个LED,开机时LED全熄,编程要求根据按键的动作使相应的灯亮,并将亮灯状态保持到按压其它键时为止。第4章单片机的C语言程序设计程序分析:为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。第4章单片机的C语言程序设计第4章单片机的C语言程序设计仿真运行效果【例4-3】如图4-14所示,8个发光二极管LED0~LED7经限流电阻分别接至P2口的P2.0~P2.7引脚上,阳极共同接高电平。编程来实现发光二极管的从上到下然后从下到上的流水点亮,重复循环。第4章单片机的C语言程序设计程序分析:此例中是将P2口循环送出的亮灯码构造为一个数组tab[],通过主函数中的循环控制变量i作为数组的下标来引用数组中的数据tab[i],依次送出到P2口。第4章单片机的C语言程序设计例4-4键控流水灯

第4章单片机的C语言程序设计【要求】K1为“启动键”,首次按压K1可产生“自下向上”的流水灯运动;K2为“停止键”,按压K2可终止流水灯的运动;

K3和K4为“方向键”,分别产生“自上向下”和“自下向上”运动。第4章单片机的C语言程序设计思路分析:设立状态变量→根据键值修改变量值→根据变量值控制灯的亮灭第4章单片机的C语言程序设计按键状态值:无按键——xxxx1111B按压K1——xxxx1110B按压K2——xxxx1101B按压K3——xxxx1011B按压K4——xxxx0111B按键动作判断——(P0&0x0f)是否等于0x0f?若是,说明无按键动作,反之则有按键动作。→0x0f→0x0e→0x0d→0x0b→0x07获取按键状态第4章单片机的C语言程序设计修改方向和启停标志值

switch语句是多分支选择语句,switch语句的一般形式如下:switch(表达式){ case常量表达式1:{语句1;}break; case常量表达式2:{语句2;}break;

…… case常量表达式n:{语句n;}break; default:{语句n+1;}}第4章单片机的C语言程序设计P2口亮灯编码:xxxx1110xxxx1101xxxx1011xxxx0111D1~D4循环方向控制

charled[]={0xfe,0xfd,0xfb,0xf7};for(i=0;i<=3;i++){P2=led[i];}//↓移动for(i=3;i>=0;i--){P2=led[i];}//↑移动查表方法第4章单片机的C语言程序设计if(表达式){语句1;}else{语句2;}相当于双分支选择结构voidmain(){bitdir=0,run=0;chari;while(1){switch(P0&0x0f){ //读取键值case0x0e:run=1;break; //K1动作,设run=1case0x0d:run=0,dir=0;break;//K2动作,设run=dir=0case0x0b:dir=1;break; //K3动作,设dir=1case0x07:dir=0;break;}//K4动作,设dir=0

if(run) //若run=dir=1,自上而下

if(dir)

for(i=0;i<=3;i++) {P2=led[i]; delay(200); }else //若run=1,dir=0,自下而上

for(i=3;i>=0;i--) {P2=led[i]; delay(200);}elseP2=0xff; //若run=0,灯全灭}}#include"reg51.h"unsignedcharled[]={0xfe,0xfd,0xfb,0xf7};voiddelay(unsignedchartime){unsignedintj=15000;

for(;time>0;time--)

for(;j>0;j--);}程序运行效果第4章单片机的C语言程序设计第4章单片机的C语言程序设计LED数码管原理与应用

LED显示元件——人机交互输出设备,其作用是指示中间运行结果与运行状态。点式字段式点阵式光柱式LED的类型第4章单片机的C语言程序设计引脚配置七段式LED数码管(Proteus:7-SegmentDisplay)共阳极型共阴极型公共端接“0”公共端接“1”字符的显示码或字模与数码管的类型有关第4章单片机的C语言程序设计显示字符dpgfedcba字型码共阴极共阳极0001111113FC010000011006F92010110115BA43010011114FB040110011066995011011016D926011111017D8270000011107F88011111117F809011011116F90第4章单片机的C语言程序设计【例4-5】如图4-19所示,在P0口连接一个共阴极数码管,编程使数码管循环显示0~9数字。分析:将显示码循环输出到P0口即可实现循环显示。但由于数字0~9的显示段码没有规律可循,需要采取查表方式进行操作:第4章单片机的C语言程序设计①将显示码按序存放在一个数组中,顺序号与代表的显示字符相对应(如,charled_mod[]={x1,x2,….,xn);②通过查表语句(如,P0=led_mode[i])输出显示码。第4章单片机的C语言程序设计参考程序第4章单片机的C语言程序设计仿真运行效果第4章单片机的C语言程序设计【例4-6】计数显示器根据如下共阴极型数码管电路,编程实现计数显示功能,即以十进制形式显示击键次数,次数大于99后重新由0开始。个位LED接P2口,十位LED接P0口按钮接P3.2,抬起时为1电平,按压时为0电平。第4章单片机的C语言程序设计编程分析:两个问题:1:如何将计数值拆解成个位和十位两个数?2:如何避免按键压下时被连续计数?第4章单片机的C语言程序设计初始化:P2=P0=table[0];取模运算(%10)→个位整除10运算(/10)→十位P2=table[count%10];P0=table[count/10];拆解计数值方法:第4章单片机的C语言程序设计避免连续计数——等待按键释放时才统计一次计数第4章单片机的C语言程序设计参考程序程序运行效果

第4章单片机的C语言程序设计第4章单片机的C语言程序设计按键在闭合和断开瞬间会因弹簧开关的变形产生电压波动软件消抖法:延时10ms后再次扫描按键状态。若仍判为“闭合”说明确有键压下;若为“非闭合”说明是误动作。按键抖动波形键盘消抖原理:

第4章单片机的C语言程序设计消抖实例:

第4章单片机的C语言程序设计矩阵式键盘原理与编程独立式键盘的电路简单,易于编程,但占用的I/O口线较多。独立式键盘电路第4章单片机的C语言程序设计矩阵式键盘——将I/O口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。4×4行列式键盘矩阵式键盘的特点:占用I/O口线少,但程序复杂。识键:把所有行线P3.0~P3.3均置为低电平,然后检查各列线的状态,若列线不全为高电平,则表示键盘中有键按下;若所有列线列均为高电平,说明键盘中无键按下。译键:依次将行线置为低电平,并逐列检查各列线的电平状态。若某列为低,则该列线与行线交叉处的按键就是闭合的按键。矩阵键盘扫描处理过程分两步:●识键:确定是否有键按下。●译键:在有键按下时识别哪一个键被按下并确定相应键值。第4章单片机的C语言程序设计第4章单片机的C语言程序设计【例4-7】如图所示的矩阵式键盘,功能要求:开机黑屏→按下任意按键后,数码管上显示该键的键号(0~F)→若没有新键按下,维持前次按键结果。第4章单片机的C语言程序设计主函数:voidmain(void){charkey=0; P0=0x00; //开机黑屏

while(1){ key=getKey(); //获得闭合键号

if(key!=-1)P0=led_mod[key]; //显示闭合键号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论