内容正文:
工作模块2:LED灯显示控制
同学们,大家好!上一讲我们学习了矩阵键盘识别原理,并绘制了接口电路,今天我们利用矩阵键盘实现数字键盘的功能
1
工作模块1:目录
2.4 C51的文档结构
2.5 C语言基本结构
LED 灯显示控制
任务2-1 LED灯闪烁
任务2-2 8个LED灯
流水控制
2.1单片机的并行I/O口使用
2.2 LED灯显示电路的硬件设计
2.3 单片机的编程语言
2.6 数据类型及常量变量
2.7 C51运算符
2.8 函数使用
任务实施
知识链接
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
目录
2.1. LED灯闪烁控制的电路图
单片机的并行IO口使用。
2.2.LED灯显示电路的硬件设计
2.3.单片机的编程语言
2.4.C文档结构
任务2-1 LED灯闪烁控制
矩阵键盘程序设计总体思路:单片机采用编程扫描法来监视键盘的输入,采用反转法获取键值。
具体编程步骤如下:
任务2.1 LED灯闪烁控制电路
序号 元件名称 元件型号 元件参数
1 单片机 AT89C52
2 瓷片电容 CAP 30pF
3 电解电容 CAP-ELEC 22uF
4 晶振 CRYSTAL 12MHZ
5 按键 BUTTON
6 发光二极管红 LED-RED
7 电阻 RES 10k、470
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1LED灯闪烁控制电路
LED闪烁电路所用电子元器件
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1单片机I/O口应用
输入/输出端口
四个双向并行I/O端口:
P0.0~P0.7
P1.0~P1.7
P2.0~P2.7
P3.0~P3.7
共32条线
XTAL2
XTAL1
EA
ALE
PSEN
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1 P0口应用
(1)作为通用I/O口使用时,由于P0口内部电路是漏极开路,当需要输出高电平时,需要外接上拉电阻。使用时区分
读引脚:需要先在端口写入1,即P0=0xff。
读端口:是为了适应对I/O口进行“读-修改-写”操作语句的需要。例如,C51语句:P0=P0&0x0f; //&按位取“与”,将P0口的高4位引脚清零后输出。
读端口是由CPU自行完成的,在编程方面无须做前期处理。
(2)在进行单片机系统扩展时,P0可以作为“低位地址/数据”线分时复用,P0口是具有高电平、低电平和高阻抗3种状态的端口。因此, 是一个真正的双向端口, 简称双向口。
(3)每个引脚能驱动8个TTL负载,
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1 P1口应用
通用I/O口:P1端口是一个带内部上拉电阻的8位准双向I/O端口。P1端口的每一位都可驱动4个TTL负载,读引脚时,需要先向端口写入1,即P1=0xff;。
小提示:准双向口,是说具备双向工作的能力,由于内部电路的结构,不具备高阻态。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1 P2口应用
(1) 作为通用I/O口使用:P2端口的每一位都可驱动4个TTL负载,读引脚时,需要先向端口写入1,即P2=0xff;。
(2)高8位地址线使用:P2端口在访问外部程序存储器或16位地址的外部数据存储器时,P2送出高8位地址数据,与P0口的低8位地址数据共同组成16位地址总线,可寻址64KB地址空间,当P2口作为高8位地址总线口使用时,就不能再作为通用I/O口使用。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1 P3口应用
作为通用I/O口使用:P3端口是一个带内部上拉电阻的8位准双向I/O端口。P3端口的每一位都可驱动4个TTL负载,读引脚时,需要先向端口写入1,即P3=0xff;P3端口除作为一般I/O外,还具有复用功能。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1 P3口应用
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.1 I/O应用总结
任一I/O口都可独立作I/O使用,但P0和P2访问外部存储器时,将不能作通用I/O口用;
1
I/O口作为输入时,必须通过程序输出1;
2
P1、P2、P3为“准双向口”,无需外接上拉电阻;
3
P0口没有内部上拉电阻,作输入时需外接上拉电阻。
4
01
02
1
2
03
04
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.2 LED灯显示电路的硬件设计
发光二极管简称LED灯(Light Emitting Diode),主要由红色、绿色、黄色和蓝色,是半导体二极管的一种,具备单向导电性,即正向偏置导通,反向偏置截止。
式中 U——LED电路电压,
ULED 为LED管压降;
推荐值为:R=(5V-1.8V)/10mA=320Ω;
一般选择470Ω~1KΩ电阻。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.2 LED灯显示电路的硬件设计
51单片机输出低电平时,驱动能力很强,可达20mA~50mA;输出高电平时,驱动能力弱,电流在5mA以下。
a图灌电流 b 拉电流
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.3 单片机编程语言
大致分成三类:机器语言、汇编语言、高级语言。
机器语言
汇编语言
高级语言
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.4 C文档组成
在C语言程序中,子程序的作用是由函数来实现的,函数是C语言的基本组成模块,一个C语言程序就是由若干个模块化的函数组成的。
C程序都是由一个主函数main( )和若干个子函数构成,有且只有一个主函数,程序由主函数开始执行,主函数根据需要来调用其他函数,其它函数可以有多个。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.2 LED灯显示电路的硬件设计
//任务2-1 点亮一个LED灯 //注解符号
#include<reg51.h> //预编译命令
sbit P1_0=P1^0; //定义可寻址位
void delay(); //函数的声明
void main() //主函数
{ while(1)
{ P1_0=0; //点亮1个LED灯
delay();
P1_0=1; //LED灯熄灭
delay(); }}
void delay() //延时子函数
{ unsigned int i;
for(i=0;i<50000;i++);}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
任务2-2 8个LED灯流水控制
2.5 C语言基本结构
第三步
掌握程序架构
第二步
第一步
函数编写
语句实现
单片机编程技巧
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
任务2-2 8个LED灯流水控制
2.5 C语言基本结构
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——表达式语句
表达式语句是最基本的C语言语句。
表达式语句由 “表达式”加上分号“;”组成,其一般形式如下:
P1_0=0;//赋值语句
在 C 语言中有一个特殊的表达式语句,称为空语句。
空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。
在C51程序中常常把空语句作为循环体,用于消耗CPU时间等待事件发生的场合。
如:for(j=0;j<255;j++);
while(1);程序设计时,通常把该语句作为停机语句使用;
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——复合语句
把多个语句用大括号{}括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合而成的语句块称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。{}内部的各条语句都必须以“;”结尾,在“}”之外,不能加“;”。
void main()
{ //函数体的复合语句开始
while(1) { //while循环体的复合语句开始
P1_0=0;
delay(10);
P1_0=1;
delay(10); //注意:复合语句的各条语句都必须以“;”
} 结尾,在“}”之外,不能加“;”
}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——复合语句
把多个语句用大括号{}括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合而成的语句块称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。{}内部的各条语句都必须以“;”结尾,在“}”之外,不能加“;”。
void main()
{ //函数体的复合语句开始
while(1) { //while循环体的复合语句开始
P1_0=0;
delay(10);
P1_0=1;
delay(10); //注意:复合语句的各条语句都必须以“;”
} 结尾,在“}”之外,不能加“;”
}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——循环语句
while语句用来实现“当型”循环,
执行过程:首先判断表达式,
当表达式的值为真(非0)时,
反复执行循环体。为假(0)时
执行循环体外面的语句。
循环体
循环继续的条件表达式
下一条语句
非0(真)
0(假)
循环体语句组
while执行过程
格式:while(循环继续的条件表达式)
{ 语句组; }
花括号不能丢掉!
请问:下述程序实现了什么功能?
main( )
{ int i,sum=0;
while(i<=5)
{ sum=sum+i;
i++; }
}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——循环语句
do-while语句用来实现“直到型”循环
执行过程:先无条件执行一次循环体,
然后判断条件表达式,当表达式的值
为真(非0)时,返回执行循环体直
到条件表达式为假(0)为止。
绝对不能少分号!
循环体
格式:do
{ 循环体语句组;
} while(循环继续条件);
花括号不能丢掉!
循环继续的条件表达式
下一条语句
非0(真)
0(假)
循环体语句组
请问:下述程序实现了什么功能?
main( )
{ int i,sum=0;
do
{ sum=sum+i;
i++;
}while(i<=100);
}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——循环语句
总循环次数已确定的情况下,可采用for语句形式为:
for语句的一般形式:
for(循环变量赋初值;循环继续条件;循环变量增值 )
{ 循环体语句组;}
分隔符为分号
请问:下述程序实现了什么功能?
main( )
{ int i,y=0;
for(i=1;i<=10;i++)
{ y=y+i; }
}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——选择语句
基本if语句的格式如下:
if (表达式) { 语句组;}
注意:在if语句中,“表达式”必须用括号括起来。在if语句中,花括号“{ }”里面的语句组如果只有一条语句,可以省略花括号。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——选择语句
if-else语句的一般格式如下:if (表达式)
{
语句组1;
}
else
{
语句组2;
}
if-else语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组1”,否则执行“语句组2”
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——选择语句
if-else-if语句是多个条件分支的选择,其一般格式如下:
if (表达式1)
{ 语句组1; }
else if (表达式2)
{语句组2; }
…
else if (表达式n)
{语句组n; }
else
{语句组n+1;}
图2-14 if-else-if语句执行流程
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.5 C语言基本结构——选择语句
多分支选择的switch语句, 其一般形式如下:
switch(表达式)
{
case常量表达式1: 语句组1;break;
case常量表达式2: 语句组2;break;
……
case常量表达式n: 语句组n;break;
default : 语句组n+1;
}
该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同,则执行default后的语句组。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
关于数据类型的含义:
1.不同类型数据在内存中占不同的存储空间,且采取不同的存储形式。
2.不同类型数据对应不同的取值范围。
3.数据类型确定了允许对其进行的操作。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
数据类型名称 数据类型符 占用字节数 所占位数 数的表示范围
无符号(短)整型 unsigned int 2B 16 0~65535
有符号(短)整型 signed int 2B 16 -32768~32767
无符号长整型 unsigned long 4B 32 0-4294967295
有符号长整型 signed long 4B 32 -2147483648~2147483647
无符号字符型 unsigned char 1B 8 0~255
有符号字符型 signed char 1B 8 -128~127
单精度实型 float 4B 32 ±1.175494E-38~3.402823E+38
位型 bit 1bit 1 0或1
指针型 * 1~3B 8~24 对象的地址
可寻址位 sbit 1bit 1 0或1
专用寄存器 sfr 1B 8 0~255
16位专用寄存器 sfr16 2B 16 0~65535
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
例:数据类型 变量名
char n1;
unsigned char x;
int i;
注意:变量名不能用C语言中关键字表示,如:int、for、char等;写unsigned,默认为是有符号型。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
标识符
定义:用来标识变量、常量、函数等的字符序列
组成:
只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线
大小写敏感
不能使用关键字
长度:最长32个字符
命名原则:
见名知意
不宜混淆 如l与I, o与0
例:判断下列标识符号合法性
dec DEc M.D.Tom Date 3days student_name #33 char a>b $123 _x1
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
在程序执行过程中,其值不发生改变的量称为常量。常量区分为不同的类型,有整型常量、实型常量、字符常量和字符串常量。
常量类型 具体类型 表示形式 说明
整型常量 八进制整常数 ○12 八进制数12
十六进制整常数 0x1A;0X1A 十六进制数1A
十进制整常数 34;34L 十进制数34(占16位);长整型数34(占32位)
实型常量 十进制形式 0.0,.25,5.789 0~ 9和小数点组成小数点前面的0可以省略
指数形式 2E5 3.7E-2 等于2*105等于3.7*10-2
字符常量 字符型 ‘b’‘5’ 字符b,字符5
转义字符型
回车换行,具体见表2.8
字符串常量 字符串常量 "CHINA" 在内存中存的是C-H-I-N-A-\0
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
符号常量:用标识符代表常量
定义格式: #define 符号常量 常量
如 #define NUM 30
#define NUM 30
void main()
{
int total;
total=NUM*5
}
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
字符常量:定义:用单引号括起来的单个普通字符或转义字符.
字符常量的值:该字符的ASCII码值
转义字符 转义字符的意义 转义字符 转义字符的意义
回车换行 \\ 反斜线符( \ )
\t 横向跳到下一制表位置 \' 单引号符
\v 竖向跳格 \” 双引号符
\b 退格 \a 鸣铃
\r 回车 \ddd 1~3位八进制数所代表的字符
\f 走纸换页 \xhh 1~2位十六进制数所代表的字符
如 ‘A’——65, ‘a’——97,
‘0’——48 , ‘
’——10
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
字符串常量
定义:用双引号(“”)括起来的字符序列
存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志(字符串用数组表示)
字符常量与字符串常量不同
t h a n k \0
例 字符串“thank”在内存中
a
a \0
例 ‘a’
“a”
例 空串 “”
\0
例: char ch;
ch=‘A’;
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
在程序执行过程中,取值可变的量称为变量。一个变量必须有一个名字,在内存中占据一定的存储单元,在该存储单元中存放变量的值。变量使用时则必须作强制定义即“先定义,后使用”。
变量定义的完整形式为:
【存储类型】数据类型 【存储器类型】变量名...;
(1)存储类型说明符
auto 自动变量 (动态存储区)
register 寄存器变量(动态存储区)
extern 外部变量(CPU的通用寄存器)
static 静态变量(静态存储区)
小贴士:
静态存储变量:在程序执行时,定义时指定的存储单元一直保持不变,直到程序结束。
动态存储变量:在程序执行时候;使用时才分配内存单元,使用完毕后立即释放,再使用再分配。从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
自动变量
把存储类型符auto加在变量名前,变量就是自动变量。自动变量只能在函数内说明;auto可以省略。在不同函数中说明的自动变量,可以使用相同的名字,它们的类型可以相同,也可以不同。
寄存器变量
把数据存放在寄存器里,操作起来比内存里快。比如:register int x;就把变量x定义为一个寄存器型的整型变量,存放在CPU的一个通用寄存器中。现在程序中极少使用寄存器型变量。
外部变量
把存储类型符extern加在变量名及其类型前面,该变量就成为一个外部变量。凡是在函数外部定义的变量都是外部变量。
静态变量
把存储器类型符static加在变量名及其类型前面,该变量就成为静态变量。例如:static int i;在整个程序运行期间,静态变量一直占据分配给它的存储区不予归还,直到程序运行结束。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
存储器类型
C51编译器支持的存储器类型见表所示。
C51编译器支持的存储器类型
存储器类型 描述
data 直接访问内部数据存储器,允许最快访问(128B)
bdata 可位寻址内部数据存储器,允许位与字节混合访问(16B)
idata 间接访问内部数据存储器,允许访问整个内部地址空间(256B)
pdata “分页”外部数据存储器(256B)
xdata 外部数据存储器(64KB)
code 程序存储器(64KB)
变量定义的完整形式为:
【存储类型】数据类型 【存储器类型】变量名...;
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.6 C51数据类型及常量变量
变量名
变量的名字是一种标识符,它必须遵守标识符的命名规则。习惯上变量名用小写字母表示,以增加程序的可读性。必须注意的是大写字符和小写字符被认为是两个不同的字符。
例如:int a,b,c; //定义整型变量a,b.c,自动变量,auto省略了。
unsigned char i=‘A’; //定义无符号字符型变量i,同时赋初值字符“A”;
说明:
1)允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。
2)最后一个变量名之后必须以“;”号结尾。
3)变量定义必须放在变量使用之前,一般放在函数体的开头部分。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.7 C51运算符
符号 说明 运算对象个数 举例 含义
+ 加法运算 双目 x=y+z; y+z的结果赋值给x
- 减法运算 双目 x=y-z; y-z的结果赋值给x
* 乘法运算 双目 x=y*z; y×z的结果赋值给x
/ 除法运算 双目 x=y/z; y÷z的结果赋值给x
% 取余运算 双目 x=y%z ; y÷z的余数赋值给x,如5%2的结果是1
++ 自增1 单目 i++; i自身加1
-- 自减1 单目 i--; i自身减1
算术运算符
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.7 运算符
赋值运算符
符号 说明 运算对象个数 举例 含义
= 基本赋值 双目 x=y+z; y与z的和赋值给x
+= 加赋值 双目 x+=1; x=x+1;
-= 减赋值 双目 x-=1; x=x-1;
*= 乘赋值 双目 x*=2; x=x*2;
/= 除赋值 双目 x/=2 ; x=x/2;
%= 模赋值 双目 x%=2 ; x=x%2;
<<= 左移位赋值 双目 x<<=1; x变量整体先左移1位,再赋值给x;
>>= 右移位赋值 双目 x>>=1; x变量整体先右移1位,再赋值给x;
&= 位与赋值 双目 x&=0xf0; 做位与操作后赋值
|= 位或赋值 双目 X|=0xf0; 做位或操作后赋值
^= 异或赋值 双目 X^=0xf0; 做位异或操作后赋值
~= 取反赋值 双目 x~=x; 做位取反操作后赋值
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.7 运算符
关系运算符
符号 说明 运算对象个数 举例 含义
< 小于 双目 x<y; x是否小于y;
<= 小于等于 双目 x<=y; x是否小于等于y;
> 大于 双目 x>y; x是否大于y;
>= 大于等于 双目 x>=y; x是否大于等于y;
== 等于 双目 x==y x是否等于y
!= 不等于 双目 X!=y x是否不等于y
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.7 运算符
逻辑运算符
符号 说明 运算对象个数 举例 含义
! 逻辑非 单目 !a; A为非0时,!a为假;a为0时,!a为真;
&& 逻辑与 双目 x&&y x,y都为真时,才为真
|| 逻辑或 双目 X||y x,y有1个为真时,就为真
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.7 运算符
位运算符
符号 说明 运算对象个数 举例 含义
& 按位逻辑与 双目 0x23&0x0f=0x03; 屏蔽0x23的高四位,保留低四位;
| 按位逻辑或 双目 0x23|0x0f=0x2f; 0x23保留高四位,置1低四位;
~ 按位取反 单目 x=~0x23; x=0xd2;
^ 按位异或 双目 0x23^0x0f=0x2c 异或运算:相同出0,相异出1
<< 按位左移 双目 x<<2; 高位丢弃,低位补0若x=0x01,移位后为0x04
>> 按位右移 双目 x>>2; 高位补0,低位丢弃若x=0x10,移位后为0x04
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.7 运算符
指针和地址运算符
符号 说明 运算对象个数 举例 含义
* 提取变量的内容 单目 nx=*a; 提取地址a的内容赋值给nx
& 提取变量的地址 单目 Ny=&b; 提取变量b的地址赋值给Ny
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.8 函数
1.标准库函数
由C51编译器提供,用户不必定义可以直接调用。在C51编译环境中,以头文件的形式给出。
eg:math.h、stdio.h
函数的分类
2.用户自定义函数
用户根据需要自行编写的函数,它必须先定义之后才能被调用。
eg:delay();
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.8 函数
函数定义的一般形式是:
函数类型 函数名(形式参数表)
{
局部变量定义;
函数体语句;
return语句;
}
其中,“函数类型”说明了自定义函数返回值的类型。
“函数名”是自定义函数的名字。
“形式参数表”给出函数被调用时传递数据的形式参数,形式参数的类型必须要加以说明。圆括号不能省略。
“局部变量定义”是对在函数内部使用的局部变量进行定义。
“函数体语句”是为完成函数的特定功能而设置的语句。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.8 函数
函数调用的形式:
函数名(实际参数表);
注意:
函数调用时提供的实际参数(简称实参)应与被调用函数的形式参数按顺序一一对应,而且参数类型也要一致。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.8 函数
(1)delay(200);
(2)c=2*max(a,b);
(3)m=max(a,max(b,c));
总结:
函数调用可以作为一个独立的语句,也可作为表达式或一个运算量。
函数调用方式
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.8 函数
return 语句使用说明
(1)reutrn语句格式: return 表达式;
或return( 表达式);
(2)return语句功能:返回调用函数,并将“返回值表达式”的值带给调用函数。
(3)若不需要带回函数值:将函数定义为void型,否则需要有返回语句。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
2.8 函数
#include:有两种方式可以指定插入头文件
#include <文件名>:
直接到系统指定的目录下查找该文件;
#include "文件名":
先在当前目录查找有无该头文件,有则包含该目录下的头文件,没有则到系统指定的目录下找该头文件。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
任务2.3 调试
RST:复位命令;
Run(F5):全速运行。一般与断点配合使用,执行时程序能够从当前行连续运行到断点处,节省调试时间。但无法观察某条语句或某段语句的运行结果。
Stop:停止运行。在无断点设置的程序中,当执行run时, stop键就会激活。
Step(F11):单步跟踪调试。每按一次,黄色箭头向下移动一句,系统就执行一句。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
任务2.3 调试
Step Over(F10):单步运行调试。每按一次,黄色箭头向下移动一句,系统就执行一句。与Step命令的不同是:Step命令可以跟踪到函数内部执行,而StepOver只是把函数作为一个语句执行。
Step out(ctrl+F11):跳出当前函数。当进入函数内部执行时,按此命令,可以结束当前函数的运行。
Run to cursor line(ctrl+F10):全速运行至光标处。与断点调试相比,断点调试有记忆功能,当再次重复调试程序时,每当程序运行到断点处都会停止在该断点处。此方法特别适用于循环程序的调试。根据需要可以在程序中设置多个断点。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
再 见
同学们,大家好!我是主讲教师杨敬娜。上一讲我们学习了矩阵键盘识别原理,并绘制了接口电路,今天我们利用矩阵键盘实现数字键盘的功能
56
�
语句组
表达式
真(非0)
假(0)
�
语句组1
表达式
真(非0)
语句组2
假(0)
$$