keil汇编程序设计实例
- 格式:ppt
- 大小:249.46 KB
- 文档页数:27
Keil创建一个汇编程序的步骤1、在C盘新建文件夹“实验一”,启动Keil2、建立一个新工程,单击Project菜单,在弹出的下拉菜单中选中NewProject选项,如图1 - 1所示。
Fih Edit Yi的'■■ 1 ■ ■project Bebu( Ptriph«rtls Tools SVCS Yindor Htlpijt £00窟圏|©|| 1憾皆幽昌■ HarProject?^ |[■port J1 Visionl Projects"Qp«i Project图1 - 13、然后选择你要保存的路径“ C:/实验一”,输入工程文件的名字“实验一”,然后点击保存。
4、这时会弹出一个对话框,要求你选择单片机的型号,这里选择Atmel89C51,如图1 - 2所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。
完成后,屏幕如图 1 —3所示。
CPU |Vendor:Atm«lDevic«:AT89CS2rFamily:■CS-S1rQ.*t«・tpti on:Select Devi c* for Tar1"Us* E M• *nd«d [ink" CLX51 ) i nxt «*d BIS IUst E KTL dc-<1 AxsfefftbLtr (AXH〕i tiEr lE.d. ◎£ J M-» 1Ell. Edu 0“C«buc PtL>pb*rdl looli SVCS findow ]|tlp窗aH 0 融・1© 口 JS1 B B^"|「°. 宰塞>4%戈怡鹽TI「— - ----------------- --- -----■_ -——■—— …’ ----------------------------- ---- - ------------ 一― J -ss5sa^» [f^—r■*■胴ow5、在图1- 3中,单击“ File ”菜单,再在下拉菜单中单击“NeW'选项。
实验名称 Keil 的使用与汇编语言上机操作指导教师罗志祥专业班级光电1406 姓名段昳晖学号 U2014***** 联系电话 137******一、任务要求1.掌握Keil环境的使用1)字节拆分、合并:调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。
2. 编写多个十六位数的加法程序有4个十六位无符号数,连续存放在20H开始的片上数据区中,低八位先存,高八位在后。
要求:和存于R3(高八位)和R2(低八位),进位位存于R4.二、设计思路1.掌握Keil环境的使用1)字节拆分、合并利用汇编语言中的XCHD和SWAP两个语句来实现将八位二进制数拆分为两个四位二进制数并分别存储于不同的存储空间的功能,BCD码与30H相或(加上30H)得到ASCII 码。
将两个ASCII码和0FH相与(高四位清零)得到BCD码,利用SWAP语句将高位数放至高四位,将高位数和低位数相或可实现字节的合并。
2)数据块填充将R0用作计数器,DPTR用作片外数据指针,A作为原始数据来源,依顺序在片外的存储单元内容填充数据。
利用循环语句来减少程序长度,并控制填充单元个数为片外100H个。
利用RO的进位实现,当且仅当RO=00H时,结束循环赋值过程,此时R0已经经历了从00H-0FFH的过程,即计数周期为100。
同时赋值循环也历经了一百次,完成了将片外RAM 7000H-70FFH单元按数据依次递增规律的填充。
2.多个十六位数的加法程序以2个十六位无符号数相加为基础,将输入的4个无符号数(以a、b、c、d代表),两两相加,所得的2个和,再作为加数,求和,得到4个数的和。
其中需要注意的是进位的处理。
四数求和进位,不仅有两和数相加产出的进位还要加上产生两和数时的进位。
其中2个十六位无符号数相加的原理为,先对两数低位求和,提取出其进位,加到两数高位和中,并将高位求和进位,即两数求和进位保存下来。
单片机汇编语言设计实例详解引言:单片机是嵌入式系统中常见的控制器,它具有体积小、功耗低、成本低等特点,被广泛应用于家电、汽车、工业控制等领域。
而汇编语言作为单片机的底层语言,直接操作硬件资源,具有高效性和灵活性。
本文将以一个实例,详细讲解如何使用单片机汇编语言进行设计。
实例背景:假设我们要设计一个温度检测系统,要求实时监测环境温度,并在温度超过某个阈值时触发报警。
硬件准备:1. 单片机:我们选择一款常用的8051单片机作为例子。
2. 温度传感器:我们选择一款数字温度传感器,它可以通过串行通信与单片机进行数据交互。
3. 显示屏:为了方便实时显示温度信息,我们选用一款数码管显示屏。
软件准备:1. Keil C51:这是一款常用的单片机开发软件,支持汇编语言的编写和调试。
2. 串口调试助手:用于测试串口通信功能。
设计步骤:1. 硬件连接:将单片机与温度传感器、显示屏连接起来。
注意接线的正确性和稳定性。
2. 编写初始化程序:使用汇编语言编写单片机的初始化程序,包括端口初始化、中断向量表设置、定时器初始化等。
3. 串口通信设置:通过串口与温度传感器进行数据交互,需要设置串口通信的波特率、数据位数、停止位等参数。
4. 温度检测程序:编写汇编语言程序,实时读取温度传感器的数据,并将数据送至显示屏进行显示。
5. 温度报警程序:在温度超过设定阈值时,触发报警程序,可以通过蜂鸣器等外设发出警报信号。
6. 调试与测试:使用Keil C51进行程序调试,通过串口调试助手测试串口通信和温度显示、报警功能。
设计思路:1. 初始化程序设计:先设置端口的输入输出方向,再设置中断向量表,最后初始化定时器。
这样可以确保程序的稳定性和可靠性。
2. 串口通信设置:根据温度传感器的通信协议,设置串口的波特率、数据位数、停止位等参数。
注意要与传感器的通信规范保持一致。
3. 温度检测程序设计:通过串口读取温度传感器的数据,并进行相应的处理。
有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子对这个过程进行描述,希望能对初学者有所帮助。
几年来,在这个论坛里笔者得到很多热心人指导,因此也希望藉此尽一点绵薄之力。
在这个例子里,阐述了编写c51程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是一个整型变量。
例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。
该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。
step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。
相关文件如下://main.c文件#include < reg51.h >#define uchar unsigned char#define uint unsigned intextern uint AFUNC(uchar v_achr,bit v_bflag);void main(){ bit BFLAG; uchar mav_chr; uint mvintrslt; mav_chr=0xd4; BFLAG=1; mvintrslt=AFUNC(mav_chr,BFLAG);}//CFUNC.c文件#define uchar unsigned char#define uint unsigned intuint AFUNC(uchar v_achr,bit v_bflag){ uchar tmp_vchr; uint tp_vint; tmp_vchr=v_achr; tp_vint=(uint)v_bflag; return tmp_vchr+(tp_vint<<8);}step2. 在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;step3. 根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工 程的最后文件;step4. build这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51文件),然后在工程里去掉库文件(如C51S.Lib)和CFUNC.c,而将CFUNC.A51添加到工程里。
Keil创建一个汇编程序的步骤1、在C盘新建文件夹“实验一”,启动Keil2、建立一个新工程,单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图1-1所示。
图1-13、然后选择你要保存的路径“C:/ 实验一”,输入工程文件的名字“实验一”,然后点击保存。
4、这时会弹出一个对话框,要求你选择单片机的型号,这里选择Atmel 89C51,如图1-2所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。
完成后,屏幕如图1-3所示。
图1-2图1-35、在图1-3中,单击“File”菜单,再在下拉菜单中单击“New”选项。
新建文件后屏幕如图1-4所示。
图1-46、此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如1-5图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名如”Text1.asm”,然后,单击“保存”按钮。
图1-57、回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,并单击“Add File to Group ‘Source Group 1’”选项,在出现的对话框1-6中选中“Text1.asm”,此时出现对话框如图1-7所示,在Type 选择栏中选择第二项“Assembly Language File”,确定文件类型为汇编语言。
8、然后得到如图1-8所示的操作界面,注意比对左侧编辑框项目是否和图1-8一致,下面可以在右侧空白栏中编写汇编程序了。
图1-6图1-7图1-8实验一汇编语言实验一、实验目的1.利用单片机的P1 口作I/O 口,掌握P1 口同时作为输入和输出的用法。
2.掌握汇编语言程序编写方法。
二、实验设备(仪器)PC 微机一台,Keil软件三、实验内容1.寻址方式实验。
2. 单片机I/O口实验。
keil5 编译实例Keil 5 是一款流行的集成开发环境(IDE),主要用于编写和编译单片机程序。
下面是一个简单的Keil 5 编译实例,演示如何创建一个51 单片机项目并将其编译成功。
1. 打开Keil 5 IDE。
如果这是第一次使用Keil 5,请先安装软件。
在安装过程中,选择原来Keil 5 MDK 的安装路径。
2. 创建一个新项目。
在Keil 5 主界面的“Project”菜单中,选择“New uVision Project”。
在弹出的对话框中,输入项目名称、选择单片机型号(如AT89C51),并设置项目保存路径。
点击“OK”完成项目创建。
3. 添加源文件。
在项目目录下,创建一个新文件夹,如“Source Files”。
在此文件夹中,创建一个 C 文件,例如“main.c”。
在此文件中,编写以下简单的代码:```c#include <reg52.h>void main() {while (1) {P1 = 0xfe; // 点亮P1 口的LEDdelay(1000); // 延时1 秒P1 = 0x00; // 熄灭P1 口的LEDdelay(1000); // 延时1 秒}}```4. 配置项目。
在项目目录下,找到“Keil uVision2”文件夹,双击“Options for Target 'Target 1'”打开配置对话框。
在“Output”选项卡中,确保“Assembly Output”和“C/C++ Output”均选中。
在“C/C++ Output”选项卡中,选中“Include path”并设置项目目录下的“Header Files”文件夹路径。
点击“OK”保存配置。
5. 编译项目。
点击Keil 5 主界面上的“Build”按钮或按F7 键开始编译项目。
编译完成后,查看“Output”窗口,如果显示“Build Finished”且没有错误和警告,说明编译成功。
Keil 工程文件的建立、设置与目标文件的获得单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP 等操作系统。
掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
我们将通过一些实例来学习Keil软件的使用,在这一部份我们将学习如何输入源程序,建立工程、对工程进行详细的设置,以及如何将源程序变为目标代码。
图1所示电路图使用89C51单片机作为主芯片,这种单片机性属于MCS-51系列,其内部有4K的FLASH ROM,可以反复擦写,非常适于做实验。
89C51的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的第一个任务是让接在P1引脚上的发光二极管依次循环点亮。
一、Keil工程的建立首先启动Keil软件的集成开发环境,这里假设读者已正确安装了该软件,可以从桌面上直接双击uVision的图标以启动该软件。
Keil创建一个汇编程序的步骤1、在C盘新建文件夹“实验一”,启动Keil2、建立一个新工程,单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图1-1所示。
图1-13、然后选择你要保存的路径“C:/ 实验一”,输入工程文件的名字“实验一”,然后点击保存。
4、这时会弹出一个对话框,要求你选择单片机的型号,这里选择Atmel 89C51,如图1-2所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。
完成后,屏幕如图1-3所示。
图1-2图1-35、在图1-3中,单击“File”菜单,再在下拉菜单中单击“New”选项。
新建文件后屏幕如图1-4所示。
图1-46、此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如1-5图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名如”Text1.asm”,然后,单击“保存”按钮。
图1-57、回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,并单击“Add File to Group ‘Source Group 1’”选项,在出现的对话框1-6中选中“Text1.asm”,此时出现对话框如图1-7所示,在Type 选择栏中选择第二项“Assembly Language File”,确定文件类型为汇编语言。
8、然后得到如图1-8所示的操作界面,注意比对左侧编辑框项目是否和图1-8一致,下面可以在右侧空白栏中编写汇编程序了。
图1-6图1-7图1-8实验一汇编语言实验一、实验目的1.利用单片机的P1 口作I/O 口,掌握P1 口同时作为输入和输出的用法。
2.掌握汇编语言程序编写方法。
二、实验设备(仪器)PC 微机一台,Keil软件三、实验内容1.寻址方式实验。
2. 单片机I/O口实验。
实验名称 Keil的利用与汇编语言上机操作成绩指导教师专业班级姓名学号联系一、任务要求二、设计思路三、资源分派四、流程图五、源代码(含文件头说明、语句行注释)六、程序测试方式与结果试探题Keil的利用与汇编语言上机操作一、任务要求编写多个十六位数的加法程序,有4个十六位无符号数,持续寄存在20H开始的片上数据区中,低八位先存,高八位在后。
要求:和存于R3(高八位)和R2(低八位),进位位存于R4。
二、设计思路1.先将20H21H和22H23H的两个16位数相加。
用R0,R1存储被加的两个数的地址,低位相加以后,结果保留在R2,将R0,R1存储的地址自加1,进行高位相加,结果保留在R3。
完成一次两个16位数的相加以后,低位相加结果存储在18H,高位结果存储在19H,进位保留在R42.R0改成18H,R1改成24H,将第一次的结果再和第三个数相加,假设有进位,R4加13.R0改成18H,R1改成26H,将第二次的结果再和第四个数相加,假设有进位,R4加14.最后R2贮存的是低八位,R3保留的高八位,R4保留的总进位三、资源分派20H--27H 保留四个16位数R2 保留每次加法的低8位R3 保留每次加法的高8位R0 R1每次加法运算的两个数的地址R4 保留进位结果19H 18H 两个16位数以后的数高低位的保留地址A 中间运算四、流程图五、源代码File name: jiafa.asmORG 0000HMOV 27H,#25HMOV 26H,#25HMOV 25H,#25HMOV 24H,#0E5HMOV 23H,#0F5HMOV 22H,#25HMOV 21H,#25HMOV 20H,#0F5H ;赋值CLR CMOV R2,#00H ;暂存每次加法的低位结果MOV R3,#00H ;暂存每次加法的高位结果MOV R4,#00H ;记录4个16位数相加的进位MOV R0,#20H ;第一次相加MOV R1,#22HMOV A,@R0ADD A,@R1MOV R2,A ;低位相加和保留到R2INC R0INC R1 ;地址加1,进行高位相加MOV A,@R0ADDC A,@R1MOV R3,A ;高位相加和保留到R3JNC JINW1 ;若是有进位,R4加1MOV A,R4ADD A,#01HMOV R4,AJINW1: CLR C ;将第一次相加的结果与第三个数相加MOV 18H,R2 ;保留每次运算后的低位结果在18HMOV 19H,R3 ;保留每次运算后的高位结果在19H MOV R0,#18H ;将结果和新的数相加MOV R1,#24H ;新数的地址MOV A,@R0ADD A,@R1MOV R2,AINC R0INC R1MOV A,@R0ADDC A,@R1MOV R3,AJNC JINW2MOV A,R4ADD A,#01HMOV R4,AJINW2:CLR C ;将第二次相加的结果与第四个数相加MOV 18H,R2MOV 19H,R3MOV R0,#18HMOV R1,#26HMOV A,@R0ADD A,@R1MOV R2,AINC R0INC R1MOV A,@R0ADDC A,@R1MOV R3,AJNC JINW3MOV A,R4ADD A,#01HMOV R4,AJINW3:SJMP $END六、程序测试方式与结果1.字节拆分、归并程序的调试:第一步:拆分为两个数第二步:转换为ASCII码第三步:掏出两个ASCII码并归并2.数据块填充程序调试:第一步:从7000H开始赋值,每赋值一次,R0加1记录次数,A也加1第二步:R0加到00H,终止循环赋值总共运行256次3.四个16位数的相加四个数别离为25F5H,F525H,25E5H,2525H观看每次相加以后各个寄放器的值,进位的值,25F5H与F525H相加,应该是11B1AH19H18H处别离是1B 1A ,R4保留的进位为111B1AH与25E5相加,结果应该是140FFH140FFH与2525H相加,结果应该是16624H测试以后的结果为16624H,R4保留进位位,高低8位别离保留在R3,R2七、试探题1.在调试时,Registers窗口中能够查看Regs和Sys,别离是工作寄放器和SFRVIEW-MEMORY WINDOWS-MEMORY 1/2/3/4,查看片内RAM,输入D:18H格式的语句,查看片外RAM,输入X:3000H格式的语句,查看程序代码,输入C:0100H格式的语句Disassembly窗口可查看各程序指令寄存的程序地址,在运用PC查表时能够用到,也能够查看指令的长度2.字节拆分、归并:(利用ADD指令)MOV 30H,#49HMOV A,30HANL A,#0FH ;掏出低位ADD A,#30H ;变成ASCII码MOV 31H,A ;结果存于31HMOV A,30HANL A,#0F0HSWAP A ;掏出高位ADD A,#30H ;变成ASCII码MOV 32H,A ;结果存于32HMOV A,31H ;掏出低位的ASCII码ANL A,#0FH ;转为BCDMOV 33H,A ;存于33HMOV A,32H ;掏出高位的ASCII码ANL A,#0FH ;转为BCDSWAP AADD A,33H ;高位低位相加,归并在一路MOV 33H,A ;把归并的数存在33H3.CLR A 改成MOV A,#FFHINC A 改成DEC A4.MOV DPTR,#7000H 改成MOV DPTR,#7010HCJNE R0,#00H,FILL1 改成CJNE R0,#14,FILL1 5.在每条ADD或ADDC指令的后面加上一条DA A指令。
有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编比较常用的keil中嵌入汇编的方法如下所示:如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL 就知道这中间的一段是汇编了。
在有加入汇编的文件中,还要设置编译该文件时的选项Generate Assembler SRC File 生成汇编SRC文件Assemble SRC File封装汇编文件(如图三的状态为选中)选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。
为了能对汇编进行封装还要在项目中加入相应的封装库文件,在笔者的项目中编译模式是小模式所以选用C51S.LIB。
这也是最常用的。
这些库文件是中KEIL安装目录下的LIB目录中。
加好后就可以顺利编译了。
(注:我只在7.0以上版本使用过)汇编与C语言混合编程的关键问题1 C程序变量与汇编程序变量的共用为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:.ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff在汇编程序中引用而在C程序可直接定义的变量:unsigned char to_dte_buff[BUFF_SIZE];//DSP发向PC机的数据int to_dte_num;//缓冲区中存放的有效字节数int to_dte_store;//缓冲区的存放指针int to_dte_read;//缓冲区的读取指针这样经过链接就可以完成对应。
2 程序入口问题在C程序中,程序的入口是main()函数。
而在汇编程序中其入口由*.cmd文件中的命令决定,如:-e main_start;程序入口地址为main _start。
这样,混合汇编出来的程序得不到正确结果。
因为C到ASM 的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。
在Keil uVision5中,进行32位除法的一种方法是使用SDIV汇编指令。
SDIV指令用
于有符号整数的除法。
以下是一个简单的示例程序,演示如何在Thumb模式下使
用SDIV进行32位整数除法。
上述示例中,我们使用MOV指令将被除数和除数加载到R0和R1寄存器中。
然后,我们使用SDIV指令执行除法操作,将商存储在R2中,余数存储在R3中。
你可以根据需要添加更多的代码,比如将商存储到某个变量中。
请注意,在Thumb模式下,SDIV指令只能用于有符号整数。
如果需要无符号整数
除法,可以考虑使用UDIV指令。
请确保你的目标架构和指令集支持这些指令。
这只是一个简单的示例,实际应用中可能需要更多的代码来处理各种情况,比如除数为零的情况等。
在实际应用中,请根据你的需求和具体情况添加错误处理和边界检查。
keil C语言与汇编语言混合编程1. C语言中嵌入汇编1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM;Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assem bler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;4、编译,即可生成目标代码。
来个实例吧:#i nclude <reg51.h>void main(void){P2=1;#pragma asmMOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DEL#pragma endasmP2=0;}2 . 无参数传递的函数调用C51调用汇编函数1.无参数传递的函数调用先来个例子:其中example.c和example.a51为项目中的两个文件***********************example.c***********************************************extern void delay100();main(){delay100;}***********************example.a51***********************************************?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段PUBLIC DELAY100; //声明函数RSEG ?PR?DELAY100; //函数可被连接器放置在任何地方DELAY100:MOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DELRETEND在example.c文件中,先声明外部函数,然后直接在main中调用即可。
keil定义p2口按键汇编语言Keil是一种广泛使用的集成开发环境(IDE),适用于嵌入式系统的软件开发。
在使用Keil进行嵌入式开发时,经常需要通过定义和配置硬件外设来实现特定的功能。
本文将介绍如何使用Keil来定义P2口作为按键输入,并以汇编语言编写相应的代码。
P2口是一种常见的GPIO(通用输入输出)口,可以通过配置来将其设置为输入模式,并检测其状态以实现按键的功能。
下面是一个示例的代码,展示了如何定义P2口为按键输入,并在键按下时触发相应的动作。
首先,在Keil的工程中,需要配置P2口为输入模式。
这可以通过修改相应的寄存器来实现。
具体而言,我们需要将P2口的对应位(比如P2.0)设置为0,以配置为输入模式。
接下来,在汇编代码中,我们可以使用P2口的状态来检测按键的状态。
当P2口为低电平时,表示按键被按下,我们可以执行相应的操作。
例如,可以设置一个变量来记录按键被按下的次数,或者触发其他的事件。
下面是一个示例的汇编代码,展示了如何检测P2口按键的状态并触发相应的动作:```ORG 0HMOV P2, #0FFH ; 配置P2口为输入模式MAIN:JB P2.0, KEY_PRESSED ; 如果P2.0为低电平,跳转到KEY_PRESSED标签JMP MAIN ; 如果P2.0为高电平,则继续循环检测KEY_PRESSED:; 在这里执行按键被按下时的操作; 可以设置一个计数器来记录按键被按下的次数,或触发其他的事件JMP MAIN ; 执行完操作后,跳回主循环END```在上述代码中,首先将P2口配置为输入模式,然后进入主循环。
在主循环中,通过JB指令检测P2.0口的状态,如果为低电平,则跳转到KEY_PRESSED标签。
在KEY_PRESSED标签中,可以执行按键被按下时的操作。
然后,通过JMP指令跳回主循环,继续检测P2口的状态。
这是一个简单的示例,演示了如何在Keil中使用汇编语言来定义P2口为按键输入。
KEILC51程序中如何嵌⼊汇编模块内接⼝:使⽤如下标志符:asm汇编语句endasm注意:如果在程序中使⽤了,注意在Keil编译器中需要激活Properties中的“Generate Assembler File” 和“Assembler File ”两个选项1、把"xx.c"加⼊⼯程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler File”和“Assemble SRC File”打上⿊勾有效;2、根据选择的编译模式,把相应的库⽂件象加"xx.c"⼀样加⼊⼯程中并放在"xx.c"下⾯,如smail模式下选"keil\\lib\s.lib"加⼊⼯程中,如果要进⾏把"keil\c51\lib\c51fpl.lib"也加⼊⼯程中。
即:在 Keil 安装⽬录下的 \C51\LIB\ ⽬录的LIB ⽂件如下:C51S.LIB - 没有的 Small moC51C.LIB - 没有的 Compact moC51L.LIB - 没有浮点运算的 moC51FPS.LIB - 带浮点运算的 Small modelC51FPC.LIB - 带浮点运算的 Compact modelC51FPL.LIB - 带浮点运算的 model3、在"xx.c"头⽂件中加⼊优化:⽐如 (4,speed)4、在"xx.c"中加⼊汇编代码#pragma ASM;Assembler Code Here#pragma ENDASM5、编译⽣成xx.hex例:#include<reg52.h>void delay(void){#pragma asmR5,#5DEL:R6,#2DEL1:R7,#255DJNZ R7,$DJNZ R6,DEL1DJNZ R5,DEL;MOV A,P1; A;MOV P1,A#pragma endasm}void delay1(unsigned int cnt){while(cnt--);}void main(){while(1){delay1(1000);P1=0x55;delay();}}有时候⽤到需要精确延时之类的⼦程序时,⽤C语⾔⽐较难控制,这时候就可以在C中嵌⼊汇编⽐较常⽤的keil中嵌⼊汇编的⽅法如下所⽰:如图⼀,在C⽂件中要嵌⼊汇编的地⽅⽤#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的⼀段是汇编了。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define MotorData P0sbit d1=P1^0;uchar num;uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; void delay(uint z);void main(){for(num=0;num<8;num++){P0=CW[num];delay(5);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}(点亮发光二极管)点亮后停止#include<reg52.h>sbit p1_1=P1^0; //位声明定义void main(){p1_1=0;while(1);}(点亮发光二极管,,,一个一个交替亮)#include<reg52.h>sbit P1_1=P2^0;sbit P1_2=P2^1;sbit P1_3=P2^2;sbit P1_4=P2^3;sbit P1_5=P2^4;sbit P1_7=P2^6;sbit P1_8=P2^7;unsigned int a;void main(){while(1){a=500000;P1_1=0;while(a--);a=500000;P1_1=1;while(a--);a=500000;P1_2=0;while(a--);a=500000;P1_2=1;while(a--);a=500000;P1_3=0;while(a--);a=500000;P1_3=1;while(a--);a=500000;P1_4=0;while(a--);a=500000;P1_4=1;while(a--);a=500000;P1_5=0;while(a--);a=500000;P1_5=1;while(a--);a=500000;P1_6=0;while(a--);a=500000;P1_6=1;while(a--);a=500000;P1_7=0;while(a--);a=500000;P1_7=1;while(a--);a=500000;P1_8=0;while(a--);a=500000;P1_8=1;while(a--);}}(点亮发光二极管)#include<reg52.h>sbit p1_1=P1^0; //位声明定义unsigned int a; //定义一个变里,无符号整型void main(){while(1){a=50000; //赋一个初值P1_1=0;while(a--);a=50000;P1_1=1;while(a--);}}(点亮发光二极管并延时嵌套)(调用子函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1^0;void delay(); //函数的声明无返回型无参数型void main(){while(1){D1=0;delay();D1=1;delay();}void delay(){uint x,y;for(x=100;x>0;x--){ for(y=100;y>0;y--); //for语句的嵌套{}}}(蜂鸣器)(调用函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;P1=temp;beep=0;while(1){temp=_crol_(temp,1); //调用函数(循环左移一位)delay(60);P1=temp;}}void delay(uint z){uint x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}(数码管显示1)#include<reg52.h>sbit dula=P2^6; //位声名sbit wela=P2^7; //位声名void main(){wela=1; //位选打开P0=0xfc; //十六进制数wela=0; //位选关闭dula=1; //段选打开P0=0x3f;dula=0; //位选关闭while(1);}(数码管显示2)(带中断系统)//带编码表数组#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //位声名sbit wela=P2^7; //位声名sbit d1=P1^0;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(uint z);void main(){EA=1; //开总中断继存器EX0=1; //开外部中断0IT0=1; //也等于//TCON=0x01;wela=1;P0=c0; //八个数码管全亮wela=0;while(1){for(num=0;num<16;num++){d1=1; //在这里让d1灭掉dula=1;P0=table[num];dula=0;delay(1000);}}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}void exter0() interrupt 0 //表示中断服务子程序{d1=0;} //P3_2口有低电平时发生中断。