51单片机汇编语言学习记录2

第一个实验:
题目:编程对开关的拨动次数进行计数。
连线:将P1.0口与开关相连,P2口连接八个LED灯作为结果计数结果的输出。

;******单片机实验3-key******
;******2019-5-17-DXZ*******

           ORG    0000H
	       LJMP   MAIN

           ORG    0030H
	       KEY_count EQU 60H       ;定义按键次数
		  
MAIN: 
           MOV    P2, #00H         ;初始换P2口
		   MOV    KEY_count, #00H  ;初始化按键次数
           MOV    C, P1.0		   	;读取按键状态送C
STAT:	   SETB   P1.0              ;设置当前P1.0状态,为读取做准备
           JNC    ANTHOR            ;判断上一次开关状态是否为0,为0跳转
           JB     P1.0, STAT        ;上次状态不为0,则判断这次是否为1,为1跳转继续读取
		   LJMP   KEYCOUNT          ;这次不为1,则跳转至按键次数加1代码
	       LJMP   STAT              ;继续读取
		      
		   
ANTHOR:    JB     P1.0, KEYCOUNT    ;上次状态为0,则判断这次状态是否为1
           LJMP   STAT              ;重新读取

KEYCOUNT:  MOV    C, P1.0           ;这次状态送C
           LCALL  DELAY             ;按键防抖
		   MOV    C, P1.0
           INC    KEY_count         ;按键次数加1
           MOV    P2, KEY_count     ;送至P2口显示
		   
		   LJMP   STAT
		   
DELAY:     MOV    R7, #10           ;延时10ms
           MOV    R6, #50
    DELAY1:DJNZ   R6, DELAY1
           DJNZ   R7, DELAY1
           RET		   
	      END		  

第二个实验:
题目:数据排序实验。
连线:对使用伪指令定义的片内RAM30H-39H十个单元的数据进行升序排序(单元数据初值自定),可使用大家比较熟悉的冒泡排序算法,排序后的数据以每两秒一个的方式通过P2口连接的八个LED灯显示输出。

;******单片机作业片ram数值排序*****
;******2019-5-21*DXZ**************
		  
      NUM1  DATA  30H              ;伪指令定义片内RAM单元
      NUM2  DATA  31H
      NUM3  DATA  32H 
      NUM4  DATA  33H
      NUM5  DATA  34H
      NUM6  DATA  35H
      NUM7  DATA  36H
      NUM8  DATA  37H 
      NUM9  DATA  38H
      NUM10 DATA  39H
	
	  LARGE    EQU  60H           ;放置要比较的数值 
	  ORG    0000H
      LJMP   MAIN
  
      ORG    0030H                 ;主函数起始地址
		  
MAIN: 
      MOV    NUM1, #3              ;向先前定义的RAM单元放置数值
      MOV    NUM2, #30
	  MOV    NUM3, #2
	  MOV    NUM4, #22
	  MOV    NUM5, #11
	  MOV    NUM6, #99
	  MOV    NUM7, #32
	  MOV    NUM8, #10
	  MOV    NUM9, #101
	  MOV    NUM10, #1
	  
	  
      MOV    R3, #8	            ;定义冒泡排序法的比较趟数
 STAT:MOV    R5, #9             ;定义排序法的一趟里比较的次数
      MOV    R0, #30H           ;初始地址送寄存器R0      
STAT1:MOV    A, @R0             ;寄存器间接寻址,送R0所指单元数至A
	  INC    R0                 ;指向下一地址单元
	  MOV    LARGE, @R0         ;寄存器间接寻址,送R0所指单元数至LARGE
	  CJNE   A, LARGE, $ + 3    ;比较A和LARGE里存放的数的大小
	  JNC    ANTHOR             ;A大,则跳转
	  LCALL  Exchange           ;LARGE大,则交换(调用交换子函数)
 BACK:DJNZ   R5, STAT1          ;次比较循环
      DJNZ   R3, STAT           ;趟比较循环
	  MOV    R5, #10            ;初始化P2口输出次数
	  MOV    R0,#30H            ;指向定义单元首地址
P2OUT:MOV    P2, @R0            ;输出排序后的结果
	  LCALL  DELAY              ;延时
	  INC    R0                 ;移向下一个数
	  DJNZ   R5,P2OUT           ;循环10次
	  
	  SJMP   $                 
	  
	  
	  
	  
	  
                               
ANTHOR:  LJMP  BACK      ;前一个数大,则不交换

Exchange:MOV @R0, A      ;前一个数小,将前一个数放在后一个数的位置
		 DEC R0          ;地址前移
		 MOV @R0, LARGE  ;后一个数放前一个数的位置
		 INC R0          
		 RET
		 
		 
		 
DELAY: MOV    R7, #20    ;延时子函数,延时2S
       MOV    R6, #200
       MOV    R4, #250
DELAY1:DJNZ   R4,DELAY1
	   DJNZ   R6,DELAY1
	   DJNZ   R7,DELAY1
       RET
	   
     END
	  
	  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值