求单片机(键盘输入LED显示)实验代码注释
主要是中间的中断部分,要详细,谢谢。回答的满意我会追加分!!!CPORTEQU5FFFH;8259控制端口地址DPORTEQU5EFFH??DBUFEQU30HORG00...
主要是中间的中断部分,要详细,谢谢。回答的满意我会追加分!!!
CPORT EQU 5FFFH ;8259控制端口地址
DPORT EQU 5EFFH ??
DBUF EQU 30H
ORG 0000H
LJMP START ;主程序入口地址
ORG 0013H
LJMP INT1 ;中断处理子程序入口
START: MOV SP,#6FH ; ??
MOV DPTR,#CPORT ;8259控制端口
MOV A,#0DCH ;清除命令字
MOVX @DPTR,A
CLEAN : MOVX A,@DPTR ;读状态字
JB ACC.7,CLEAN ;判断显示RAM是否可操作
MOV A,#00H ;方式命令字
MOVX @DPTR,A
MOV A,#2AH ;分频系数
MOVX @DPTR,A
MOV R7,#6H
MOV R0,#DBUF
MOV A,#10H ;设置显示缓存区内容
===========================================================
以下部分
CDBUF: MOV @R0,A
INC R0
DJNZ R7,CDBUF
LCALL DISP ??
CLR IT1 ;IT1清0,开外中断1
NOP ;空操作
SETB EA
NOP ;空操作
SETB EX1 ;置EX1(外部中断1中断允许位)为1
NOP ;空操作
CLEAN1: LJMP CLEAN1 ;等待中断
INT1: PUSH ACC
PUSH DPH
PUSH DPL
MOV DPTR,#CPORT
MOV A,#40H ;01000000B
MOVX @DPTR,A
MOV DPTR,#DPORT
MOVX A,@DPTR
MOV R7,#6H
MOV R0,#DBUF
MOV @R0,A
LCALL DISP
LCALL L_SHIFT
POP DPL
POP DPH
POP ACC
RETI
L_SHIFT:MOV R7,#6H
MOV R0,#DBUF+4
MOV R1,#DBUF+5
NEXT0: MOV A,@R0
MOV @R1,A
DEC R0
DEC R1
DJNZ R7,NEXT0
RET
以上部分
================================================================
DISP: MOV R7,#006H
MOV DPTR,#CPORT
MOV A,#092H
MOVX @DPTR,A
MOV R0,#DBUF ;R0中存放的是缓冲区的首地址
NEXTC: MOV A,@R0
MOV DPTR,#DCODE
MOVC A,@A+DPTR
MOV DPTR,#DPORT
MOVX @DPTR,A
INC R0
DJNZ R7,NEXTC
RET ;返回
DCODE: DB 0C0H,0F9H,0A4H,0B0H ; 字型编码表
DB 099H,092H,082H,0F8H
DB 080H,090H,088H,083H
DB 0C6H,0A1H,086H,08EH,0FFH
END 展开
CPORT EQU 5FFFH ;8259控制端口地址
DPORT EQU 5EFFH ??
DBUF EQU 30H
ORG 0000H
LJMP START ;主程序入口地址
ORG 0013H
LJMP INT1 ;中断处理子程序入口
START: MOV SP,#6FH ; ??
MOV DPTR,#CPORT ;8259控制端口
MOV A,#0DCH ;清除命令字
MOVX @DPTR,A
CLEAN : MOVX A,@DPTR ;读状态字
JB ACC.7,CLEAN ;判断显示RAM是否可操作
MOV A,#00H ;方式命令字
MOVX @DPTR,A
MOV A,#2AH ;分频系数
MOVX @DPTR,A
MOV R7,#6H
MOV R0,#DBUF
MOV A,#10H ;设置显示缓存区内容
===========================================================
以下部分
CDBUF: MOV @R0,A
INC R0
DJNZ R7,CDBUF
LCALL DISP ??
CLR IT1 ;IT1清0,开外中断1
NOP ;空操作
SETB EA
NOP ;空操作
SETB EX1 ;置EX1(外部中断1中断允许位)为1
NOP ;空操作
CLEAN1: LJMP CLEAN1 ;等待中断
INT1: PUSH ACC
PUSH DPH
PUSH DPL
MOV DPTR,#CPORT
MOV A,#40H ;01000000B
MOVX @DPTR,A
MOV DPTR,#DPORT
MOVX A,@DPTR
MOV R7,#6H
MOV R0,#DBUF
MOV @R0,A
LCALL DISP
LCALL L_SHIFT
POP DPL
POP DPH
POP ACC
RETI
L_SHIFT:MOV R7,#6H
MOV R0,#DBUF+4
MOV R1,#DBUF+5
NEXT0: MOV A,@R0
MOV @R1,A
DEC R0
DEC R1
DJNZ R7,NEXT0
RET
以上部分
================================================================
DISP: MOV R7,#006H
MOV DPTR,#CPORT
MOV A,#092H
MOVX @DPTR,A
MOV R0,#DBUF ;R0中存放的是缓冲区的首地址
NEXTC: MOV A,@R0
MOV DPTR,#DCODE
MOVC A,@A+DPTR
MOV DPTR,#DPORT
MOVX @DPTR,A
INC R0
DJNZ R7,NEXTC
RET ;返回
DCODE: DB 0C0H,0F9H,0A4H,0B0H ; 字型编码表
DB 099H,092H,082H,0F8H
DB 080H,090H,088H,083H
DB 0C6H,0A1H,086H,08EH,0FFH
END 展开
2个回答
展开全部
这是键盘显示芯片8279的驱动程序。
程序中,原来有一些注释,其中的8279,都误写成了8259。
尽量加写了一些注释,其中对8279的一些命令、数据,没有多写,建议楼主参考8279的资料。
CPORT EQU 5FFFH ;8259 {应该是8279} 控制端口地址
DPORT EQU 5EFFH ;?? 应该是8279 数据端口地址
DBUF EQU 30H
ORG 0000H
LJMP START ;主程序入口地址
ORG 0013H
LJMP INT1 ;中断处理子程序入口
START: ;主程序
MOV SP, #6FH ;???设定栈底
MOV DPTR, #CPORT ;8259 {应该是8279} 控制端口
MOV A, #0DCH ;清除命令字
MOVX @DPTR, A ;清除{8279}的显示内容
CLEAN :
MOVX A, @DPTR ;读{8279的}状态字
JB ACC.7, CLEAN ;判断显示RAM是否可操作
MOV A, #00H ;{8279}的方式命令字
MOVX @DPTR,A ;写入{8279}
MOV A, #2AH ;{8279}的分频系数
MOVX @DPTR,A ;写入{8279}
;=========================以上是设定8279的工作方式
MOV R7, #6H
MOV R0, #DBUF
MOV A, #10H ;设置显示缓存区内容
===========================================================
;以下部分
CDBUF:
MOV @R0, A
INC R0
DJNZ R7, CDBUF
;=========================以上是清除显示缓存区内容
LCALL DISP ;调用显示子程序
CLR IT1 ;IT1清0,开外中断1
NOP ;空操作
SETB EA
NOP ;空操作
SETB EX1 ;置EX1(外部中断1中断允许位)为1
NOP ;空操作
CLEAN1:
LJMP CLEAN1 ;等待中断
INT1: ;外部中断程序
PUSH ACC ;保护现场
PUSH DPH
PUSH DPL
MOV DPTR, #CPORT ;8279的控制端口
MOV A, #40H ;01000000B
MOVX @DPTR, A ;将40H当做命令写入8279
MOV DPTR, #DPORT ;8279的数据端口
MOVX A, @DPTR ;读出按键数值
MOV R7, #6H
MOV R0, #DBUF
MOV @R0, A ;按键数值写入显示缓冲区
LCALL DISP ;显示
LCALL L_SHIFT ; 显示缓冲区内容移位
POP DPL ;恢复现场
POP DPH
POP ACC
RETI ;中断程序结束
L_SHIFT: ; 显示缓冲区内容移位
MOV R7, #6H ; 移位6次
MOV R0, #DBUF+4
MOV R1, #DBUF+5
NEXT0:
MOV A, @R0 ;取第四个
MOV @R1, A ;送到第五个
DEC R0
DEC R1 ;修改地址号码
DJNZ R7, NEXT0 ;循环6次移位
RET
以上部分
================================================================
DISP:
MOV DPTR, #CPORT
MOV A, #092H
MOVX @DPTR, A
MOV R0, #DBUF ;R0中存放的是缓冲区的首地址
MOV R7, #06H
NEXTC:
MOV A, @R0
INC R0
MOV DPTR, #DCODE
MOVC A, @A+DPTR
MOV DPTR, #DPORT
MOVX @DPTR, A
DJNZ R7, NEXTC
RET ;返回
DCODE: DB 0C0H,0F9H,0A4H,0B0H ; 字型编码表
DB 099H,092H,082H,0F8H
DB 080H,090H,088H,083H
DB 0C6H,0A1H,086H,08EH,0FFH
END
程序中,原来有一些注释,其中的8279,都误写成了8259。
尽量加写了一些注释,其中对8279的一些命令、数据,没有多写,建议楼主参考8279的资料。
CPORT EQU 5FFFH ;8259 {应该是8279} 控制端口地址
DPORT EQU 5EFFH ;?? 应该是8279 数据端口地址
DBUF EQU 30H
ORG 0000H
LJMP START ;主程序入口地址
ORG 0013H
LJMP INT1 ;中断处理子程序入口
START: ;主程序
MOV SP, #6FH ;???设定栈底
MOV DPTR, #CPORT ;8259 {应该是8279} 控制端口
MOV A, #0DCH ;清除命令字
MOVX @DPTR, A ;清除{8279}的显示内容
CLEAN :
MOVX A, @DPTR ;读{8279的}状态字
JB ACC.7, CLEAN ;判断显示RAM是否可操作
MOV A, #00H ;{8279}的方式命令字
MOVX @DPTR,A ;写入{8279}
MOV A, #2AH ;{8279}的分频系数
MOVX @DPTR,A ;写入{8279}
;=========================以上是设定8279的工作方式
MOV R7, #6H
MOV R0, #DBUF
MOV A, #10H ;设置显示缓存区内容
===========================================================
;以下部分
CDBUF:
MOV @R0, A
INC R0
DJNZ R7, CDBUF
;=========================以上是清除显示缓存区内容
LCALL DISP ;调用显示子程序
CLR IT1 ;IT1清0,开外中断1
NOP ;空操作
SETB EA
NOP ;空操作
SETB EX1 ;置EX1(外部中断1中断允许位)为1
NOP ;空操作
CLEAN1:
LJMP CLEAN1 ;等待中断
INT1: ;外部中断程序
PUSH ACC ;保护现场
PUSH DPH
PUSH DPL
MOV DPTR, #CPORT ;8279的控制端口
MOV A, #40H ;01000000B
MOVX @DPTR, A ;将40H当做命令写入8279
MOV DPTR, #DPORT ;8279的数据端口
MOVX A, @DPTR ;读出按键数值
MOV R7, #6H
MOV R0, #DBUF
MOV @R0, A ;按键数值写入显示缓冲区
LCALL DISP ;显示
LCALL L_SHIFT ; 显示缓冲区内容移位
POP DPL ;恢复现场
POP DPH
POP ACC
RETI ;中断程序结束
L_SHIFT: ; 显示缓冲区内容移位
MOV R7, #6H ; 移位6次
MOV R0, #DBUF+4
MOV R1, #DBUF+5
NEXT0:
MOV A, @R0 ;取第四个
MOV @R1, A ;送到第五个
DEC R0
DEC R1 ;修改地址号码
DJNZ R7, NEXT0 ;循环6次移位
RET
以上部分
================================================================
DISP:
MOV DPTR, #CPORT
MOV A, #092H
MOVX @DPTR, A
MOV R0, #DBUF ;R0中存放的是缓冲区的首地址
MOV R7, #06H
NEXTC:
MOV A, @R0
INC R0
MOV DPTR, #DCODE
MOVC A, @A+DPTR
MOV DPTR, #DPORT
MOVX @DPTR, A
DJNZ R7, NEXTC
RET ;返回
DCODE: DB 0C0H,0F9H,0A4H,0B0H ; 字型编码表
DB 099H,092H,082H,0F8H
DB 080H,090H,088H,083H
DB 0C6H,0A1H,086H,08EH,0FFH
END
展开全部
这是键盘显示芯片8279的驱动程序。
程序中,原来有一些注释,其中的8279,都误写成了8259。
尽量加写了一些注释,其中对8279的一些命令、数据,没有多写,建议楼主参考8279的资料。
CPORT
EQU
5FFFH
;8259
{应该是8279}
控制端口地址
DPORT
EQU
5EFFH
;??
应该是8279
数据端口地址
DBUF
EQU
30H
ORG
0000H
LJMP
START
;主程序入口地址
ORG
0013H
LJMP
INT1
;中断处理子程序入口
START:
;主程序
MOV
SP,
#6FH
;???设定栈底
MOV
DPTR,
#CPORT
;8259
{应该是8279}
控制端口
MOV
A,
#0DCH
;清除命令字
MOVX
@DPTR,
A
;清除{8279}的显示内容
CLEAN
:
MOVX
A,
@DPTR
;读{8279的}状态字
JB
ACC.7,
CLEAN
;判断显示RAM是否可操作
MOV
A,
#00H
;{8279}的方式命令字
MOVX
@DPTR,A
;写入{8279}
MOV
A,
#2AH
;{8279}的分频系数
MOVX
@DPTR,A
;写入{8279}
;=========================以上是设定8279的工作方式
MOV
R7,
#6H
MOV
R0,
#DBUF
MOV
A,
#10H
;设置显示缓存区内容
===========================================================
;以下部分
CDBUF:
MOV
@R0,
A
INC
R0
DJNZ
R7,
CDBUF
;=========================以上是清除显示缓存区内容
LCALL
DISP
;调用显示子程序
CLR
IT1
;IT1清0,开外中断1
NOP
;空操作
SETB
EA
NOP
;空操作
SETB
EX1
;置EX1(外部中断1中断允许位)为1
NOP
;空操作
CLEAN1:
LJMP
CLEAN1
;等待中断
INT1:
;外部中断程序
PUSH
ACC
;保护现场
PUSH
DPH
PUSH
DPL
MOV
DPTR,
#CPORT
;8279的控制端口
MOV
A,
#40H
;01000000B
MOVX
@DPTR,
A
;将40H当做命令写入8279
MOV
DPTR,
#DPORT
;8279的数据端口
MOVX
A,
@DPTR
;读出按键数值
MOV
R7,
#6H
MOV
R0,
#DBUF
MOV
@R0,
A
;按键数值写入显示缓冲区
LCALL
DISP
;显示
LCALL
L_SHIFT
;
显示缓冲区内容移位
POP
DPL
;恢复现场
POP
DPH
POP
ACC
RETI
;中断程序结束
L_SHIFT:
;
显示缓冲区内容移位
MOV
R7,
#6H
;
移位6次
MOV
R0,
#DBUF+4
MOV
R1,
#DBUF+5
NEXT0:
MOV
A,
@R0
;取第四个
MOV
@R1,
A
;送到第五个
DEC
R0
DEC
R1
;修改地址号码
DJNZ
R7,
NEXT0
;循环6次移位
RET
以上部分
================================================================
DISP:
MOV
DPTR,
#CPORT
MOV
A,
#092H
MOVX
@DPTR,
A
MOV
R0,
#DBUF
;R0中存放的是缓冲区的首地址
MOV
R7,
#06H
NEXTC:
MOV
A,
@R0
INC
R0
MOV
DPTR,
#DCODE
MOVC
A,
@A+DPTR
MOV
DPTR,
#DPORT
MOVX
@DPTR,
A
DJNZ
R7,
NEXTC
RET
;返回
DCODE:
DB
0C0H,0F9H,0A4H,0B0H
;
字型编码表
DB
099H,092H,082H,0F8H
DB
080H,090H,088H,083H
DB
0C6H,0A1H,086H,08EH,0FFH
END
程序中,原来有一些注释,其中的8279,都误写成了8259。
尽量加写了一些注释,其中对8279的一些命令、数据,没有多写,建议楼主参考8279的资料。
CPORT
EQU
5FFFH
;8259
{应该是8279}
控制端口地址
DPORT
EQU
5EFFH
;??
应该是8279
数据端口地址
DBUF
EQU
30H
ORG
0000H
LJMP
START
;主程序入口地址
ORG
0013H
LJMP
INT1
;中断处理子程序入口
START:
;主程序
MOV
SP,
#6FH
;???设定栈底
MOV
DPTR,
#CPORT
;8259
{应该是8279}
控制端口
MOV
A,
#0DCH
;清除命令字
MOVX
@DPTR,
A
;清除{8279}的显示内容
CLEAN
:
MOVX
A,
@DPTR
;读{8279的}状态字
JB
ACC.7,
CLEAN
;判断显示RAM是否可操作
MOV
A,
#00H
;{8279}的方式命令字
MOVX
@DPTR,A
;写入{8279}
MOV
A,
#2AH
;{8279}的分频系数
MOVX
@DPTR,A
;写入{8279}
;=========================以上是设定8279的工作方式
MOV
R7,
#6H
MOV
R0,
#DBUF
MOV
A,
#10H
;设置显示缓存区内容
===========================================================
;以下部分
CDBUF:
MOV
@R0,
A
INC
R0
DJNZ
R7,
CDBUF
;=========================以上是清除显示缓存区内容
LCALL
DISP
;调用显示子程序
CLR
IT1
;IT1清0,开外中断1
NOP
;空操作
SETB
EA
NOP
;空操作
SETB
EX1
;置EX1(外部中断1中断允许位)为1
NOP
;空操作
CLEAN1:
LJMP
CLEAN1
;等待中断
INT1:
;外部中断程序
PUSH
ACC
;保护现场
PUSH
DPH
PUSH
DPL
MOV
DPTR,
#CPORT
;8279的控制端口
MOV
A,
#40H
;01000000B
MOVX
@DPTR,
A
;将40H当做命令写入8279
MOV
DPTR,
#DPORT
;8279的数据端口
MOVX
A,
@DPTR
;读出按键数值
MOV
R7,
#6H
MOV
R0,
#DBUF
MOV
@R0,
A
;按键数值写入显示缓冲区
LCALL
DISP
;显示
LCALL
L_SHIFT
;
显示缓冲区内容移位
POP
DPL
;恢复现场
POP
DPH
POP
ACC
RETI
;中断程序结束
L_SHIFT:
;
显示缓冲区内容移位
MOV
R7,
#6H
;
移位6次
MOV
R0,
#DBUF+4
MOV
R1,
#DBUF+5
NEXT0:
MOV
A,
@R0
;取第四个
MOV
@R1,
A
;送到第五个
DEC
R0
DEC
R1
;修改地址号码
DJNZ
R7,
NEXT0
;循环6次移位
RET
以上部分
================================================================
DISP:
MOV
DPTR,
#CPORT
MOV
A,
#092H
MOVX
@DPTR,
A
MOV
R0,
#DBUF
;R0中存放的是缓冲区的首地址
MOV
R7,
#06H
NEXTC:
MOV
A,
@R0
INC
R0
MOV
DPTR,
#DCODE
MOVC
A,
@A+DPTR
MOV
DPTR,
#DPORT
MOVX
@DPTR,
A
DJNZ
R7,
NEXTC
RET
;返回
DCODE:
DB
0C0H,0F9H,0A4H,0B0H
;
字型编码表
DB
099H,092H,082H,0F8H
DB
080H,090H,088H,083H
DB
0C6H,0A1H,086H,08EH,0FFH
END
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询