首页 理论教育单片机多语言编程:I/O接口输出操作

单片机多语言编程:I/O接口输出操作

【摘要】:程序点评:数据传送指令MOV将一组数据分别传送到P1口,做了输出口的操作。将8位立即数传送给累加器A,再由累加器A将数据传送到I/O接口的P1口,使P1.0灯亮。在I/O接口输出操作时不能将间接寄存器中的地址输出到P1口。

1.【例3-1】 8个灯依次循环闪烁源程序

2.源文件的建立与汇编

用原指令编写的程序(源文件),要在单片机上运行首先要进行汇编,汇编的目的是将汇编程序(用助记符写的程序)编译成能在单片机上运行的机器码程序。汇编分为手工汇编和计算机软件汇编。手工汇编已经在第二章中反复使用。本章原指令汇编语言使用的是计算机软件汇编。计算机汇编软件是集成在Keil C51 V6.12集成开发环境(IDE)内。Keil C51 V6.12 IDE的使用方法、步骤已在第一章中详细介绍过。读者可将例3-1中的程序在IDE软件上建立源文件并进行汇编,在确定无汇编错误、无警告后,生成后缀为.hex的文件,汇编过程即告完成。如果源程序有语法错误,应按信息栏指示的错误地点对源程序进行修改、汇编,重复以上步骤,直到无语法错误为止。汇编软件只能找出程序中的语法错误,对程序设计中的逻辑错误是无能为力的。Keil C51对程序中出现的语法错误有很强的查错能力,可指出错误的行号及错误内容。

3.下载源程序到目标机

STC-ISP V483.EXE是宏晶科技公司给用户提供的下载专用软件。将汇编后的源程序下载到单片机中的具体方法、步骤已在第一章中详细介绍过。完成单片机与计算机连接后,按照下载步骤逐步完成后,程序自动转入执行用户程序。

4.标点符号处理

编辑时标点符号是在英文界面下的,字母大小写均可。另存为后指令、注释要逐条变成绿色字体。有些指令(助记符)后仅有一个空格有效。汇编产生错误时要注意检查标点符号。

实例程序运行效果:在完成了源文件建立、汇编、下载的步骤后,单片机自动运行该程序。安装在P1口的8个发光二极管从P1.0位开始到P1.7位逐一循环闪烁。

程序点评:数据传送指令MOV将一组数据分别传送到P1口,做了输出口的操作。

说明:若是应用复制粘贴的方法将该程序内容粘贴在Keilμ Vision2 IDE软件中使用,则要将word文档下的分号改成英文输入状态下的分号。汇编时注释部分要变成绿色,指令变成蓝色。另外,还要注意语句中不能随便加空格,特别要区分字母“O”与数字“0”的书写。

实例中十六进制数据对应的二进制数据分别是:FFH—11111111B;FEH—11111110B;FDH—11111101B;FBH—11111011B;7FH—11110111B;EFH—11101111B;DFH—11011111B;BFH—10111111B;7FH———01111111B。

5.程序学习

(1)数据传送指令MOV

单片机内部的数据传送包括寄存器、累加器、RAM单元以及专业寄存器之间的数据相互传送,下面结合本款单片机提供的硬件将常用的几种重点介绍(寄存器、累加器、RAM单元、专业寄存器以及指令中符号意义请参看本章第六节相关内容)。

【例3-2】 将8位立即数传送给累加器A,再由累加器A将数据传送到I/O接口的P1口,使P1.0灯亮。

当8位立即数“#0FEH”的高一位十六进制数是字母时要在前面加“0”。

【例3-3】 将8位立即数传送给芯片内部RAM用户区某个地址,再由RAM用户区某地址将数据传送到I/O接口的P1口,使P1.0灯亮

注意区别“#0FEH”与“40H”的不同,前面有“#”号的是立即数,无“#”号的是地址。另外,芯片内部RAM用户区地址为30~7FH。

【例3-4】 将8位立即数传送给通用寄存器Rn中的R1,再由R1送给累加器A,由累加器A将数据传送(输出)到I/O接口的P1口,使P1.0灯亮

通用寄存器Rn=R0~R7。通用寄存器Rn在芯片RAM内部共有四组。一般使用的是第一组,另外三组如何使用参见本章第六节。

通用寄存器Rn中的数据不能直接传送到I/O接口。

【例3-5】 将8位立即数传送到单片机内部RAM用户区某个地址(如3AH)中,再把该地址保存到间接寄存器R1。再将间接寄存器R1地址中的数据送给累加器A,由累加器A将数据传送到I/O接口的P1口,使P1.0灯亮

间接寄存器Ri,i=0,1。间接寄存器内部存放的是地址。使用间接寄存器时先要把数据存放在地址中,在把地址存放在间接寄存器中。在I/O接口输出操作时不能将间接寄存器中的地址输出到P1口。(www.chuimin.cn)

【例3-6】 将8位立即数传送到单片机内部RAM用户区地址40h,再将该地址中的数据传送到芯片内部RAM用户区的地址45H中,最后从45H中将数据传送到I/O接口的P1口,使P1.0灯亮

【例3-7】 将8位立即数传送到通用寄存器Rn中,再由通用寄存器Rn把数据传送到单片机内部RAM用户区地址45H中,然后从内部RAM用户区地址45H中将数据传送到I/O接口的P1口,使P1.0灯亮

【例3-8】 将8位立即数传送到单片机内部RAM用户区某地址保存,再将此数据传送到通用寄存器Rn,再由通用寄存器Rn传送到累加器A,再从累加器A传送到I/O接口的P1口,使P1.0灯亮

通用寄存器Rn中的数据不能直接传送到I/O接口。

【例3-9】 将8位立即数通过累加器与单片机内部RAM用户区地址间的相互传送,最后传送到I/O接口使P1.0灯亮

【例3-10】 将8位立即数通过累加器A与单片机内部RAM用户区地址间的相互传送,最后传送到I/O接口使P1.0灯亮

【例3-11】 将8位立即数在通用寄存器Rn与累加器A之间相互传送,并使P1.0灯亮

【例3-12】 将8位立即数在通用寄存器Rn与累加器A之间相互传送,并使P1.0灯亮

实例程序运行效果:以上实例在完成了源文件建立、汇编、下载的步骤后,单片机自动运行该程序。安装在P1口的P1.0位发光二极管点亮。

程序点评:尽管上述的实例都用数据传送指令MOV将同一立即数传送到P1口,但方法各不相同。

(2)子程序调用LCALL与返回RET指令

子程序结构是一种重要的程序结构。在程序中常将一段反复使用的程序设计成子程序结构。通过子程序调用来使用子程序,使用完毕后再返回主程序。子程序调用LCALL与返回RET指令是一对命令。使用时调用指令LCALL后要写出子程序段的标号,而子程序的最后要返回RET指令。

(3)伪指令ORG

表明汇编程序的起始地址。在例3-1中共有两段程序,主程序从0030H地址开始,子程序从0200H地址开始。

(4)伪指令END

伪指令END是汇编语言源程序结束标志。

(5)程序标号“START”和“T05S”

在例3-1中一共有两段程序,主程序从程序标号“START”开始,子程序从标号“T05S”开始。

6.程序存储器数据传送指令组

程序存储器包含内外两部分存储器。对于程序存储器只能读不能写,从程序存储器读出的数据只能向累加器A传送。其主要作用是用于访问程序存储器中的数据表格,查表。

【例3-13】 变址寻址转移指令

其他程序、指令将在后续章节中讲述。