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

51单片机学习之汇编语言实验一

学51单片机的时候老师上课是用汇编语言教的,但实际应用中很少用到汇编语言,本次将学习期间做的实验分享出来,和刚刚学习51汇编的朋友一起学习,新手一个,有错望指正。

实验内容如下:

  • 实验一 P1口的应用
    在单片机的P1口的低四位接了四个LED灯,灯的接法是共阳极,高四位接了四个开关,开关闭和,相应管脚被拉成低电平。
    要求:
    K3 K2 K1 K0
    0 0 0 0 灯全亮
    0 0 0 1 灯全灭
    0 0 1 0 一灯亮其余灯灭并左循环
    0 0 1 1 一灯亮其余灯灭并右循环
    0 1 0 0 一灯灭其余灯亮并左循环
    0 1 0 1 一灯灭其余灯亮并右循环
    1 X X X 显示状态开关Ki为0,Li亮

我的代码如下:
;***** 2019-5-7 DXZ *******
;汇编语言作业-P1口的应用

;*****    2019-5-7 DXZ   *******      
;****汇编语言作业-P1口的应用****

 ORG    000H
		  
    Key_state  EQU 40H
    Key_data  EQU 41H
    Led_data  EQU 42H		
STRT: MOV    A, P1             ;取P1的值放入ACC
      SWAP   A                 ;ACC本身高低四位互换
	   ANL    A, #0FH           ;取原来A(也就是P1)的高四位,即开关的状态
	   MOV    Key_data, A            ;将A的值送入41H地址单元
	   MOV    Key_state, #0FFH        ;将0xFF送入40H,(开关状态改变,置1)
	  
MLP0: CJNE   A, #6, $ + 3       ;A中数据与6比较,是否相等都执行JNC那条指令
	                            ;即判断开关状态代表的值是否大于6
	  JNC    PK6                ;判断CY,为0则转移执行PK6处代码
	  MOV    DPTR, #CTAB       ;将CTAB数据表首地址传入DPTR
	  MOV    R1, A             ;把ACC的值送入R1
	  RL     A                 ;左移一位
	  ADD    A, R1             ;将A与R1的值相加后送回A(偏移量*3,三字节指令)
	  JMP    @A+DPTR           ;变址寻址,根据开关状态取CTAB对应指令
	  
	                           ;转移指令组成的指令表
CTAB: LJMP   PK0               ;灯全亮
      LJMP   PK1               ;灯全灭
	   LJMP   PK2               ;一个灯亮其他灯灭并循环左移
	   LJMP   PK3               ;一个灯亮其他灯灭并循环右移
	   LJMP   PK4               ;一个灯灭其他灯亮并循环左移
	   LJMP   PK5               ;一个灯灭其他灯亮并循环右移
	  
PK6:  MOV    Led_data, A            ;开关Kn闭合,电灯Ln亮(n为0-3)
      LJMP   MLP1
	  
PK5:  MOV    A, Key_state            ;0
      CJNE   A, #0FFH, PK51    ;比较转移,判断开关状态是否发生改变,未改变则跳转
      MOV    Led_data, #08H         ;05初状态,D3灭,其它亮
      LJMP   MLP1
	  
PK51: MOV    A, Led_data
      MOV    P2, Led_data
      RR     A                 ;X  
	  ANL    A, #0FH
	  JNZ    PK52              ;判断ACC是否不为0,即是否移位到0x01
	  MOV    A, #08H           ;重设初值
	  
PK52: MOV    Led_data, A
      LJMP   MLP1
	  
PK4:  MOV    A, Key_state 
      CJNE   A, #0FFH, PK41    ;比较转移,判断开关状态是否发生改变,
	  MOV    Led_data, #1           ;;04初状态,D0灭,其它亮
	  LJMP   MLP1     
PK41: MOV    A, Led_data
      RL     A
	  ANL    A, #0FH
	  JNZ    PK42              ;判断A是否为不为0,是则跳转
	  MOV    A, #1             ;04初状态,D0灭,其它亮
PK42: MOV    Led_data, A
      LJMP   MLP1
	  
PK3:  MOV    A, Key_state
      CJNE   A, #0FFH, PK31     ;比较转移,判断开关状态是否发生改变,
	  MOV    Led_data, #0F7H         ;03初状态,D3亮其它灯灭
	  LJMP   MLP1
	  
PK31: MOV    A, Led_data
      RR     A
	  ANL    A, #0FH
	  CJNE   A, #0FH, PK32
	  MOV    A, #0F7H
	  
PK32: ORL    A, #0F0H
      MOV    Led_data, A
	  LJMP   MLP1
	  
PK2:  MOV    A, Key_state            ;40H单元数据送A
      CJNE   A, #0FFH, PK21    ;比较转移,判断开关状态是否发生改变,
	                           ;未变则跳转执行PK21
	  MOV    Led_data, #0FEH        ;改变送0xFE至42H地址单元
      LJMP   MLP1              ;长跳转

PK21: MOV    A, Led_data            ;
      RL     A                 ;A中数据向左移位
	  ANL    A, #0FH           ;位与,结果放A(取低四位)
	  CJNE   A, #0FH, PK22     ;
	  MOV    A, #0FEH          ;
	  
PK22: ORL    A, #0F0H
      MOV    Led_data, A
	  LJMP   MLP1

PK1:  MOV    Led_data, #0FH          ;将16进制数0x0F送入42H地址单元
      LJMP   MLP1               ;跳转至MLP1代码段入口
	  
PK0:  MOV    Led_data, #0            ;42H储存灯的状态,4个灯全亮

                                   ;MLP1实现状态输出功能
MLP1: MOV    A, Led_data             ;将42H单元数据送A
      ORL    A, #0F0H             ;取低四位(并使高四位置1)
	   MOV    P1, A                 ;送P1口
	   MOV    R7, #3                ;延时外层(共三层)定初值,
	   MOV    R6, #0	               ;延时次外层层(共三层)定初值,
	   MOV    R5, #0
DEL1: DJNZ   R5, DEL1               ;本指令(内层)循环256次,共循环256*256*3次
      DJNZ   R6, DEL1               ;
	   DJNZ   R7, DEL1
	  MOV    A, P1                   ;取P1口状态
	  SWAP   A                       ;
	  ANL    A, #0FH                 ;高低位交换,取P1高位(读取开关状态)
	  CJNE   A, Key_data, MLP2       ;比较跳转,A与41H所存数据不相等则跳转至MLP2
	                                  ;即判断开关状态是否改变
	  MOV    Key_state, #0            ;开关状态没有改变,则往40H单元写0
	  LJMP   MLP0                   ;长跳转
	  
MLP2: MOV    Key_data, A            ;写入新的开关状态
      MOV    Key_state, #0FFH        ;开关状态发生改变,则往40H单元写1
	   LJMP   MLP0                  ;跳转至MLP0
	  	                            
     END                             ;伪指令,结束汇编程序
	  

下次分分享剩下的实验内容

你可能感兴趣的:(51单片机,基础知识)