单片机期末复习(汇编)
一、1+2+3+…+n
ORG 0000H ;伪指令,定义下面的指令所在地址,此句为主程序开始地址
LJMP MAIN ;无条件转移到MAIN
MAIN:
MOV A,#100
MOV R3,A;100个数(循环100次)
MOV DPTR,#0;将DPTR置0
MOV A,#0
L:
MOV A,DPL; 将DPTR低八位拿出来
ADD A,R3; 与R3中的值相加 ①
MOV DPL,A; 送入DPTR低八位(0~128)
MOV A,DPH; 将DPTR的高八位(即高八位的原有值)送入A中
ADDC A,#0; 带进位+;A+0+CY(前一个加法①的进位)
MOV DPH,A; 放入送入DPTR高八位
DJNZ R3,L; R3的值减一
RET
END
二、10进制每秒加一
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TT0 //TT0处中断
GE1 DATA 41H
SH1 DATA 42H
BA1 DATA 43H
QI1 DATA 03H
L40 DATA 30H
L100 DATA 31H
DELAY DATA 32H
L250 DATA 33H
L4 DATA 34H
LX DATA 35H
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
ORG 0200H
MAIN:
MOV TMOD,#2
MOV TH0,#6
MOV TL0,#6
MOV R0,#00H
MOV GE1,#0
MOV SH1,#0
MOV BA1,#0
MOV QI1,#0
MOV P3,#0FFH
MOV DPTR,#TABLE
MOV L40,#40
MOV L100,#100
SETB ET0
SETB EA
SETB TR0
L0:
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.3
LCALL DLAY_1MS
CLR P3.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.2
LCALL DLAY_1MS
CLR P3.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.1
LCALL DLAY_1MS
CLR P3.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.0
LCALL DLAY_1MS
CLR P3.0
POP ACC
MOV R1,QI1
CJNE R1,#10,L0
LJMP L0
TT0: //中断
PUSH PSW
PUSH ACC
//使程序达到1s再继续执行
DJNZ L40,TTE
MOV L40,#40
DJNZ L100,TTE
MOV L100,#100
INC GE1
MOV A,#10
CJNE A,GE1,TTE
MOV GE1,#0
INC SH1
MOV A,#10
CJNE A,SH1,TTE
MOV SH1,#0
INC BA1
MOV A,#10
CJNE A,BA1,TTE
MOV BA1,#0
INC QI1
MOV A,#10
CJNE A,QI1,TTE
MOV QI1,#0
MOV BA1,#0
MOV GE1,#0
MOV SH1,#0
TTE: //中断返回
POP ACC
POP PSW
RETI
DLAY_1MS:
MOV L250,#250
MOV L4,#4
G0: DJNZ L4,G1
RET
G1: DJNZ L250,G1
MOV L250,#250
SJMP G0
END
另一种写法:
ORG 0000H ;复位入口
LJMP MAIN
ORG 000BH ;定时器中断程序T0_0入口
LJMP T0_0
A_BIT EQU 30H ;个位数存放处
B_BIT EQU 31H ;十位数存放处
C_BIT EQU 32H ;百位数存放处
D_BIT EQU 33H ;千位数存放处
TEMP EQU 34H ;计数器寄存器
TEMP1 EQU 35H ;计数器寄存器
TEMP2 EQU 36H ;计数器寄存器
ORG 0200H ;主程序入口
MAIN:
MOV TMOD,#01H ;T1设置为计数方式2:0110,T0设置为定时方式0:0000
MOV TH0,#3CH ;T0定时初值
MOV TL0,#0B0H ;此时中断为50ms
MOV R4,#20 ;需要中断20次,即20*50ms=1s,
SETB TR0 ;启动定时器T0
SETB EA ;开中断
SETB ET0 ;允许T0中断
START:
MOV TEMP2,#11; 初始化
MOV TEMP1,#97; 初始化
DISPLAY:
//个位与十位
MOV A,TEMP1
MOV B,#10
DIV AB ;十位在A,个位在B
MOV B_BIT,A ;个位十位放入
MOV A_BIT,B
//百位与千位
MOV A,TEMP2
MOV B,#10
DIV AB ;十位在A,个位在B
MOV D_BIT,A ;个位十位放入
MOV C_BIT,B
MOV DPTR,#TAB ;TAB表的值放入DPTR
//放入数码管
MOV A,A_BIT
MOVC A,@A+DPTR ;查找个位数的七段码
MOV P0,A ;送出个位的七段码
SETB P2.3 ;开个位显示,P2.3,P2.2控制是改变个位还是改变十位
ACALL DELAY
CLR P2.3
MOV A,B_BIT
MOVC A,@A+DPTR ;查找十位数的七段码
MOV P0,A
SETB P2.2
ACALL DELAY
CLR P2.2
MOV A,C_BIT
MOVC A,@A+DPTR ;查找十位数的七段码
MOV P0,A
SETB P2.1
ACALL DELAY
CLR P2.1
MOV A,D_BIT
MOVC A,@A+DPTR ;查找十位数的七段码
MOV P0,A
SETB P2.0
ACALL DELAY
CLR P2.0
MOV R0,TEMP2
CJNE R0,#100,DISPLAY
LJMP START
T0_0:
DJNZ R4,RE0 ;中断20次达到1s,再执行之后的计算
MOV R4,#20 ;达到1s后重新给r4赋20
INC TEMP1
MOV A,TEMP1
CJNE A,#100,RE0 ;个位十位满100则进一(继续执行),不满则跳转到DISPLAY
MOV TEMP1,#0
INC TEMP2 ;满100进1
MOV A,TEMP2
CJNE A,#100,RE0 ;计数到100,回到起始处
MOV TEMP2,#0
MOV TEMP1,#0
RETI ;中断返回
RE0:
RETI ;中断返回
DELAY:
MOV R6,#14H
DL1:
MOV R7,#19H
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;
END
三、16进制每秒加一
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TT0 //TT0处中断
GE1 DATA 41H
SH1 DATA 42H
BA1 DATA 43H
QI1 DATA 03H
L40 DATA 30H
L100 DATA 31H
DELAY DATA 32H
L250 DATA 33H
L4 DATA 34H
LX DATA 35H
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
ORG 0200H
MAIN:
MOV TMOD,#2
MOV TH0,#6
MOV TL0,#6
MOV R0,#00H
MOV GE1,#0
MOV SH1,#0
MOV BA1,#0
MOV QI1,#0
MOV P3,#0FFH
MOV DPTR,#TABLE
MOV L40,#40
MOV L100,#100
SETB ET0
SETB EA
SETB TR0
L0:
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.3
LCALL DLAY_1MS
CLR P3.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.2
LCALL DLAY_1MS
CLR P3.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.1
LCALL DLAY_1MS
CLR P3.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.0
LCALL DLAY_1MS
CLR P3.0
POP ACC
MOV R1,QI1
CJNE R1,#16,L0
LJMP L0
TT0: //中断
PUSH PSW
PUSH ACC
//使程序达到1s再继续执行
DJNZ L40,TTE
MOV L40,#40
DJNZ L100,TTE
MOV L100,#100
INC GE1
MOV A,#16
CJNE A,GE1,TTE
MOV GE1,#0
INC SH1
MOV A,#16
CJNE A,SH1,TTE
MOV SH1,#0
INC BA1
MOV A,#16
CJNE A,BA1,TTE
MOV BA1,#0
INC QI1
MOV A,#16
CJNE A,QI1,TTE
MOV QI1,#0
MOV BA1,#0
MOV GE1,#0
MOV SH1,#0
TTE: //中断返回
POP ACC
POP PSW
RETI
DLAY_1MS:
MOV L250,#250
MOV L4,#4
G0: DJNZ L4,G1
RET
G1: DJNZ L250,G1
MOV L250,#250
SJMP G0
END
四、10进制每秒减一
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TT0 //TT0处中断
GE1 DATA 41H
SH1 DATA 42H
BA1 DATA 43H
QI1 DATA 03H
L40 DATA 30H
L100 DATA 31H
DELAY DATA 32H
L250 DATA 33H
L4 DATA 34H
LX DATA 35H
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
ORG 0200H
MAIN:
MOV TMOD,#2
MOV TH0,#6
MOV TL0,#6
MOV R0,#00H
MOV GE1,#9
MOV SH1,#9
MOV BA1,#9
MOV QI1,#9
MOV P3,#0FFH
MOV DPTR,#TABLE
MOV L40,#40
MOV L100,#100
SETB ET0
SETB EA
SETB TR0
L0:
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.3
LCALL DLAY_1MS
CLR P3.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.2
LCALL DLAY_1MS
CLR P3.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.1
LCALL DLAY_1MS
CLR P3.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P2,A
SETB P3.0
LCALL DLAY_1MS
CLR P3.0
POP ACC
MOV R1,QI1
CJNE R1,#10,L0
LJMP L0
TT0: //中断
PUSH PSW
PUSH ACC
//使程序达到1s再继续执行
DJNZ L40,TTE
MOV L40,#40
DJNZ L100,TTE
MOV L100,#100
DEC GE1
MOV A,#0FFH
CJNE A,GE1,TTE
MOV GE1,#9
DEC SH1
MOV A,#0FFH
CJNE A,SH1,TTE
MOV SH1,#9
DEC BA1
MOV A,#0FFH
CJNE A,BA1,TTE
MOV BA1,#9
DEC QI1
MOV A,#0FFH
CJNE A,QI1,TTE
MOV QI1,#9
MOV BA1,#9
MOV GE1,#9
MOV SH1,#9
TTE: //中断返回
POP ACC
POP PSW
RETI
DLAY_1MS:
MOV L250,#250
MOV L4,#4
G0: DJNZ L4,G1
RET
G1: DJNZ L250,G1
MOV L250,#250
SJMP G0
END
五、按键加一减一
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTT0 //中断0
ORG 0013H
LJMP INTT1 //中断1
GE1 DATA 41H
SH1 DATA 42H
BA1 DATA 43H
QI1 DATA 03H
L40 DATA 30H
L100 DATA 31H
DELAY DATA 32H
L250 DATA 33H
L4 DATA 34H
LX DATA 35H
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
ORG 0200H
MAIN:
MOV R0,#00H
MOV GE1,#1
MOV SH1,#2
MOV BA1,#3
MOV QI1,#4
MOV P2,#0FFH
MOV DPTR,#TABLE
SETB IT0 ;选择下降沿触发
SETB EX0
SETB IT1 ;选择下降沿触发
SETB EX1
SETB EA
L0:
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.3
LCALL DLAY_1MS
CLR P2.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.2
LCALL DLAY_1MS
CLR P2.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DLAY_1MS
CLR P2.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DLAY_1MS
CLR P2.0
POP ACC
MOV R1,QI1
CJNE R1,#10,L0
LJMP L0
INTT0: //中断0,按键加一
INC GE1
MOV A,#10
CJNE A,GE1,TTE
MOV GE1,#0
INC SH1
MOV A,#10
CJNE A,SH1,TTE
MOV SH1,#0
INC BA1
MOV A,#10
CJNE A,BA1,TTE
MOV BA1,#0
INC QI1
MOV A,#10
CJNE A,QI1,TTE
MOV QI1,#0
MOV BA1,#0
MOV GE1,#0
MOV SH1,#0
INTT1: //中断1,按键减一
DEC GE1
MOV A,#0FFH
CJNE A,GE1,TTE
MOV GE1,#9
DEC SH1
MOV A,#0FFH
CJNE A,SH1,TTE
MOV SH1,#9
DEC BA1
MOV A,#0FFH
CJNE A,BA1,TTE
MOV BA1,#9
DEC QI1
MOV A,#0FFH
CJNE A,QI1,TTE
MOV QI1,#9
MOV BA1,#9
MOV GE1,#9
MOV SH1,#9
TTE: //中断返回
POP ACC
POP PSW
RETI
DLAY_1MS:
MOV L250,#250
MOV L4,#4
G0: DJNZ L4,G1
RET
G1: DJNZ L250,G1
MOV L250,#250
SJMP G0
END
六、按键加一减一+延时连续加
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTT0 //中断0
ORG 0013H
LJMP INTT1 //中断1
GE1 DATA 41H
SH1 DATA 42H
BA1 DATA 43H
QI1 DATA 03H
L40 DATA 30H
L100 DATA 31H
DELAY DATA 32H
L250 DATA 33H
L4 DATA 34H
LX DATA 35H
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
ORG 0200H
MAIN:
MOV R0,#00H
MOV GE1,#1
MOV SH1,#2
MOV BA1,#3
MOV QI1,#4
MOV P2,#0FFH
MOV DPTR,#TABLE
SETB IT0 ;选择下降沿触发
SETB EX0
SETB IT1 ;选择下降沿触发
SETB EX1
SETB EA
L0:
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.3
LCALL DLAY_1MS
CLR P2.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.2
LCALL DLAY_1MS
CLR P2.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DLAY_1MS
CLR P2.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DLAY_1MS
CLR P2.0
POP ACC
MOV R1,QI1
CJNE R1,#10,L0
LJMP L0
INTT0: //中断0,按键加一
LCALL DELAY1
JNB P3.2,CON0
INC GE1
MOV A,#10
CJNE A,GE1,TTE
MOV GE1,#0
INC SH1
MOV A,#10
CJNE A,SH1,TTE
MOV SH1,#0
INC BA1
MOV A,#10
CJNE A,BA1,TTE
MOV BA1,#0
INC QI1
MOV A,#10
CJNE A,QI1,TTE
MOV QI1,#0
MOV BA1,#0
MOV GE1,#0
MOV SH1,#0
INTT1: //中断1,按键减一
LCALL DELAY1
JNB P3.3,CON1
DEC GE1
MOV A,#0FFH
CJNE A,GE1,TTE
MOV GE1,#9
DEC SH1
MOV A,#0FFH
CJNE A,SH1,TTE
MOV SH1,#9
DEC BA1
MOV A,#0FFH
CJNE A,BA1,TTE
MOV BA1,#9
DEC QI1
MOV A,#0FFH
CJNE A,QI1,TTE
MOV QI1,#9
MOV BA1,#9
MOV GE1,#9
MOV SH1,#9
TTE: //中断返回
POP ACC
POP PSW
RETI
CON0: //连续加
MOV R0,#60
INC GE1
MOV A,#10
CJNE A,GE1,TTE0
MOV GE1,#0
INC SH1
MOV A,#10
CJNE A,SH1,TTE0
MOV SH1,#0
INC BA1
MOV A,#10
CJNE A,BA1,TTE0
MOV BA1,#0
INC QI1
MOV A,#10
CJNE A,QI1,TTE0
MOV QI1,#0
MOV BA1,#0
MOV GE1,#0
MOV SH1,#0
CON1: //连续减
MOV R0,#60
DEC GE1
MOV A,#0FFH
CJNE A,GE1,TTE1
MOV GE1,#9
DEC SH1
MOV A,#0FFH
CJNE A,SH1,TTE1
MOV SH1,#9
DEC BA1
MOV A,#0FFH
CJNE A,BA1,TTE1
MOV BA1,#9
DEC QI1
MOV A,#0FFH
CJNE A,QI1,TTE1
MOV QI1,#9
MOV BA1,#9
MOV GE1,#9
MOV SH1,#9
TTE0: //连续加显示
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.3
LCALL DLAY_1MS
CLR P2.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.2
LCALL DLAY_1MS
CLR P2.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DLAY_1MS
CLR P2.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DLAY_1MS
CLR P2.0
POP ACC
DJNZ R0,TTE0
LJMP CON0
TTE1: //连续减显示
PUSH ACC
MOV A,GE1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.3
LCALL DLAY_1MS
CLR P2.3
MOV A,SH1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.2
LCALL DLAY_1MS
CLR P2.2
MOV A,BA1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DLAY_1MS
CLR P2.1
MOV A,QI1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DLAY_1MS
CLR P2.0
POP ACC
DJNZ R0,TTE1
LJMP CON1
DLAY_1MS:
MOV L250,#250
MOV L4,#4
G0: DJNZ L4,G1
RET
G1: DJNZ L250,G1
MOV L250,#250
SJMP G0
DELAY1: //延时0.5S子程序
MOV 55H,#9
A3: MOV 54H,#94
A2: MOV 53H,#196
A1: NOP
DJNZ 53H,A1
DJNZ 54H,A2
DJNZ 55H,A3
RET
END