一、按键控制流水灯
详细说明:利用单片机、按键和LED小灯,构成一个LED灯控制电路,上电时,点亮一位LED,按下K1时,LED向左移一位,按下K2时,LED向右移一位。
ORG 0000H
AJMP START
ORG 0100H
START: MOV A,#0FEH
MOV P1,A ;初始化
MAIN: JNB P3.0,K1 ;按键按下跳转到k1
JNB P3.1,K2 ;按键按下跳转到k2
SJMP MAIN
K1: LCALL DELAYMS ;软件延时消抖
JNB P3.0,K11
SJMP MAIN
K11:RR A
MOV P1,A
LCALL DELAY
SJMP MAIN
K2: LCALL DELAYMS
JNB P3.1,K22
SJMP MAIN
K22:RL A
MOV P1,A
LCALL DELAY
SJMP MAIN
DELAYMS:MOV R3,#60
D0:MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
DELAY:MOV R5,#20;延时0.2s
D1:MOV R6,#20
D2:MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
二、按键控制数码管显示
详细说明:通过按键实现数码管显示0-255,Key1按下加1,Key2按下减1
ZXMADDR EQU P1 ;字形码锁存器地址
COUNT EQU 20H
ORG 0000H
ST: LJMP START
ORG 0100H
START: MOV COUNT,#0000H
MAIN: MOV A,COUNT
JNB P3.2,K1
JNB P3.3,K2
MOV B,#10
DIV AB
MOV 36H,B
MOV B,#10
DIV AB
MOV 37H,B
MOV 38H,A
MOV DPTR,#TABLE
MOV A,36H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.4
CLR P3.0
LCALL DELAY1MS
MOV A,37H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.0
CLR P3.1
LCALL DELAY1MS
MOV A,38H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.1
CLR P3.4
LCALL DELAY1MS
SJMP MAIN
K1: LCALL DELAYMS
JNB P3.2,K11
SJMP MAIN
K11: INC COUNT
MOV A,COUNT
LCALL DELAY
SJMP MAIN
K2: LCALL DELAYMS
JNB P3.3,K22
SJMP MAIN
K22: DEC COUNT
MOV A,COUNT
LCALL DELAY
SJMP MAIN
DELAYMS:MOV R3,#60 ;30MS
D0: MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
DELAY: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1MS:MOV R3,#2 ;1MS
D3: MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
TABLE: DB 3FH ;"0" 共阴极对应反码表
DB 06H ;"1"
DB 5BH ;"2"
DB 4FH ;"3"
DB 66H ;"4"
DB 6DH ;"5"
DB 7DH ;"6"
DB 07H ;"7"
DB 7FH ;"8"
DB 6FH ;"9"
END
三、外部中断控制数码管12归1
详细说明:按键申请外部中断,中断一次,数码管显示的数加1,用2位数码管动态显示计数,计数到12归0。
ZXMADDR EQU P1 ;字形码锁存器地址
COUNT EQU 20H
ORG 0000H
AJMP START
ORG 0003H ;外部中断0中断地址
AJMP EX0_INTERRUPT ;外部中断0响应函数
ORG 0013H ;外部中断1中断地址
AJMP EX1_INTERRUPT ;外部中断1响应函数
ORG 0030H
START:
MOV COUNT,#0000H
ACALL EX_INIT
MIANLOOP:
MOV R5,COUNT
CJNE R5,#13,LOOP1
MOV COUNT,#0000H
LOOP1: CJNE R5,#255,LOOP
MOV COUNT,#12
LOOP: MOV A,COUNT
MOV B,#10
DIV AB
MOV 36H,B
MOV 37H,A
MOV DPTR,#TABLE
MOV A,36H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.1
CLR P3.0
LCALL DELAY1MS
MOV A,37H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.0
CLR P3.1
LCALL DELAY1MS
AJMP MIANLOOP
EX_INIT: ;EX INIT 外部中断0和外部中断1初始化并使能
SETB IT0
SETB IT1
SETB EX0
SETB EX1
SETB EA
RET
EX0_INTERRUPT: ;EX0_INTERRUPT 外部中断0的中断服务函数
PUSH ACC
PUSH PSW
INC COUNT
MOV A,COUNT
POP PSW
POP ACC
RETI ;EX1_INTERRUPT 外部中断1的中断服务函数
EX1_INTERRUPT:
PUSH ACC
PUSH PSW
DEC COUNT
MOV A,COUNT
POP PSW
POP ACC
RETI
;延时函数
DELAYMS:MOV R3,#60 ;30MS延时程序
D0: MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
DELAY: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1MS:MOV R3,#2 ;1MS延时程序
D3: MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
TABLE: DB 3FH ;"0" 共阴极对应反码表
DB 06H ;"1"
DB 5BH ;"2"
DB 4FH ;"3"
DB 66H ;"4"
DB 6DH ;"5"
DB 7DH ;"6"
DB 07H ;"7"
DB 7FH ;"8"
DB 6FH ;"9"
END
四、定时器中断实现59归0
详细说明:利用定时器中断,实现计时,每秒计数加1,并显示在2位数码管上,计数到59归0;
ZXMADDR EQU P1 ;字形码锁存器地址
COUNT EQU 20H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIMER0
ORG 0030H
MAIN:
MOV R0,#20 ;循环20次
MOV COUNT,#0000H
MOV TMOD,#01H ;工作方式1
MOV TH0,#3CH ;计数器初值
MOV TL0,#0B0H
SETB ET0 ;开启定时/计数器(T0)中断允许位
SETB EA ;开启总中断
SETB TR0 ;开启定时/计数器(T0)运行控制位,为1时启动定时计数
LOOP:
MOV R5,COUNT
CJNE R5,#60,LOOP1
MOV COUNT,#0000H
LOOP1: MOV A,COUNT
MOV B,#10
DIV AB
MOV 36H,B
MOV 37H,A
MOV DPTR,#TABLE
MOV A,36H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.1
CLR P3.0
LCALL DELAY1MS
MOV A,37H
MOVC A,@A+DPTR
MOV ZXMADDR,A
SETB P3.0
CLR P3.1
LCALL DELAY1MS
AJMP LOOP
TIMER0:
MOV TH0,#3CH ;重装初值
MOV TL0,#0B0H
DJNZ R0,EXIT
MOV R0,#20
INC COUNT
MOV A,COUNT
EXIT:
RETI
;延时函数
DELAYMS:MOV R3,#60 ;30MS延时程序
D0: MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
DELAY: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1MS:MOV R3,#2 ;1MS延时程序
D3: MOV R4,#248
DJNZ R4,$
DJNZ R3,D0
RET
TABLE: DB 3FH ;"0" 共阴极对应反码表
DB 06H ;"1"
DB 5BH ;"2"
DB 4FH ;"3"
DB 66H ;"4"
DB 6DH ;"5"
DB 7DH ;"6"
DB 07H ;"7"
DB 7FH ;"8"
DB 6FH ;"9"
END