学51单片机的时候老师上课是用汇编语言教的,但实际应用中很少用到汇编语言,本次将学习期间做的实验分享出来,和刚刚学习51汇编的朋友一起学习,新手一个,有错望指正。
实验内容如下:
我的代码如下:
;***** 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 ;伪指令,结束汇编程序
下次分分享剩下的实验内容