汇编程序实例
单片机汇编语言经典一百例
51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。
实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。
实际应用例如:定时报警器。
程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。
【参考文档】mips汇编范例-范文模板 (13页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==mips汇编范例篇一:MIPS汇编范例mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过#########################################################programed by stevie zou #### purpose:to swap two values ######10-15-201X######### ############################### text segment ###############.text.globl mainmain: la$t0, number #读取两个整数并放入寄存器$t1,$t2lw$t1, 0($t0)lw$t2, 4($t0)li$v0, 4#打印msg1la$a0, msg1li$v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli$v0, 4 #打印msg2la$a0, msg2syscallli$v0, 1#打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1#关键部分,在寄存器间move数据move $t1, $t2move $t2, $t3li$v0, 4 #打印msg3la$a0, msg3syscallli$v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli$v0, 4#打印换行符 /nla$a0, msg4syscallli$v0, 1#打印转换后$t2中的值move $a0, $t2########### data segment ##############.datanumber: .word 12,34msg1: .asciiz "the first number is:\n"msg2: .asciiz "\nthe second number is:\n"msg3: .asciiz "\nnow they are swapped as:\n"msg4: .ascii"\n"## end of file程序运行结果为:本文来自CSDN博客,转载请标出处明:mips汇编简单实例——一个小计算器收藏其实开始的时候一直在看 mips的指令格式,看了、忘了,没什么效果。
汇编语言编程实例
汇编语言编程实例一、引言汇编语言是计算机硬件和软件之间的桥梁,它是一种低级语言,可以直接控制计算机硬件。
汇编语言编程可以让程序员更加深入地理解计算机的工作原理,从而实现更高效的程序。
本文将介绍几个汇编语言编程实例,涉及到基本的输入输出、循环、条件判断、数组等知识点。
在这些实例中,我们将使用NASM汇编器进行编译和链接。
二、基本输入输出1. 输出字符串在汇编语言中,我们可以使用系统调用来进行输入输出操作。
在Linux 系统中,输出字符串的系统调用为write。
下面是一个输出字符串的示例程序:```section .datamsg db 'Hello, World!',0xa ;定义一个字符串len equ $-msg ;获取字符串长度section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 1 ;exit系统调用号为1xor ebx, ebx ;退出状态码为0int 0x80 ;调用系统调用退出程序```2. 输入数字类似地,在Linux系统中,输入数字的系统调用为read。
下面是一个输入数字的示例程序:```section .datamsg db 'Please enter a number: ',0xa ;提示信息len equ $-msg ;获取字符串长度buf resb 1 ;定义一个字节的缓冲区section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 3 ;read系统调用号为3mov ebx, 0 ;文件描述符为0(标准输入)mov ecx, buf ;缓冲区地址mov edx, 1 ;要读取的字节数int 0x80 ;调用系统调用sub al, '0' ;将ASCII码转换成数字值```三、循环和条件判断1. 计算1到100的和下面是一个计算1到100的和的示例程序,其中使用了循环和条件判断:```section .datasum dd 0 ;定义一个双精度浮点型变量sumsection .textglobal _start_start:xor eax, eax ;eax清零,作为计数器和累加器使用loop_start:inc eax ;eax自增1,相当于i++cmp eax, 100+1 ;比较i是否大于100,注意要加1je loop_end ;如果i等于101,跳转到loop_endadd dword [sum], eax ;将i加到sum中jmp loop_start ;跳转到loop_startloop_end:mov eax, dword [sum] ;将sum赋值给eax,作为返回值mov ebx, 1 ;exit系统调用号为1int 0x80 ;调用系统调用退出程序```2. 判断一个数是否为素数下面是一个判断一个数是否为素数的示例程序,其中使用了循环和条件判断:```section .datamsg db 'Please enter a number: ',0xa ;提示信息len equ $-msg ;获取字符串长度buf resb 1 ;定义一个字节的缓冲区section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 3 ;read系统调用号为3mov ebx, 0 ;文件描述符为0(标准输入)mov ecx, buf ;缓冲区地址mov edx, 1 ;要读取的字节数int 0x80 ;调用系统调用sub al, '0' ;将ASCII码转换成数字值check_prime:xor ebx, ebx ;ebx清零,作为除数使用mov ecx, eax ;将eax的值赋给ecx,作为被除数使用inc ebx ;将ebx自增1,相当于除数加1cmp ebx, ecx ;比较除数是否大于被除数jge is_prime ;如果除数大于等于被除数,跳转到is_prime xor edx, edx ;edx清零,作为余数使用div ebx ;将ecx/ebx的商放在eax中,余数放在edx中 cmp edx, 0 ;判断余数是否为0je not_prime ;如果余数为0,跳转到not_primejmp check_prime ;跳转到check_primenot_prime:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, not_prime_msg ;要输出的字符串地址mov edx, not_prime_len ;要输出的字符数int 0x80 ;调用系统调用exit:mov eax, 1 ;exit系统调用号为1xor ebx, ebx ;退出状态码为0int 0x80 ;调用系统调用退出程序not_prime_msg db 'The number is not prime.',0xa ;提示信息not_prime_len equ $-not_prime_msgis_prime:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, is_prime_msg ;要输出的字符串地址mov edx, is_prime_len ;要输出的字符数int 0x80 ;调用系统调用jmp exit ;跳转到exitis_prime_msg db 'The number is prime.',0xa ;提示信息is_prime_len equ $-is_prime_msg```四、数组1. 计算数组的和下面是一个计算数组的和的示例程序:```section .dataarr dd 1, 2, 3, 4, 5 ;定义一个双精度浮点型数组arrn equ ($-arr)/4 ;获取数组长度section .textglobal _start_start:xor eax, eax ;eax清零,作为计数器和累加器使用xor ecx, ecx ;ecx清零,作为数组下标使用loop_start:cmp ecx, n ;比较ecx是否大于等于njge loop_end ;如果ecx大于等于n,跳转到loop_endadd eax, dword [arr+ecx*4] ;将arr[ecx]加到eax中inc ecx ;将ecx自增1,相当于下标加1jmp loop_start ;跳转到loop_startloop_end:mov ebx, eax ;将sum赋值给ebx,作为返回值mov eax, 1 ;exit系统调用号为1xor ecx, ecx ;退出状态码为0int 0x80 ;调用系统调用退出程序```2. 查找数组中的最大值下面是一个查找数组中的最大值的示例程序:```section .dataarr dd 10,20,30,-40,-50,-60,-70,-80,-90,-100 ;定义一个双精度浮点型数组arrn equ ($-arr)/4 ;获取数组长度section .textglobal _start_start:mov eax, dword [arr] ;将arr[0]赋值给eax,作为最大值使用xor ecx, ecx ;ecx清零,作为数组下标使用loop_start:cmp ecx, n ;比较ecx是否大于等于njge loop_end ;如果ecx大于等于n,跳转到loop_endcmp eax, dword [arr+ecx*4] ;比较eax和arr[ecx]jge loop_next ;如果eax大于等于arr[ecx],跳转到loop_next mov eax, dword [arr+ecx*4] ;将arr[ecx]赋值给eax,更新最大值loop_next:inc ecx ;将ecx自增1,相当于下标加1jmp loop_start ;跳转到loop_startloop_end:mov ebx, eax ;将max赋值给ebx,作为返回值mov eax, 1 ;exit系统调用号为1xor ecx, ecx ;退出状态码为0int 0x80 ;调用系统调用退出程序```五、总结本文介绍了几个汇编语言编程实例,涉及到基本的输入输出、循环、条件判断、数组等知识点。
单片机汇编语言设计实例详解
单片机汇编语言设计实例详解引言:单片机是嵌入式系统中常见的控制器,它具有体积小、功耗低、成本低等特点,被广泛应用于家电、汽车、工业控制等领域。
而汇编语言作为单片机的底层语言,直接操作硬件资源,具有高效性和灵活性。
本文将以一个实例,详细讲解如何使用单片机汇编语言进行设计。
实例背景:假设我们要设计一个温度检测系统,要求实时监测环境温度,并在温度超过某个阈值时触发报警。
硬件准备:1. 单片机:我们选择一款常用的8051单片机作为例子。
2. 温度传感器:我们选择一款数字温度传感器,它可以通过串行通信与单片机进行数据交互。
3. 显示屏:为了方便实时显示温度信息,我们选用一款数码管显示屏。
软件准备:1. Keil C51:这是一款常用的单片机开发软件,支持汇编语言的编写和调试。
2. 串口调试助手:用于测试串口通信功能。
设计步骤:1. 硬件连接:将单片机与温度传感器、显示屏连接起来。
注意接线的正确性和稳定性。
2. 编写初始化程序:使用汇编语言编写单片机的初始化程序,包括端口初始化、中断向量表设置、定时器初始化等。
3. 串口通信设置:通过串口与温度传感器进行数据交互,需要设置串口通信的波特率、数据位数、停止位等参数。
4. 温度检测程序:编写汇编语言程序,实时读取温度传感器的数据,并将数据送至显示屏进行显示。
5. 温度报警程序:在温度超过设定阈值时,触发报警程序,可以通过蜂鸣器等外设发出警报信号。
6. 调试与测试:使用Keil C51进行程序调试,通过串口调试助手测试串口通信和温度显示、报警功能。
设计思路:1. 初始化程序设计:先设置端口的输入输出方向,再设置中断向量表,最后初始化定时器。
这样可以确保程序的稳定性和可靠性。
2. 串口通信设置:根据温度传感器的通信协议,设置串口的波特率、数据位数、停止位等参数。
注意要与传感器的通信规范保持一致。
3. 温度检测程序设计:通过串口读取温度传感器的数据,并进行相应的处理。
汇编语言指令大全及实例解析
汇编语言指令大全及实例解析
汇编语言是一种底层的计算机语言,它直接操作计算机的硬件资源。
在汇编语言中,指令是最基本的操作单位,通过指令可以实现对计算机硬件的控制和操作。
本文将为大家介绍一些常用的汇编语言指令,并通过实例解析它们的具体用法和功能。
1. MOV指令。
MOV指令用于将数据从一个位置复制到另一个位置。
例如,下面的汇编代码将把寄存器AX中的值移动到寄存器BX中:
MOV BX, AX.
这条指令将AX中的值复制到BX中。
2. ADD指令。
ADD指令用于将两个操作数相加,并将结果存储到目标操作数中。
例如,下面的汇编代码将把寄存器AX和BX中的值相加,并将结果存储到AX中:
ADD AX, BX.
3. SUB指令。
SUB指令用于将目标操作数减去源操作数,并将结果存储到目标操作数中。
例如,下面的汇编代码将把寄存器AX中的值减去BX 中的值,并将结果存储到AX中:
SUB AX, BX.
4. CMP指令。
CMP指令用于比较两个操作数的大小,并根据比较结果设置标志位。
例如,下面的汇编代码将比较AX和BX中的值:
CMP AX, BX.
以上是一些常用的汇编语言指令及其实例解析。
通过学习和理解这些指令,我们可以更好地理解和掌握汇编语言的编程技巧,从而更好地编写高效的汇编语言程序。
希望本文对大家有所帮助。
汇编语言程序设计实例
汇编语言程序设计实例汇编语言是一种非常底层的编程语言,它允许程序员直接与计算机硬件进行交互。
汇编语言程序设计通常用于需要高性能或者对硬件有特定需求的场合。
以下是一些汇编语言程序设计的实例,以帮助理解其基本结构和应用。
实例一:数据传输在汇编语言中,数据传输是最基本的操作之一。
以下是一个简单的数据传输程序实例,它将一个立即数(即直接给出的数值)移动到寄存器中:```assemblymov ax, 1234h ; 将十六进制数1234h移动到ax寄存器```实例二:算术运算汇编语言支持基本的算术运算,如加法、减法、乘法和除法。
以下是一个进行加法运算的例子:```assemblymov ax, 5 ; 将数值5移动到ax寄存器add ax, 3 ; 将数值3加到ax寄存器中```实例三:条件跳转条件跳转是控制程序流程的重要手段。
以下是一个基于条件跳转的简单程序,它检查ax寄存器的值是否为0,并根据结果跳转到不同的代码段:```assemblymov ax, 0 ; 将数值0移动到ax寄存器jz zero ; 如果ax为0,则跳转到标签zero; 继续执行其他代码...zero:; 如果ax为0,执行这里的代码```实例四:循环结构循环结构在汇编语言中实现起来较为复杂,但可以通过重复使用跳转指令来模拟。
以下是一个简单的循环结构实例,它将ax寄存器的值减1,直到值为0:```assemblystart_loop:dec ax ; 将ax寄存器的值减1jnz start_loop ; 如果ax不为0,跳回start_loop```实例五:字符串处理汇编语言程序设计中,字符串处理是一个常见的任务。
以下是一个将字符串从源地址复制到目标地址的程序:```assemblymov si, source ; 将源字符串的地址移动到si寄存器mov di, dest ; 将目标地址移动到di寄存器mov cx, length ; 将字符串的长度移动到cx寄存器copy_loop:movsb ; 从si复制一个字节到diloop copy_loop ; 减少cx的值并重复循环直到cx为0```实例六:子程序调用在汇编语言中,子程序是一种将代码封装成模块化单元的方法。
汇编语言及编程实例(电子教案)
汇编语言及编程实例(电子教案)汇编语言程序设计2005第四章汇编语言程序设计回顾:8086的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。
本讲重点:了解汇编的概念及其方法,掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤。
4.1汇编语言的基本元素一、汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。
每个语句由1~4个部分组成,其格式是:[标号]指令助记符[操作数][;注解]其中用方括号括起来的部分,可以有也可以没有。
每部分之间用空格(至少一个)分开,一行最多可有132个字符。
1.标识符给指令或某一存储单元地址所起的名字。
可由下列字符组成:字母:A~z;数字:0~9;特殊字符:、·、@、一、$数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。
标识符最长为31个字符。
当标识符后跟冒号时,表示是标号。
它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。
2.指令助记符表示不同操作的指令,可以是8086的指令助记符,也可以是伪指令。
3.操作数指令执行的对象。
依指令的要求,可能有一个、两个或者没有,例如:RET;无操作数COUNT:INCC某;一个操作数如果是伪指令,则可能有多个操作数,例如:COSTDB3,4,5,6,7;5个操作数MOVA某,[BP+4];第二个操作数为表达式4.注解该项可有可无,是为源程序所加的注解,用于提高程序的可读性。
二、汇编语言的运算符1.算术运算符、逻辑运算符和关系运算符-1-汇编语言程序设计2005算术运算符可以应用于数字操作数,结果也是数字。
而应用于存储器操作数时,只有+、-运算符有意义。
2.取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH·SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。
例如,定义:SLOTDW25则:MOVA某,SLOT;从SLOT地址中取一个字送入A某MOVA某,SEGSLOT;将SLOT所在段的段地址送入A某MOVA某,OFFSETSLOT;将SLOT所在段的段内偏移地址送A某·TYPE操作符返回一个表示存储器操作数类型的数值。
单片机汇编语言入门实例
一、用单片机控制发光二极管图1为单片机控制发光二极管的实验电路图。
图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED。
实例1:用单片机控制LED闪烁发光源程序如下:MAIN:SETB P1.0LCALL DELAYCLR P1.0LCALL DELAYLJMP MAINDELAY:MOV R7,#250D1:MOV R6,#250D2:DJNZ R6,D2DJNZ R7,D1RETEND程序说明:1、SETB P1.0:将P1.0口置“1”,既让P1.0输出高电平,让LED 熄灭。
2、LCALL DELAY:LCALL称为子程序调用指令,指令后面的参数DELAY是一个标号,用于标识第6行程序,执行LCALL指令时,程序转到LCALL后面的标号所指示的程序行处执行,如果执行指令过程中遇到RET指令,则程序就返回到LCALL指令下面的一条指令继续执行。
3、CLR P1.0:将P1.0口置“0”,既让P1.0输出低电平,让LED 亮。
4、LCALL DELAY:调用延时子程序DELAY。
5、LJMP MAIN:跳转到第1条指令处执行第1条指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:不是S51单片机的指令,不会产生单片机可执行的代码,而是用于告诉汇编软件“程序到此结束”,这类用于汇编软件控制的指令称为“伪指令”。
延时程序说明:1、程序中的R6、R7代表工作寄存器的单元,用来暂时存放一些数据。
2、MOV指令的含义是传递数据。
指令“MOV R7,#250”的含义是:将数据250送到R7中。
250前面的“#”号表示250是一个数,而不是一个地址,“#”号后面的数称为立即数。
3、DJNZ指令后面有两个符号,一个是R6,一个是D2。
R6是寄存器,D2是标号。
DJNZ指令的执行过程是:将其后面第一个参数中的值减1,然后看这个值是否等于0,如果等于0,往下执行,如果不等于0,则转移到第二个参数所指定的位置去执行,这里是转移到由D2所标识的这条语句去执行。
pic单片机汇编语言程序设计实例
pic单片机汇编语言程序设计实例一、前言单片机是现代电子技术中的重要组成部分,而汇编语言则是单片机编程中最基础的语言。
本文将以PIC单片机为例,介绍汇编语言程序设计实例。
二、PIC单片机简介PIC(Peripheral Interface Controller)是一种微控制器,由美国Microchip Technology公司开发。
PIC单片机具有体积小、功耗低、价格便宜等优点,广泛应用于各种电子设备中。
三、汇编语言基础1. 寄存器PIC单片机有许多寄存器,其中最常用的有W寄存器和F寄存器。
W 寄存器是一个8位的通用寄存器,可用于存储临时数据;F寄存器则是一个8位的特殊功能寄存器,可用于控制各种外设。
2. 指令集PIC单片机的指令集非常丰富,涵盖了各种数据操作、逻辑运算、跳转等指令。
例如:- MOVF:将指定地址中的数据移动到W寄存器中;- ADDWF:将指定地址中的数据与W寄存器中的数据相加,并将结果保存到指定地址中;- BTFSS:测试指定地址中某一位是否为0,并跳过下一条指令。
3. 标志位PIC单片机还有一些标志位,用于记录各种状态信息。
其中最常用的有C(进位标志位)、Z(零标志位)和DC(半进位标志位)。
四、汇编语言程序设计实例下面以一个简单的LED闪烁程序为例,介绍PIC单片机汇编语言程序设计。
1. 硬件连接将一个LED连接到PIC单片机的RA0口,通过一个220欧姆电阻限流。
将VDD和VSS分别连接到5V和地。
2. 程序设计首先定义RA0口为输出口,并将其置为低电平。
然后进入一个死循环,在循环中将RA0口置为高电平、延时一段时间、再将RA0口置为低电平、再延时一段时间。
程序如下:LIST P=16F84AINCLUDE "P16F84A.INC"__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSCORG 0x00GOTO MAINORG 0x04MAIN:MOVLW 0x00 ; 将W寄存器清零TRIS PORTA ; 将PORTA定义为输出口LOOP:BSF PORTA, 0 ; 将PORTA.0置为高电平CALL DELAY ; 延时BCF PORTA, 0 ; 将PORTA.0置为低电平CALL DELAY ; 延时GOTO LOOPDELAY:MOVLW 0x64 ; 将W寄存器设置为100(十进制)DELAY_LOOP:NOP ; 空操作,延时1个指令周期DECFSZ W, F ; 将W寄存器减1,如果不为0则跳转到DELAY_LOOPGOTO DELAY_LOOP ; 否则跳出循环RETURN ; 返回主程序3. 编译和烧录将程序保存为.asm文件,使用MPLAB IDE进行编译和烧录。
PROTEUS编译51汇编实例--源程序.ASM
COUNTER3 EQU 0A3H
COUNTER4 EQU 0A4H
TIME3_FLAG EQU 0A5H
TIME_CNT EQU 0A6H
TwoSec EQU 0A7H
DELAY1 EQU 0F8H
DELAY2 EQU 0F9H
DELAY3 EQU 0FAH
DELAY4 EQU 0FBH
COUNTER1 EQU 0FCH
COUNTER2 EQU 0FDH
CJNE A,#05H,NEXT1
LJMP DOWN_SCAN
NEXT1:
MOV A,COUNTER4
ADD A,#05H
MOV COUNTER4,A
JMP WI_UP_REL
MOV A,COUNTER1 ;个位为0时则个位加5
DELAY_D:
LCALL DELAY_10MS ;防按键抖动
JNB SET_DOWN,DOWN_DEAL
LJMP START_SCAN
DOWN_DEAL:
LCALL DELAY_10MS ;防按键抖动
JNB START,WI_START_REL
LJMP UP_SCAN
WI_START_REL:
JNB START,WI_START_REL
DOWN_SCAN: ;SET-DOWN键检测与处理
SETB SET_DOWN
JNB SET_DOWN,DELAY_D
LJMP START_SCAN
CJNE A,#0AH,NEXT10
MOV A,#04H
MOV COUNTER1,A
LJMP DOWN_SCAN
STM8汇编经典实例源码
============================延时的Delay_ms.asm===================== stm8/#include"mapping.inc"#include"stm8s105s6.inc"#include"D:\STM8程序\我的STM8程序\GPIO\User_register.inc"#include"D:\STM8程序\我的STM8程序\GPIO\define.inc"segment'rom';*************延时程序**************;CPU频率:2MHz;要用到的寄存器:X,Y;把要延时的值写入R0E.R0F,R0E为高位值.R0F为低位值;1msDelay_ms.LPUSHW XPUSHW YPUSH CCLDW X,#500;延时1SLDW Y,R0EDelay_next1:LDW X,#500Delay_next:DECW XJRNE Delay_nextDECW YJRNE Delay_next1POP CCPOPW YPOPW XRETFRETFRETFend=============================mai.asm============================== stm8/#include"mapping.inc"#include"stm8s105s6.inc"#include"D:\STM8程序\我的STM8程序\GPIO\User_register.inc"#include"D:\STM8程序\我的STM8程序\GPIO\define.inc"segment'rom'main.l;initialize SPldw X,#stack_endldw SP,X#ifdef RAM0;clear RAM0ram0_start.b EQU$ram0_segment_startram0_end.b EQU$ram0_segment_endldw X,#ram0_startclear_ram0.lclr(X)incw Xcpw X,#ram0_endjrule clear_ram0#endif#ifdef RAM1;clear RAM1ram1_start.w EQU$ram1_segment_startram1_end.w EQU$ram1_segment_endldw X,#ram1_startclear_ram1.lclr(X)incw Xcpw X,#ram1_endjrule clear_ram1#endif;clear stackstack_start.w EQU$stack_segment_startstack_end.w EQU$stack_segment_endldw X,#stack_startclear_stack.lclr(X)incw Xcpw X,#stack_endjrule clear_stackintel;主函数开始;更换成外部时钟,并且CPU8分频BSET CLK_SWCR,#1;允许更换时钟BRES CLK_SWCR,#2;SWIEN位为0,用查询方式确定时钟更换是否完成MOV CLK_SWR,#0B4H;目标时钟为HSE晶振CLK_SW_WAIT1:;等待时钟更换中断标志SWIF有效BTJF CLK_SWCR,#3,CLK_SW_WAIT1BRES CLK_SWCR,#3;清除时钟更换完成任务中断标志SWIFBRES CLK_SWCR,#1;SWEN位为0,禁止时钟再次更换BRES CLK_ICKR,#0;关闭HSI时钟,减少功耗MOV CLK_CKDIVR,#1bH;内部时钟8分频,CPU时钟128分频,现在使用外部时钟,前8分频没用BSET CLK_CSSR,#0;CSS时钟安全系统开;I/O口初始化BSET PD_DDR_DDR0;PD_0设置成输出BSET PE_DDR_DDR5;PE_5设置成输出,595的SDATA脚BSET PC_DDR_DDR2;PC_2设置成输出,595的SCLK脚BSET PC_DDR_DDR4;PC_4设置成输出,595的SRCK脚BSET PE_CR1_C5;设置成推换BSET PC_CR1_C2;设置成推换BSET PC_CR1_C4;设置成推换BSET PD_CR1_C0;PD_0设置成推换BSET PE_CR2_C5;PE_5设置成高速BSET PC_CR2_C2;PC_2设置成高速BSET PC_CR2_C4;PC_4设置成高速BSET PD_CR2_C0;PD_0设置成高速;数码管要显示的数字MOV R0D,#9;R0A为高位MOV R0C,#8MOV R0B,#6MOV R0A,#7CALLF Display_595;调用595显示LOOP1:MOV R0E,#02H;R0E和R0F两单元合起来对应十进制的2000MOV R0F,#0FFHBSET PD_ODR_ODR0CALLF Delay_ms;调用延时BRES PD_ODR_ODR0CALLF Delay_ms;调用延时CALLF AD_8BIT;调用AD转换CALLF BCD_8bit;调用数据转换CALLF Display_595;调用595显示JP LOOP1;*******************8位二进制的数值转化为BCD码***************************;把8位二进制的数值转化为BCD码;要转换的数值放在R09中;转换结果的高位在R0A,中位在R0B,低位在R0CBCD_8bit.LPUSH APUSH R01LD A,R09LD XL,ALD A,#100DIV X,ALD R01,ALD A,XLLD R0A,ALD A,R01LD XL,ALD A,#10DIV X,ALD R0C,ALD A,XLLD R0B,APOP R01POP ARETFRETFRETF;******************************************************************** *******;*************延时程序**************;CPU频率:2MHz;要用到的寄存器:X,Y;把要延时的值写入R0E.R0F,R0E为高位值.R0F为低位值;1msDelay_ms.LPUSHW XPUSH CCLDW X,#500;延时1SLDW Y,R0EDelay_next1:LDW X,#500Delay_next:DECW XJRNE Delay_nextDECW YJRNE Delay_next1POP CCPOPW YPOPW XRETFRETFRETF;****************************************;595串行数码管显示_4位;四位的值分别装在R0A,R0B,R0C,R0D单元中,高位在前;要用到A,X寄存?;过程用到的寄存器:R0FDisplay_595.LPUSH APUSH CCPUSH R0FPUSHW XCLRW XLD A,R0DLD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop1:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5NOPBRES PC_ODR_ODR2DEC R0FJRNE Display_loop1;送完一个数据CLRW XLD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop2:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5NOPBRES PC_ODR_ODR2DEC R0FJRNE Display_loop2CLRW XLD A,R0BLD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop3:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5NOPBRES PC_ODR_ODR2DEC R0FJRNE Display_loop3CLRW XLD A,R0ALD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop4:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5;SDATANOPBRES PC_ODR_ODR2;SCLKDEC R0FJRNE Display_loop4;4个数据送完成BSET PC_ODR_ODR2BRES PC_ODR_ODR4;置高SRCKBSET PC_ODR_ODR4;输出数据POPW XPOP R0FPOP CCPOP ARETFRETFRETF;***************************************************************;AD转换;入口参数:对PB_7进行转换;出口参数:转换结果放大R09AD_8BIT.LPUSH APUSH CCPUSHW X;引脚初始化BRES PB_DDR_DDR7;输入BRES PB_CR1_C7;浮空BRES PB_CR2_C7;禁止外中断;配置寄存器MOV ADC_CSR,#07H;禁止转换结束中断,通道为AIN7;MOV ADC_CR2,#00H;禁止外部触发,数据高8位对好MOV ADC_CR3,#00H;禁止数据缓存使能MOV ADC_CR1,#71H;转换速度为最慢,单次转换模式,开启AD转换电源MOV ADC_CR1,#71H;开始转换NOPNOPNOPAD_next:LD A,ADC_CSRAND A,#80HJREQ AD_nextMOV ADC_CSR,#07H;清除转换结束标志MOV ADC_CR1,#70H;停止AD转换MOV R09,ADC_DRH;把数据送到R09单元POPW XPOP CCPOP ARETFRETF;******************************************************************** ;***************************************************************;595的显示数表TABLE_LED:;DP,F,G,E,D,C,B,A;0,1,2,3,4,5,6,7,8,9DC.B0A0H,0F9H,0C4H,0D0H,99H,92H,82H,0F8H,80H,90H;*************************************************************** motorolainterrupt NonHandledInterruptNonHandledInterrupt.liretsegment'vectit'dc.l{$82000000+main};resetdc.l{$82000000+NonHandledInterrupt};trapdc.l{$82000000+NonHandledInterrupt};irq0dc.l{$82000000+NonHandledInterrupt};irq1dc.l{$82000000+NonHandledInterrupt};irq2dc.l{$82000000+NonHandledInterrupt};irq3dc.l{$82000000+NonHandledInterrupt};irq4dc.l{$82000000+NonHandledInterrupt};irq5dc.l{$82000000+NonHandledInterrupt};irq6dc.l{$82000000+NonHandledInterrupt};irq7dc.l{$82000000+NonHandledInterrupt};irq8dc.l{$82000000+NonHandledInterrupt};irq9dc.l{$82000000+NonHandledInterrupt};irq10dc.l{$82000000+NonHandledInterrupt};irq11dc.l{$82000000+NonHandledInterrupt};irq12dc.l{$82000000+NonHandledInterrupt};irq13dc.l{$82000000+NonHandledInterrupt};irq14dc.l{$82000000+NonHandledInterrupt};irq15dc.l{$82000000+NonHandledInterrupt};irq16dc.l{$82000000+NonHandledInterrupt};irq17dc.l{$82000000+NonHandledInterrupt};irq18dc.l{$82000000+NonHandledInterrupt};irq19dc.l{$82000000+NonHandledInterrupt};irq20dc.l{$82000000+NonHandledInterrupt};irq21dc.l{$82000000+NonHandledInterrupt};irq22dc.l{$82000000+NonHandledInterrupt};irq23dc.l{$82000000+NonHandledInterrupt};irq24dc.l{$82000000+NonHandledInterrupt};irq25dc.l{$82000000+NonHandledInterrupt};irq26dc.l{$82000000+NonHandledInterrupt};irq27dc.l{$82000000+NonHandledInterrupt};irq28dc.l{$82000000+NonHandledInterrupt};irq29end==========================User_register.asm====================== =stm8/;用户定义公用变量segment'ram0'BYTES;00-0F单元定义为字节变量(供主程序使用).R00.B ds.b1.R01.B ds.b1.R02.B ds.b1.R03.B ds.b1.R04.B ds.b1.R05.B ds.b1.R06.B ds.b1.R07.B ds.b1.R08.B ds.b1.R09.B ds.b1.R0A.B ds.b1.R0B.B ds.b1.R0C.B ds.b1.R0D.B ds.b1.R0E.B ds.b1.R0F.B ds.b1;10-1F单元定义为字节变量(供优先级为1中断服务程序使用).R10.B ds.b1.R11.B ds.b1.R12.B ds.b1.R13.B ds.b1.R14.B ds.b1.R15.B ds.b1.R16.B ds.b1.R17.B ds.b1.R18.B ds.b1.R19.B ds.b1.R1A.B ds.b1.R1B.B ds.b1.R1C.B ds.b1.R1D.B ds.b1.R1E.B ds.b1.R1F.B ds.b1;20-2F单元定义为字节变量(供优先级为2中断服务程序使用) .R20.B ds.b1.R21.B ds.b1.R22.B ds.b1.R23.B ds.b1.R24.B ds.b1.R25.B ds.b1.R26.B ds.b1.R27.B ds.b1.R28.B ds.b1.R29.B ds.b1.R2A.B ds.b1.R2B.B ds.b1.R2C.B ds.b1.R2D.B ds.b1.R2E.B ds.b1.R2F.B ds.b1;30-3F单元定义为字节变量(供优先级为3中断服务程序使用) .R30.B ds.b1.R31.B ds.b1.R32.B ds.b1.R33.B ds.b1.R34.B ds.b1.R35.B ds.b1.R36.B ds.b1.R37.B ds.b1.R38.B ds.b1.R39.B ds.b1.R3A.B ds.b1.R3B.B ds.b1.R3C.B ds.b1.R3D.B ds.b1.R3E.B ds.b1.R3F.B ds.b1;用户定义公用变量segment'ram1'WORDS;00-0F单元定义为字节变量(供主程序使用).R40.W ds.w1.R41.W ds.w1.R42.W ds.w1.R43.W ds.w1.R44.W ds.w1.R45.W ds.w1.R46.W ds.w1.R47.W ds.w1.R48.W ds.w1.R49.W ds.w1.R4A.W ds.w1.R4B.W ds.w1.R4C.W ds.w1.R4D.W ds.w1.R4E.W ds.w1.R4F.W ds.w1end========================define.inc I/O口引脚================;GPIO部分寄存器宏定义;******************************************************************** **********************************;GPIO PX_ODR;******************************************************************** **********************************;PA口输出数据锁存#define PA_ODR_ODR0PA_ODR,#0;PA口0位输出数据#define PA_ODR_ODR1PA_ODR,#1;PA口1位输出数据#define PA_ODR_ODR2PA_ODR,#2;PA口2位输出数据#define PA_ODR_ODR3PA_ODR,#3;PA口3位输出数据#define PA_ODR_ODR4PA_ODR,#4;PA口4位输出数据#define PA_ODR_ODR5PA_ODR,#5;PA口5位输出数据#define PA_ODR_ODR6PA_ODR,#6;PA口7位输出数据#define PA_ODR_ODR7PA_ODR,#7;PA口7位输出数据;PB口输出数据锁存#define PB_ODR_ODR0PB_ODR,#0;PB口0位输出数据#define PB_ODR_ODR1PB_ODR,#1;PB口1位输出数据#define PB_ODR_ODR2PB_ODR,#2;PB口2位输出数据#define PB_ODR_ODR3PB_ODR,#3;PB口3位输出数据#define PB_ODR_ODR4PB_ODR,#4;PB口4位输出数据#define PB_ODR_ODR5PB_ODR,#5;PB口5位输出数据#define PB_ODR_ODR6PB_ODR,#6;PB口7位输出数据#define PB_ODR_ODR7PB_ODR,#7;PB口7位输出数据;PC口输出数据锁存#define PC_ODR_ODR0PC_ODR,#0;PC口0位输出数据#define PC_ODR_ODR1PC_ODR,#1;PC口1位输出数据#define PC_ODR_ODR2PC_ODR,#2;PC口2位输出数据#define PC_ODR_ODR3PC_ODR,#3;PC口3位输出数据#define PC_ODR_ODR4PC_ODR,#4;PC口4位输出数据#define PC_ODR_ODR5PC_ODR,#5;PC口5位输出数据#define PC_ODR_ODR6PC_ODR,#6;PC口7位输出数据#define PC_ODR_ODR7PC_ODR,#7;PC口7位输出数据;PD口输出数据锁存#define PD_ODR_ODR0PD_ODR,#0;PD口0位输出数据#define PD_ODR_ODR1PD_ODR,#1;PD口1位输出数据#define PD_ODR_ODR2PD_ODR,#2;PD口2位输出数据#define PD_ODR_ODR3PD_ODR,#3;PD口3位输出数据#define PD_ODR_ODR4PD_ODR,#4;PD口4位输出数据#define PD_ODR_ODR5PD_ODR,#5;PD口5位输出数据#define PD_ODR_ODR6PD_ODR,#6;PD口7位输出数据#define PD_ODR_ODR7PD_ODR,#7;PD口7位输出数据;PE口输出数据锁存#define PE_ODR_ODR0PE_ODR,#0;PE口0位输出数据#define PE_ODR_ODR1PE_ODR,#1;PE口1位输出数据#define PE_ODR_ODR2PE_ODR,#2;PE口2位输出数据#define PE_ODR_ODR3PE_ODR,#3;PE口3位输出数据#define PE_ODR_ODR4PE_ODR,#4;PE口4位输出数据#define PE_ODR_ODR5PE_ODR,#5;PE口5位输出数据#define PE_ODR_ODR6PE_ODR,#6;PE口7位输出数据#define PE_ODR_ODR7PE_ODR,#7;PE口7位输出数据;******************************************************************** **********************************;GPIO PX_IDR;******************************************************************** **********************************;PA口输入数据寄存器,用来读取I/O口的电平状态#define PA_IDR_IDR1PA_IDR,#1;PA口对应位输入数据#define PA_IDR_IDR2PA_IDR,#2;PA口对应位输入数据#define PA_IDR_IDR3PA_IDR,#3;PA口对应位输入数据#define PA_IDR_IDR4PA_IDR,#4;PA口对应位输入数据#define PA_IDR_IDR5PA_IDR,#5;PA口对应位输入数据#define PA_IDR_IDR6PA_IDR,#6;PA口对应位输入数据#define PA_IDR_IDR7PA_IDR,#7;PA口对应位输入数据;PB口输入数据寄存器,用来读取I/O口的电平状态#define PB_IDR_IDR0PB_IDR,#0;PB口对应位输入数据#define PB_IDR_IDR1PB_IDR,#1;PB口对应位输入数据#define PB_IDR_IDR2PB_IDR,#2;PB口对应位输入数据#define PB_IDR_IDR3PB_IDR,#3;PB口对应位输入数据#define PB_IDR_IDR4PB_IDR,#4;PB口对应位输入数据#define PB_IDR_IDR5PB_IDR,#5;PB口对应位输入数据#define PB_IDR_IDR6PB_IDR,#6;PB口对应位输入数据#define PB_IDR_IDR7PB_IDR,#7;PB口对应位输入数据;PC口输入数据寄存器,用来读取I/O口的电平状态#define PC_IDR_IDR0PC_IDR,#0;PC口对应位输入数据#define PC_IDR_IDR1PC_IDR,#1;PC口对应位输入数据#define PC_IDR_IDR2PC_IDR,#2;PC口对应位输入数据#define PC_IDR_IDR3PC_IDR,#3;PC口对应位输入数据#define PC_IDR_IDR4PC_IDR,#4;PC口对应位输入数据#define PC_IDR_IDR5PC_IDR,#5;PC口对应位输入数据#define PC_IDR_IDR6PC_IDR,#6;PC口对应位输入数据#define PC_IDR_IDR7PC_IDR,#7;PC口对应位输入数据;PD口输入数据寄存器,用来读取I/O口的电平状态#define PD_IDR_IDR0PD_IDR,#0;PD口对应位输入数据#define PD_IDR_IDR1PD_IDR,#1;PD口对应位输入数据#define PD_IDR_IDR2PD_IDR,#2;PD口对应位输入数据#define PD_IDR_IDR3PD_IDR,#3;PD口对应位输入数据#define PD_IDR_IDR4PD_IDR,#4;PD口对应位输入数据#define PD_IDR_IDR5PD_IDR,#5;PD口对应位输入数据#define PD_IDR_IDR6PD_IDR,#6;PD口对应位输入数据#define PD_IDR_IDR7PD_IDR,#7;PD口对应位输入数据;PE口输入数据寄存器,用来读取I/O口的电平状态#define PE_IDR_IDR0PE_IDR,#0;PE口对应位输入数据#define PE_IDR_IDR1PE_IDR,#1;PE口对应位输入数据#define PE_IDR_IDR2PE_IDR,#2;PE口对应位输入数据#define PE_IDR_IDR3PE_IDR,#3;PE口对应位输入数据#define PE_IDR_IDR5PE_IDR,#5;PE口对应位输入数据#define PE_IDR_IDR6PE_IDR,#6;PE口对应位输入数据#define PE_IDR_IDR7PE_IDR,#7;PE口对应位输入数据;******************************************************************** **********************************;GPIO PX_DDR;******************************************************************** **********************************;PA数据传输方向控制寄存器#define PA_DDR_DDR0PA_DDR,#0;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR1PA_DDR,#1;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR2PA_DDR,#2;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR3PA_DDR,#3;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR4PA_DDR,#4;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR5PA_DDR,#5;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR6PA_DDR,#6;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR7PA_DDR,#7;PA口对应位数据传输方向控制__0:输入1:输出;PB数据传输方向控制寄存器#define PB_DDR_DDR0PB_DDR,#0;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR1PB_DDR,#1;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR2PB_DDR,#2;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR3PB_DDR,#3;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR4PB_DDR,#4;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR5PB_DDR,#5;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR6PB_DDR,#6;PB口对应位数据传输方向控制__0:输入1:输出1:输出;PC数据传输方向控制寄存器#define PC_DDR_DDR0PC_DDR,#0;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR1PC_DDR,#1;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR2PC_DDR,#2;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR3PC_DDR,#3;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR4PC_DDR,#4;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR5PC_DDR,#5;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR6PC_DDR,#6;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR7PC_DDR,#7;PC口对应位数据传输方向控制__0:输入1:输出;PD数据传输方向控制寄存器#define PD_DDR_DDR0PD_DDR,#0;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR1PD_DDR,#1;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR2PD_DDR,#2;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR3PD_DDR,#3;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR4PD_DDR,#4;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR5PD_DDR,#5;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR6PD_DDR,#6;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR7PD_DDR,#7;PD口对应位数据传输方向控制__0:输入1:输出;PE数据传输方向控制寄存器#define PE_DDR_DDR0PE_DDR,#0;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR1PE_DDR,#1;PE口对应位数据传输方向控制__0:输入1:输出1:输出#define PE_DDR_DDR3PE_DDR,#3;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR4PE_DDR,#4;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR5PE_DDR,#5;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR6PE_DDR,#6;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR7PE_DDR,#7;PE口对应位数据传输方向控制__0:输入1:输出;******************************************************************** **********************************;GPIO PX_CR1;******************************************************************** **********************************;PA相应端口模式控制寄存器;PA口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PA_CR1_C0PA_CR1,#0#define PA_CR1_C1PA_CR1,#1#define PA_CR1_C2PA_CR1,#2#define PA_CR1_C3PA_CR1,#3#define PA_CR1_C4PA_CR1,#4#define PA_CR1_C5PA_CR1,#5#define PA_CR1_C6PA_CR1,#6#define PA_CR1_C7PA_CR1,#7;PB相应端口模式控制寄存器;PB口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PB_CR1_C0PB_CR1,#0#define PB_CR1_C1PB_CR1,#1#define PB_CR1_C2PB_CR1,#2#define PB_CR1_C3PB_CR1,#3#define PB_CR1_C4PB_CR1,#4#define PB_CR1_C5PB_CR1,#5#define PB_CR1_C6PB_CR1,#6#define PB_CR1_C7PB_CR1,#7;PC相应端口模式控制寄存器;PC口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PC_CR1_C0PC_CR1,#0#define PC_CR1_C1PC_CR1,#1#define PC_CR1_C2PC_CR1,#2#define PC_CR1_C3PC_CR1,#3#define PC_CR1_C4PC_CR1,#4#define PC_CR1_C5PC_CR1,#5#define PC_CR1_C6PC_CR1,#6#define PC_CR1_C7PC_CR1,#7;PD相应端口模式控制寄存器;PD口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PD_CR1_C0PD_CR1,#0#define PD_CR1_C1PD_CR1,#1#define PD_CR1_C2PD_CR1,#2#define PD_CR1_C3PD_CR1,#3#define PD_CR1_C4PD_CR1,#4#define PD_CR1_C5PD_CR1,#5#define PD_CR1_C6PD_CR1,#6#define PD_CR1_C7PD_CR1,#7;PE相应端口模式控制寄存器;PE口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PE_CR1_C0PE_CR1,#0#define PE_CR1_C1PE_CR1,#1#define PE_CR1_C2PE_CR1,#2#define PE_CR1_C3PE_CR1,#3#define PE_CR1_C4PE_CR1,#4#define PE_CR1_C5PE_CR1,#5#define PE_CR1_C6PE_CR1,#6#define PE_CR1_C7PE_CR1,#7;******************************************************************** **********************************;GPIO PX_CR2;******************************************************************** **********************************;PA品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PA_CR2_C0PA_CR2,#0#define PA_CR2_C1PA_CR2,#1#define PA_CR2_C2PA_CR2,#2#define PA_CR2_C3PA_CR2,#3#define PA_CR2_C4PA_CR2,#4#define PA_CR2_C5PA_CR2,#5#define PA_CR2_C6PA_CR2,#6#define PA_CR2_C7PA_CR2,#7;PB品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PB_CR2_C0PB_CR2,#0#define PB_CR2_C1PB_CR2,#1#define PB_CR2_C2PB_CR2,#2#define PB_CR2_C3PB_CR2,#3#define PB_CR2_C4PB_CR2,#4#define PB_CR2_C5PB_CR2,#5#define PB_CR2_C6PB_CR2,#6#define PB_CR2_C7PB_CR2,#7;PC品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PC_CR2_C0PC_CR2,#0#define PC_CR2_C1PC_CR2,#1#define PC_CR2_C2PC_CR2,#2#define PC_CR2_C3PC_CR2,#3#define PC_CR2_C4PC_CR2,#4#define PC_CR2_C5PC_CR2,#5#define PC_CR2_C6PC_CR2,#6#define PC_CR2_C7PC_CR2,#7;PD品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PD_CR2_C0PD_CR2,#0#define PD_CR2_C1PD_CR2,#1#define PD_CR2_C2PD_CR2,#2#define PD_CR2_C3PD_CR2,#3#define PD_CR2_C4PD_CR2,#4#define PD_CR2_C5PD_CR2,#5#define PD_CR2_C6PD_CR2,#6#define PD_CR2_C7PD_CR2,#7;PE品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PE_CR2_C0PE_CR2,#0#define PE_CR2_C1PE_CR2,#1#define PE_CR2_C2PE_CR2,#2#define PE_CR2_C3PE_CR2,#3#define PE_CR2_C4PE_CR2,#4#define PE_CR2_C5PE_CR2,#5#define PE_CR2_C6PE_CR2,#6#define PE_CR2_C7PE_CR2,#7==========================User_register.inc======================= ;用户定义公用变量属性说明;00-0F单元定义为字节变量(供主程序使用)EXTERN R00.B;用户定义的变量EXTERN R01.B;用户定义的变量EXTERN R02.B;用户定义的变量EXTERN R03.B;用户定义的变量EXTERN R04.B;用户定义的变量EXTERN R05.B;用户定义的变量EXTERN R06.B;用户定义的变量EXTERN R07.B;用户定义的变量EXTERN R08.B;用户定义的变量EXTERN R09.B;用户定义的变量EXTERN R0A.B;用户定义的变量EXTERN R0B.B;用户定义的变量EXTERN R0C.B;用户定义的变量EXTERN R0D.B;用户定义的变量EXTERN R0E.B;用户定义的变量EXTERN R0F.B;用户定义的变量EXTERN R10.B;用户定义的变量EXTERN R11.B;用户定义的变量EXTERN R12.B;用户定义的变量EXTERN R13.B;用户定义的变量EXTERN R14.B;用户定义的变量EXTERN R15.B;用户定义的变量EXTERN R16.B;用户定义的变量EXTERN R17.B;用户定义的变量EXTERN R18.B;用户定义的变量EXTERN R19.B;用户定义的变量EXTERN R1A.B;用户定义的变量EXTERN R1B.B;用户定义的变量EXTERN R1C.B;用户定义的变量EXTERN R1D.B;用户定义的变量EXTERN R1E.B;用户定义的变量EXTERN R1F.B;用户定义的变量EXTERN R20.B;用户定义的变量EXTERN R21.B;用户定义的变量EXTERN R22.B;用户定义的变量EXTERN R23.B;用户定义的变量EXTERN R24.B;用户定义的变量EXTERN R25.B;用户定义的变量EXTERN R26.B;用户定义的变量EXTERN R27.B;用户定义的变量EXTERN R28.B;用户定义的变量EXTERN R29.B;用户定义的变量EXTERN R2A.B;用户定义的变量EXTERN R2B.B;用户定义的变量EXTERN R2C.B;用户定义的变量EXTERN R2D.B;用户定义的变量EXTERN R2E.B;用户定义的变量EXTERN R2F.B;用户定义的变量EXTERN R30.B;用户定义的变量EXTERN R31.B;用户定义的变量EXTERN R32.B;用户定义的变量EXTERN R33.B;用户定义的变量EXTERN R34.B;用户定义的变量EXTERN R35.B;用户定义的变量EXTERN R36.B;用户定义的变量EXTERN R37.B;用户定义的变量EXTERN R38.B;用户定义的变量EXTERN R39.B;用户定义的变量EXTERN R3A.B;用户定义的变量EXTERN R3B.B;用户定义的变量EXTERN R3C.B;用户定义的变量EXTERN R3D.B;用户定义的变量EXTERN R3E.B;用户定义的变量EXTERN R3F.B;用户定义的变量EXTERN R40.W;用户定义的变量EXTERN R41.W;用户定义的变量EXTERN R42.W;用户定义的变量EXTERN R43.W;用户定义的变量EXTERN R44.W;用户定义的变量EXTERN R45.W;用户定义的变量EXTERN R46.W;用户定义的变量EXTERN R47.W;用户定义的变量EXTERN R48.W;用户定义的变量EXTERN R49.W;用户定义的变量EXTERN R4A.W;用户定义的变量EXTERN R4B.W;用户定义的变量EXTERN R4C.W;用户定义的变量EXTERN R4D.W;用户定义的变量EXTERN R4E.W;用户定义的变量EXTERN R4F.W;用户定义的变量============================块编程========================== 3.3.3块编程Data EEPROM和FlashROM均支持块编程(块大小与芯片存储器密度有关,如表3-1所示),效率比字节、字编程要快得多,毕竟一次可同时写入一块(64字节或128字节),所不同的是块编程要求执行编程操作的程序代码必须部分(对于支持RWW功能的Data EEPROM至少要求数据装载程序段位于RAM中)、甚至全部位于RAM中,给程序编写带来了一定的难度。
pic12f629汇编实例
pic12f629汇编实例以下是一段使用PIC12F629微控制器的汇编代码示例,用于控制LED灯的闪烁:; 设置配置字__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _CP_OFF; 定义端口及变量STATUS equ 0x03GPIO equ 0x05count equ 0x06; 设置初始化org 0x00goto START; 中断处理org 0x04return; 主程序org 0x08START:; 设置端口方向bsf STATUS, 5 ; 切换到工作寄存器1bsf GPIO, 0 ; 将GP0设置为输出; 初始化计数器clrf count; 循环执行LOOP:; 延时incf count, f ; count自增movlw 0x0A ; 设置延时值subwf count, w ; 将延时值与count比较btfss STATUS, 2 ; 如果count小于延时值,则跳过下一条指令goto LOOP ; 继续循环; 改变LED状态clrf count ; 重置计数器btfsc GPIO, 0 ; 如果GP0当前为高电平,跳过下一条指令goto TURN_OFF ; 跳转到TURN_OFF标签bcf GPIO, 0 ; 将GP0置为低电平goto LOOP ; 返回循环TURN_OFF:; 延时incf count, f ; count自增movlw 0x0A ; 设置延时值subwf count, w ; 将延时值与count比较btfss STATUS, 2 ; 如果count小于延时值,则跳过下一条指令goto TURN_ON ; 跳转到TURN_ON标签bsf GPIO, 0 ; 将GP0置为高电平goto LOOP ; 返回循环上述代码实现了一个简单的LED闪烁效果。
程序开始时设置GPIO 端口GP0为输出,然后通过循环控制LED在亮和灭之间切换。
pic汇编实例
MCD1实战一,LED8位流水灯《霹雳灯》;该实战的目的作为学习和应用MCD1在线调试工具套件,进行项目的软件和硬件;联合调试的范例程序,也就是当做一个用户程序实例,而演示板暂时充当用户电;路的角色。
这样就构成了一个软件、硬件齐全的自制项目模拟环境。
;本程序实现的功能是,把端口RC的8条引脚全部设置为输出模式,依次从引脚RC0;到RC7送出高电平,然后再依次从引脚RC7到RC0送出高电平,并且周而复始,从而;使得与该端口C相连的8只发光二极管LED循环依次点亮,其效果类似于一个简单的霹雳灯。
;该程序可用于PIC16F87X(A)所有系列;PIC单片机学习网;************************************************;《霹雳灯》程序。
文件名为“mcd-led1.ASM”;**************************************************status equ 3h ;定义状态寄存器地址portc equ 7h ;定义端口C的数据寄存器地址trisc equ 87h ;定义端口C的方向控制寄存器地址flag equ 25h ;定义一个控制左移/右移的标志寄存器;***********************************************************org 000h ;定义程序存放区域的起始地址nop ;放置一条ICD必须的空操用指令bsf status,5 ;设置文件寄存器的体1movlw 00h ;对端口C的方向控制码00H先送Wmovwf trisc ;再由W转移到方向控制寄存器bcf status,5 ;恢复到文件寄存器体0movlw 01h ;将00000001B先送Wmovwf portc ;再由W转移到数据寄存器bsf flag,0 ;将左右移标志位置1,首先进行左移LEDbcf status,0 ;先清除C标志位loop btfss status,0 ;测试进位/借位位,是1则修改标志goto loop1 ;是0则不修改标志comf flag,1 ;FLAG的BIT0作为标志位,把它取反loop1 btfss flag,0 ;判断标志位,是1则跳到循环左移goto loop2 ;是0则跳到循环右移rlf portc,0 ;循环左移端口C数据寄存器,结果送Wmovwf portc ;将结果再送回端口C的数据寄存器goto loop3 ;跳过下面两条指令loop2 rrf portc,0 ;循环右移端口C数据寄存器,结果送回W movwf portc ;将结果再送回端口C的数据寄存器 ;loop3 call delay ;调用廷时子程序goto loop ;返回;-------------------------廷时子程序---------------------------- delay ;子程序名,也是子程序入口地址movlw 0ffh ;将外层循环参数值FFH经过Wmovwf 20h ;送入用作外循环变量的20H单元lp0 movlw 0ffh ;将内层循环参数值FFH经过W movwf 21h ;送入用作内循环变量的21H单元lp1 decfsz 21h,1 ;变量21H内容递减,若为0跳跃goto lp1 ;跳转到LP1处decfsz 20h,1 ;变量20H内容递减,若为0跳跃goto lp0 ;跳跃到LP0处return ;返回主程序end ;源程序结束;****************************************************************; 进入该实战演练的工序流程如下:; 1.软硬件的安装:按照本说明书前面讲的”MPLAB-ICD的安装和使用”一节内介绍的方法操作即可.; 2.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.; 3.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB; 并进入MPLAB的桌面.; 4.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将; 用记事本创建的源文件加入到该项目中.; 5.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).; 6.ICD参数设置:通过菜单命令Project>Edit Project或者Option>Development Mode,将开发模式设置为; ”MPLAB ICD Debugger”,点击OK按钮,打开ICD的工作窗口,在调试阶段,可以按照说明书图2-10设置各项,但需注意; OSCILLATOR应设置为XT方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用ICD方式调试。
汇编语言_24个汇编实例小程序
24个汇编小程序题目列表:逆序输出字符串“BASED ADDRESSING”从键盘上输入两个数,分别放到x,y单元,求出它们的和是编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来求出首地址为data的100个字数组中的最小偶数,并把它放在ax中输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match”从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。
如有,则把cl的第五位置1,否则将该位置置0在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f分别考虑有符号数、无符号数情况)一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一个程序,把既在A中又在B中出现的整数存放于数组C中设在A、B和D单元中分别存放着三个数。
若三个数都不是0,则求出三个数的和并存放在S单元,若其中有一个数为0,则把其它两个单元也清零。
请编写此程序从键盘输入一系列字符(以回车键结束),并按字母、数字和其他字符分类计数,最后显示这三类的计数结果已定义两个整数变量A和B,试编写程序完成以下功能(1)若两个树种有一个是奇数,则将奇数存入A中,偶数存入B中(2)若两个数均为奇数,则将两个数加1后存回原变量(3)若两个数均为偶数,则两个变量均不变写一段子程序skiplines,完成输出空行的功能。
第二章--第四节--汇编语言程序设计方法(二)
A+30HA A(22H) 结束
R0
0010 0000
END
BCD码十进制转换成二进制
例:假如在内部RAM40H单元中存储有一个压缩BCD编码 的两位十进制数,设计一段程序把这个数转换成二进制数 并存入41H单元中。 解题思路: (40H) 16 商为二进制的高四位
余数
余为二进制的低四位
将高四位乘以0AH,再加上低四位即可。
数据排序程序 例:将片内RAM中20H-27H中的数据按照从小到大的顺序重新排列。 解题思路:见下图
RAM地址 原始数据
20H 66H
21H 11H
22H 10H
23H 34H
24H 67H
25H 01H
26H 89H
27H A0H
1
2 3 4 5 6 7
01H
01H 01H 01H 01H 01H 01H
11H
10H 10H 10H 10H 10H 10H
10H
11H 11H 11H 11H 11H 11H
34H
34H 34H 34H 34H 34H 34H
51单片机汇编语言及C语言经典实例
51单片机汇编语言及C语言经典实例实验及课程设计51单片机汇编语言及C语言经典实例D1: MOV R6,#20D2: MOV R7,#248一、闪烁灯DJNZ R7,$ 如图1 所示为一简单单片机系统原理图:在 P1.0 DJNZ R6,D2 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。
DJNZ R5,D1 延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢,下面具体介绍其原理:如图 4.1.1 所示的石英晶体为12MHz,因此,1 个机器周期为 1 微秒,机器周期微秒如图 1 所示,当 P1.0 端口输出高电平,即 P1.0,1 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.0,0 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。
C 语言源程序#include <AT89X51.H> sbit L1=P1^0;void delay02s(void) //延时 0.2 秒子程序 {RET unsigned char i,j,k;图1 单片机原理图 END for(i=20;i>0;i--)for(j=20;j>0;j--) for(k=248;k>0;k--); }void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAY 图2 程序设计流程图LJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时 0.2 秒CLR P1.0SJMP NEX1二、多路开关状态指示如图 3 所示,AT89S51 单片机的 P1.0,P1.3 接四个发光二极管 L1,L4,P1.4,P1.7 接了四个开关 K1,K4,编程将开关的状态反映到发光二极管上。
汇编语言程序实例
汇编语言程序实例第一份:用汇编语言对4位10进制数加密。
密码是0123456789对应为9082746315。
DATA SEGMENTTABLE DB 39H,30H,38H,32H,37H,34H,36H,33H,31H,35H;密码表RESULT DB 4 DUP(?);四位十进制数对应的密码DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODEMAIN PROC FARMOV AX,DATAMOV DS,AXMOV ES,AXLEA BX,TABLELEA DI,RESULTMOV AX,1234;已知的四位十进制数,以下分别求四位十进制数位,并将密码存入RESULT 中MOV SI,1000CALL NUMBERMOV SI,100CALL NUMBERMOV SI,10CALL NUMBERMOV SI,1CALL NUMBERLEA DI,RESULT;在屏幕上依次显示四位加密后的十进制数MOV CX,4NEXT:MOV DL,[DI]MOV AH,2HINT 21HINC DILOOP NEXT;按任意键退出mov ah,1int 21hMOV AX,4C00HINT 21HMAIN ENDPNUMBER PROC NEARMOV DX,0DIV SIMOV SI,DXXLATSTOSBMOV AX,SIRETNUMBER ENDPCODE ENDSEND MAIN第二份:设有100个学生的成绩存放在RECORD为首地址的字节数据区中,试编写分支程序分别统计成绩为60~69分,70~79分,80~89分,90~99分,100分的人数(假设成绩都及格),分别存放在G6,G7,G8,G9,G10单元中.data segmentrecord db 100 dub (?)g6 db 0g7 db 0g8 db 0g9 db 0g10 db 0data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea si,recordmov cx,100next:mov al,[si]cmp al,60jb nextncmp al,70jnb next7inc g6jmp nextnnext7:cmp al,80jnb next8inc g7jmp nextnnext8:cmp al,90jnb next9inc g8jmp nextnnext9:cmp al,100jnb next10inc g9jmp nextnnext10:jne nextninc g10nextn:inc siloop nextmov ah,1int 21hmov ax,4c00hint 21hcode endsend start第三份:若自BLOCK开始的内存缓冲区中,有100个带符号的十六进制数,希望找到其中最大的一个值,并将它放到MAX单元中解:程序流程图如图所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
assume ds:data,cs:code,ss:stack
main:
mov ax,data
mov ds,ax
call clear
lop: lea dx,i1
Y db 0dh,0ah,'This is a leap year! $'
N db 0dh,0ah,'This is not a leap year! $'
w dw 0
buf db 8
db ?
db 8 dup(?)
1:判断闰年程序 2:产生随机数并计算程序 3:计算平台长度程序 4:加减乘除运算 5:数字方阵程序 6:数据加密程序 7:代码转换程序 8:键盘录入数据的转换与显示 9:音乐演奏 10:显示色彩矩形块 11、12:字符图形程序 13:图形变换 14、15:动画 16:打字练习 17:打字计时练习 18:系统时间显示 19:显示日期时间 20:七段电子表显示 21:简易文本编辑器 22:磁盘文件读写 23:成绩管理 24、25:pc机通信 26:钟表显示 27:霓虹灯模拟显示
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
int 21h
exit: mov ah,4ch
int 21h
datacate proc near;
push cx;
案例1判断闰年程序
说明:
这是一个判断某一年是否为润年的程序,运行可执行程序Ifleap.exe后,输入具体的年份,
可输出是本年是否为闰年的提示信息。
源码:
Delphi代码
data segment ;定义数据段
infon db 0dh,0ah,'Please input a year: $'
dec cx
lea si,buf+2
tt1: inc si
loop tt1
;lea si,cx[di]
pop cx
mov dl,79
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
mov ah,10
int 21h
mov cl, [buf+1]
lea di,buf+2
call datacate
call ifyears
Delphi代码
data segment
obf db '***** welcome you !*****',0dh,0ah
db ' input data:','$'
a0 db ?
a1 db ?
i2 db 0dh,0ah,'input error,please reinput!','$'
n db ?
b db 1
data ends
stack segment
db 100 dup(?)
stack ends
lab1: clc
jmp lab3
lab2: stc
lab3: pop dx
pop cx
pop bx
ret
mov ah,9
int 21h
mov ah,1
int 21h
cmp al,'q'
jz quit
lea si,buf1
mov n,7
mov cl,3
add w,ax
pop ax
mul bl
dec si
loop l1
ret
datacate endp
Delphi代码
data segment
buf1 db '1 2 38 9 47 6 5'
buf2 db '1 2 3 412 13 14 511 16 15 610 9 8 7'
buf3 db '1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9'
cmp dx,0
jnz lab2
mov ax,cx
mov bx,400
div bx
cmp dx,0
jz lab2
call clear
cmp al,'3'
jz s
lea si,buf2
mov n,10
mov cl,4
cmp al,'4'
jz s
mov bx,4
div bx
cmp dx,0
jnz lab1
mov ax,cx
mov bx,100
div bx
ifyears endp
code ends
end start
案例2数字方阵程序
说明:
该程序实现显示一个数字的方阵,程序中的清屏功能可将上次运行的结果
清除,重新显示下次运行结果。本程序在dos中或wiபைடு நூலகம்dows98中运行。
lea si,buf3
mov cl,5
mov n,13
cmp al,'5'
jz s
lea dx,i2
mov ah,9
int 21h
call clear
jmp lop
s:
mov bl,n
lea di,dbuf
l: mov al,[si]
mov [di],al
inc si
inc di
dec bl
dbuf db 14 dup(?)
i1 db 0dh,0ah,'this is a fangzhen programme'
db 0dh,0ah,'input q to exit'
db 0dh,0ah,'Please input a number(3--5):','$'
int 21h
inc b
loop s
jmp lop
quit: mov ah,4ch
int 21h
;***清屏***
clear proc near
code ends
end main
案例3计算平台长度程序
说明:
这是一个计算数字平台长度的程序,如:
运行时输入:
111122333,结果为:
4
1111
注:本程序在dos中或windows98中运行。
mov ds,ax
lea dx,infon ;在屏幕上显示提示信息
mov ah,9
int 21h
lea dx,buf ;从键盘输入年份字符串
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov dh,30h
mov bl,10
mov ax,1
l1: push ax
sub byte ptr [si],dh
mul byte ptr [si]
jne l
mov [di],byte ptr '$'
mov ah,2
mov dh,b
mov dl,0
int 10h
lea dx,dbuf
mov ah,9
jc a1
lea dx,n
mov ah,9
int 21h
jmp exit
a1: lea dx,y
mov ah,9
ifyears proc near
push bx
push cx
push dx
mov ax,w
mov cx,ax
mov dx,0