单片机实验源汇编程序.docx
《单片机实验源汇编程序.docx》由会员分享,可在线阅读,更多相关《单片机实验源汇编程序.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机实验源汇编程序.docx](https://file1.bdocx.com/fileroot1/2023-1/23/098fb87e-cbca-4664-aeb7-48295ac92d0f/098fb87e-cbca-4664-aeb7-48295ac92d0f1.gif)
单片机实验源汇编程序
单片机实验源汇编程序
这是配套使用EL-8051-III型单片机实验箱的汇编代码
T1.1
NAMET1_1
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
MOVA,#0FEH
LOOP:
RLA
MOVP1,A
LCALLDELAY
JMPLOOP
DELAY:
MOVR1,#127
DEL1:
MOVR2,#200
DEL2:
DJNZR2,DEL2
DJNZR1,DEL1
RET
T1.2
NAMET1_2
OUTPORTEQU0CFA0H
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
MOVP1,#0FFH
MOVA,P1
MOVDPTR,#OUT_PORT
MOVX@DPTR,A
JMPSTART
END
T2
NAMET2
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
SETBP1.0
SETBP1.1
MOVA,P1
ANLA,#03H
MOVDPTR,#TAB
MOVCA,@A+DPTR
JMP@A+DPTR
TAB:
DBPRG0-TAB
DBPRG1-TAB
DBPRG2-TAB
DBPRG3-TAB
PRG0:
MOVP1,#0FFH
JMPSTART
PRG1:
MOVP1,#0F2H
ACALLDELAY
MOVP1,#0FFH
ACALLDELAY
JMPSTART
PRG2:
MOVP1,#0CDH
ACALLDELAY
MOVP1,#0FFH
ACALLDELAY
JMPSTART
PRG3:
MOVP1,#00H
JMPSTART
DELAY:
MOVR1,#5
DEL1:
MOVR2,#200
DEL2:
MOVR3,#126
DEL3:
DJNZR3,DEL3
DJNZR2,DEL2
DJNZR1,DEL1
RET
END
T3
NAMET3
PORTEQU0CFA0H
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
MOVA,#11H
ACALLDISP
ACALLDE3S
LLL:
MOVA,#12H
ACALLDISP
ACALLDE10S
MOVA,#10H
ACALLDISP
MOVR2,#05H
TTT:
MOVA,#14H
ACALLDISP
ACALLDE02S
MOVA,#10H
ACALLDISP
ACALLDE02S
DJNZR2,TTT
MOVA,#11H
ACALLDISP
ACALLDE02S
MOVA,#21H
ACALLDISP
ACALLDE10S
MOVA,#01H
ACALLDISP
MOVR2,#05H
GGG:
MOVA,#41H
ACALLDISP
ACALLDE02S
DJNZR2,GGG
MOVA,#03H
ACALLDISP
ACALLDE02S
JMPLLL
DE10S:
MOVR5,#100
JMPDE1
DE3S:
MOVR5,#30
JMPDE1
DE02S:
MOVR5,#02
DE1:
MOVR6,#200
DE2:
MOVR7,#126
DE3:
DJNZR7,DE3
DJNZR6,DE2
DJNZR5,DE1
RET
DISP:
MOVDPTR,#PORT
CPLA
MOVX@DPTR,A
RET
END
T4
NAMET4
CSEGAT0000H
LJMPSTART
CSEGAT4100H
INPORTEQU0CFA8H
OUTPORTEQU0CFB0H
START:
MOVDPTR,#INPORT
LOOP:
MOVXA,@DPTR
MOVDPTR,#OUTPORT
MOVX@DPTR,A
MOVR7,#10H
DEL0:
MOVR6,#0FFH
DEL1:
DJNZR6,DEL1
DJNZR7,DEL0
JMPSTART
END
T5
NAMET5
OUTPORTEQU0CFB0H
SAVEEQU55H
CSEGAT0000H
LJMPSTART
CSEGAT4003H
LJMPINT
CSEGAT4100H
START:
SETBIT0
SETBEX0
SETBEA
MOVA,#11H
MOVSAVE,A
ACALLDISP
ACALLDE3S
LLL:
MOVA,#12H
MOVSAVE,A
ACALLDISP
ACALLDE10S
MOVA,#10H
MOVSAVE,A
ACALLDISP
MOVR2,#05H
TTT:
MOVA,#14H
MOVSAVE,A
ACALLDISP
ACALLDE02S
MOVA,#10H
MOVSAVE,A
ACALLDISP
ACALLDE02S
DJNZR2,TTT
MOVA,#11H
MOVSAVE,A
ACALLDISP
ACALLDE02S
MOVA,#21H
MOVSAVE,A
ACALLDISP
ACALLDE10S
MOVA,#01H
MOVSAVE,A
ACALLDISP
MOVR2,#05H
GGG:
MOVA,#41H
MOVSAVE,A
ACALLDISP
ACALLDE02S
MOVA,#01H
MOVSAVE,A
ACALLDISP
ACALLDE02S
DJNZR2,GGG
MOVA,#11H
MOVSAVE,A
ACALLDISP
ACALLDE02S
JMPLLL
DE10S:
MOVR5,#100
JMPDE1
DE3S:
MOVR5,#30
JMPDE1
DE02S:
MOVR5,#02
DE1:
MOVR6,#200
DE2:
MOVR7,#126
DE3:
DJNZR7,DE3
DJNZR6,DE2
DJNZR5,DE1
RET
INT:
CLREA
PUSHACC
PUSHPSW
MOVA,R5
PUSHACC
MOVA,#11H
ACALLDISP
DEL10S:
MOVR3,#100
DEL1:
MOVR4,#200
DEL2:
MOVR5,#126
DEL3:
DJNZR5,DEL3
DJNZR4,DEL2
DJNZR3,DEL1
MOVA,SAVE
ACALLDISP
POPACC
MOVR5,A
POPPSW
POPACC
SETBEA
RETI
DISP:
MOVDPTR,#OUTPORT
CPLA
MOVX@DPTR,A
RET
END
T6
NAMET6
OUTPORTEQU0CFB0H
CSEGAT0000H
LJMPSTART
CSEGAT401BH
LJMPINT
CSEGAT4100H
START:
MOVA,#01H
MOVR1,#03H
MOVR0,#5H
MOVTMOD,#10H
MOVTL1,#0AFH
MOVTH1,#03CH
ORLIE,#88H
SETBTR1
LOOP1:
CJNER0,#00,DISP
MOVR0,#5H
INCR1
CJNER1,#31H,LOOP2
MOVR1,#03H
LOOP2:
MOVA,R1
MOVCA,@A+PC
JMPDISP
DB01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH
DB0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH
DB0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH
DB0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00H
DISP:
MOVP1,A
JMPLOOP1
INT:
CLRTR1
DECR0
MOVTL1,#0AFH
MOVTH1,#03CH
SETBTR1
RETI
END
T7
NAMET7
CSEGAT0000H
LJMPSTART
CSEGAT4100H
PAEQU0CFA0H
PBEQU0CFA1H
PCTLEQU0CFA3H
START:
MOVDPTR,#PCTL
MOVA,#82H
MOVX@DPTR,A
LOOP:
MOVDPTR,#PB
MOVXA,@DPTR
MOVDPTR,#PA
MOVX@DPTR,A
MOVR7,#10H
DEL0:
MOVR6,#0FFH
DEL1:
DJNZR6,DEL1
DJNZR7,DEL0
JMPLOOP
END
T8
NAMEt8;8255键盘实验
PAEQU0CFA0H
PBEQUPA+1
PC0EQUPB+1
PCTLEQUPC0+1
CSEGAT4000H
LJMPSTART
CSEGAT4100H
START:
MOV42H,#0FFH;42H中放显示的字符码,初值为0FFH
STA1:
MOVDPTR,#PCTL;设置控制字,ABC口工作于方式0
;AC口输出而B口用于输入
MOVA,#82H
MOVX@DPTR,A
LINE:
MOVDPTR,#PC0;将字符码从C口输出显示
MOVA,42H
CPLA
MOVX@DPTR,A
MOVDPTR,#PA;从A口输出全零到键盘的列线
MOVX@DPTR,A
MOVDPTR,#PB;从B口读入键盘行线值
MOVXA,@DPTR
MOV40H,A;行线值存于40H中
CPLA;取反后如为全零
;表示没有键闭合,继续扫描
JZLINE
MOVR7,#10H;有键按下,延时10MS去抖动
DL0:
MOVR6,#0FFH
DL1:
DJNZR6,DL1
DJNZR7,DL0
MOVDPTR,#PCTL;重置控制字,让A为输入,BC为输出
MOVA,#90H
MOVX@DPTR,A
MOVA,40H
MOVDPTR,#PB;刚才读入的行线值取出从B口送出
MOVX@DPTR,A
MOVDPTR,#PA;从A口读入列线值
MOVXA,@DPTR
MOV41H,A;列线值存于41H中
CPLA;取反后如为全零
JZSTA1;表示没有键按下
MOVDPTR,#TABLE;TABLE表首地址送DPTR
MOVR7,#18H;R7中置计数值16
MOVR6,#00H;R6中放偏移量初值
TT:
MOVXA,@DPTR;从表中取键码前半段字节,行线值与实
CJNEA,40H,NN1;际输入的行线值相等吗?
不等转NN1
INCDPTR;相等,指针指向后半字节,即列线值
MOVXA,@DPTR;列线值与实际输入的列线值
CJNEA,41H,NN2;相等吗?
不等转NN2
MOVDPTR,#CHAR;相等,CHAR表基址和R6中的偏移量
MOVA,R6;取出相应的字符码
MOVCA,@A+DPTR
MOV42H,A;字符码存于42H
BBB:
MOVDPTR,#PCTL;重置控制字,让AC为输出,B为输入
MOVA,#82H
MOVX@DPTR,A
AAA:
MOVA,42H;将字符码从C口送到二极管显示
MOVDPTR,#PC0
CPLA
MOVX@DPTR,A
MOVDPTR,#PA;判断按下的键是否释放
CLRA
MOVX@DPTR,A
MOVDPTR,#PB
MOVXA,@DPTR
CPLA
JNZAAA;没释放转AAA
MOVR5,#2;已释放则延时0.2秒,减少总线负担
DEL1:
MOVR4,#200
DEL2:
MOVR3,#126
DEL3:
DJNZR3,DEL3
DJNZR4,DEL2
DJNZR5,DEL1
JMPSTART;转START
NN1:
INCDPTR;指针指向后半字节即列线值
NN2:
INCDPTR;指针指向下一键码前半字节即行线值
INCR6;CHAR表偏移量加一
DJNZR7,TT;计数值减一,不为零则转TT继续查找
JMPBBB
TABLE:
DW0FE06H,0FD06H,0FB06H,0F706H;TABLE为键值表,每个键位占
DW0BF06H,07F06H,0FE05H,0FD05H;两个字节,第一个字节为行
DW0EF05H,0DF05H,0BF05H,07F05H;线值,第二个为列线值
DW0FB03H,0F703H,0EF03H,0DF03H;
CHAR:
DB00H,01H,02H,03H,04H,05H,06H,07H,08H,09H;字符码表
DB0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13H
DB14H,15H,16H,17H
END