本帖最后由 wdliming 于 2012-6-15 12:49 编辑
如题!之前编了个C语言的,现在说出版方要求再用汇编来实现,感觉现在的教材真是有点。。呵呵,我都基本不看汇编了,而且感觉汇编迟早是要淘汰的,就像过去的A和B语言,不都被C语言替代了?汇编,感觉太难了,现成的代码都看不懂,一会一个跳转,有点晕。。各位网友有啥看法啊,畅所欲言啊!
介于网友的讨论,我下了一个汇编代码,改了几个引脚之后,可以再板子(和TX-1的板子兼容)上是运行起来了,可是有些语句不咋理解,希望高手们能否就相关关键语句注释一下啊?谢谢!
;******************************************************
;功能:DS18B20读写,用1602显示
;晶振频率:12MHz
;*********端口定义*****************
IBUS BIT P2.2 ;18B20总线端口
TMB BIT 20H ;TM卡检测标志
RED0 EQU 50H ;存储区首址
CRC EQU 5FH ;校验码存储单元
TEMC EQU 5EH
TEMH EQU 29H ;存储温度的高8位
TEML EQU 28H ;存储温度的低8位
TEMX EQU 5BH
;********************************
;显示器的端口定义
RSPIN BIT P3.5
RWPIN BIT P3.6
EPIN BIT P3.4
;*********************************
DY BIT 20H
DIP0 EQU 60H
DIP1 EQU 61H
DIP2 EQU 62H
DIP3 EQU 63H
DIP4 EQU 64H
DIP5 EQU 65H
DIP6 EQU 66H
DIP7 EQU 67H
DIP8 EQU 68H
DIP9 EQU 69H
DIPA EQU 6AH
DIPB EQU 6BH
DIPC EQU 6CH
DIPD EQU 6DH
DIPE EQU 6EH
DIPF EQU 6FH
KG0 EQU 70H
KG1 EQU 71H
KG2 EQU 72H
KG3 EQU 73H
KG4 EQU 74H
KG5 EQU 75H
KG6 EQU 76H
KG7 EQU 77H
KG8 EQU 78H
KG9 EQU 79H
KGA EQU 7AH
KGB EQU 7BH
KGC EQU 7CH
KGD EQU 7DH
KGE EQU 7EH
KGF EQU 7FH
XPOS EQU 30H
YPOS EQU 31H
ORG 0000H
AJMP MAIN ;转到主程序区
ORG 0030H
MAIN: ACALL LCDCSH
MOV R0,#50H ;清存储单元
MOV R1,#48
LOOP1: MOV @R0,#0
INC R0
DJNZ R1,LOOP1
MOV R0,#DIP0
MOV R1,#32
MOV DPTR,#TAB1
CSL: MOV A,#0
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R1,CSL
ACALL DIP
DS1820: LCALL INT ;调用初始化程序
JB TMB,DS1820 ;0则程序往下执行
MOV A,#0CCH ;送立即数到寄存器A中
LCALL WRITE ;调用写子程序
MOV A,#44H
LCALL WRITE
JNB IBUS,$
LCALL D10MS
LCALL INT
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE
MOV R0,#TEML
MOV R1,#2
TEMP: LCALL READ
MOV @R0,A
INC R0
DJNZ R1,TEMP
LCALL TEMPDIS
LCALL DDIP
LCALL DIP
LCALL D400MS
LJMP DS1820
;***************************************
;**************初始化子程序*************
;***************************************
INT: CLR EA ;关中断
CLR IBUS ;拉底总线
MOV R2,#0FFH ;总线保持底电平至少480微秒
DJNZ R2,$
SETB IBUS ;拉高总线为1
MOV R2,#50H ;送延时时间
ASK_L: JNB IBUS,ASK ;检测总线状态,为0时,说明的应答,则跳转到ASK_L。
;为1则没有器件或没有检测到,
DJNZ R2,ASK_L ;时间到?没有则转到ASK_L,继续检测总线状态
SETB TMB ;延时时间结束,置标志位TMB为1
ASK_E: SETB IBUS ;恢复总线,使总线处于空闲状态
RET ;子程序返回
ASK: CLR TMB ;标志位清0
MOV R2,#120
DJNZ R2,$
AJMP ASK_E ;跳转到ASK_E
;***************************************
;**************写数据子程序*************
;***************************************
WRITE: MOV R3,#8 ;送位数
WRI_L: CLR IBUS ;拉底总线为0
RRC A ;A中数据右移一位
MOV R2,#5
DJNZ R2,$
MOV IBUS,C ;数据送到总线
MOV R2,#40 ;延时80微秒,以完成一个写时序
DJNZ R2,$
SETB IBUS ;拉高总线为1;恢复总线状态,
NOP ;使总线处于空闲状态
DJNZ R3,WRI_L ;是否写完一个字节?否则转到WRI_L传送下一个字节
SETB IBUS ;恢复总线空闲状态
NOP
RET ;子程序返回
;***************************************
;**************读数据子程序*************
;***************************************
READ: MOV R2,#8;数据一共有8位
RE01: CLR C
SETB IBUS
NOP
NOP
CLR IBUS
NOP
NOP
NOP
SETB IBUS
MOV R3,#5
RE10: DJNZ R3,RE10
MOV C,IBUS
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
RET ;子程序返回
;************延时子程序***************
D1MS: MOV R2,#2
D1S: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,D1S
RET
D10MS: MOV R2,#20
DMS: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,DMS
RET
D5MS: MOV R5,#0AH
DL: MOV R6,#0FFH
DJNZ R6,$
DJNZ R5,DL
RET
D400MS: MOV R6,#10 ;延时子程序(400MS)
DL4_PA: MOV R2,#100
DL4_PB: MOV R5,#100
DJNZ R5,$
DJNZ R2,DL4_PB
DJNZ R6,DL4_PA
RET
D100MS: MOV R2,#60
DMSS: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,DMSS
RET
TEMPDIS: MOV A,TEML
MOV C,48H
RRC A
MOV C,49H
RRC A
MOV C,4AH
RRC A
MOV C,4BH
JNC TEMN0
MOV TEMC,#17
RRC A
CPL A
AJMP RRCA
TEMN0: MOV TEMC,#16
RRC A
RRCA: MOV TEML,A
JNC NET
MOV TEMX,#5
AJMP TEME
NET: MOV TEMX,#0
TEME: RET
DDIP: MOV DPTR,#TAB
MOV A,TEML
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV KG4,A
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV KG6,A
MOV A,B
MOVC A,@A+DPTR
MOV KG7,A
MOV A,TEMC
MOVC A,@A+DPTR
MOV KG4,A
MOV A,TEMX
MOVC A,@A+DPTR
MOV KG9,A
RET
;********************显示编码**************
TAB: DB '0','1','2','3','4','5','6','7','8','9'
DB 'A','B','C','D','E','F','+','-','.'
TAB1: DB "Temperature Test"
DB " +000.0/C "
;******************************************
;****************显示子程序*****************
DIP: MOV XPOS,#0
MOV YPOS,#0
MOV 34H,#DIP0
LEE1: MOV R0,34H
ACALL LCDWRI
INC 34H
INC XPOS
MOV A,XPOS
CJNE A,#16,LEE1
MOV XPOS,#0
INC YPOS
MOV A,YPOS
CJNE A,#2,LEE1
MOV YPOS,#0
MOV XPOS,#0
MOV 34H,#DIP0
RET
LCDWRI: ACALL LCDPOS
MOV A,@R0
ACALL LCDWRD
RET
LCDWRD: ACALL WAIT
SETB RSPIN
CLR RWPIN
MOV P0,A
SETB EPIN
NOP
CLR EPIN
RET
LCDPOS: ANL XPOS,#0FH
ANL YPOS,#01H
MOV A,YPOS
CJNE A,#0,ERT
MOV A,XPOS
AJMP ERT0
ERT: MOV A,XPOS
ORL A,#40H
ERT0: ORL A,#80H
ACALL LCDWC
RET
LCDCSH: CALL D5MS
CALL D5MS
CALL D5MS
MOV A,#38H
ACALL LCDWCN
CALL D5MS
MOV A,#38H
ACALL LCDWCN
CALL D5MS
MOV A,#38H
ACALL LCDWCN
MOV A,#38H
ACALL LCDWC
MOV A,#08H
ACALL LCDWC
MOV A,#01H
ACALL LCDWC
MOV A,#06H
ACALL LCDWC
MOV A,#0CH
ACALL LCDWC
RET
LCDWC: ACALL WAIT
LCDWCN: CLR RSPIN
CLR RWPIN
MOV p0,A
SETB EPIN
NOP
CLR EPIN
RET
WAIT: PUSH ACC
MOV p0,#0FFH
CLR RSPIN
SETB RWPIN
SETB EPIN
WAIT1: NOP
JB p0.7,WAIT1
CLR EPIN
POP ACC
RET
END |