8.5功能说明:
使用4×4矩阵式键盘,共有16个按键,通过扫描方法控制显示器输出0~F十六进制数。
程序:JP02.ASM
01:ORG 00H ;
02: START: MOV R4,#00H ;
03: L1: MOV R3,#0F7H ;扫描初值(P3.3=0)
04: MOV R1,#00H ;取码指针 设置初值
05: L2: MOV A,R3 ;开始扫描
06: MOV P3,A ;将扫描值输出至P3
07: MOV A,P3 ;读入P3值,判断有无按下 送出行扫描初
08: MOV R4,A ;存入R4,以判断是否放开 值(P3.3=0)
09: SETB C ;C=1
10: MOV R5,#04H ;扫描P3.4~P3.7
11: L3: RLC A ;将按键值左移一位
12: JNC KEY ; 有键按下C=0,跳至KEY
13: INC R1 ;C=1没键按下,指针值加1
14: DJNZ R5,L3 ;4列扫描完毕了? 左移检测列
15: MOV A,R3 ;扫描值载入
16: SETB C ;C=1
17: RRC A ;扫描下一行
18: MOV R3,A ;存回扫描寄存器
19: JC L2 ;C=1,程序转到L2处
20: JMP L1 ;C=0则4行已扫描完毕 右移扫描行
21: KEY: ACALL DELAY ;调延时子程序 消除抖动
22: D1: MOV A,P3 ;读入P3值
23: XRL A,R4 ;与上次读入值作比较
24: JZ D1 ;A=0,表示按键未放
25: MOV A,R1 ;按键已放开,指针载入A 按键释放从
26: ACALL DISP ;调用显示子程序 TABLE取码
27: JMP L1 ; 重复扫描
28: DISP: MOV DPTR,#TABLE ;数据指针指到TABLE
29: MOVC A,@A+ DPTR ;至TABLE取码
30: MOV P0,A ; 输出
31: RET ; 子程序返回 显示子程序
32: DELAY: MOV R7, #60 ;
33: MOV R6, #248 ;
34: DLY1: DJNZ R6, $ ;
35: DJNZ R7, DLY1 ; 消除抖动
36: RET ; 延时子程序
37: TABLE: DB 0C0H, 0F9H, 0A4H,0B0H ;
39: DB 99H, 92H, 82H, 0F8H ;
40: DB 80H, 90H, 88H, 83H ;
41: DB 0C6H, 0A1H, 86H, 8EH ; 编码表
42: END ; 程序结束
中断
9.1功能说明:
单片机P1端口的8个LED作左移右移,不断循环。当按外部中断INT0开关K1时,循环停止,转而使8个LED闪烁4次。之后,又恢复灯的左右移循环。
程序:ZD01.ASM
01: ORG 00H ; 起始地址
02: JMP START ;跳到主程序START
03: ORG 03H ;INT0中断起始地址 规定起
04: JMP EXT0 ;跳到中断子程序 始地址
05: START:MOV IE, #10000001B ;INT0中断开通
06: MOV IP, #00000001B ;INT0中断优先
07: MOV TCON, #00000000B ;INT0为电平触发
08: MOV SP, #70H ;设定堆栈指针 中断设定
09: LOOP:MOV R0, #8 ; 设置左移位数
10: MOV A , #0FEH ; 设置左移初值
11: LOOP1:MOV P1, A ; 输出至P1
12: ACALL DELAY ; 调延时子程序
13: RL A ; 左移一位
14: DJNZ R0, LOOP1 ; 判断移动位数 左移
15: MOV R0, #8 ; 设置右移位数
16: LOOP2:RR A ; 右移一位
17: MOV P1, A ; 输出至P1
18: LCALL DELAY ; 调延时子程序
19: DJNZ R0, LOOP2 ; 判断移动位数
20: JMP LOOP ; 重设显示值 右移 左右移
21: EXT0: PUSH ACC ;将A 值压入堆栈
22: PUSH PSW ;将 PSW值压入堆栈
23: SETB RS0 ;设定工作寄存器组1 保护
24: CLR RS1 ; 现场
25: MOV R0, #4 ; 设置闪烁次数
26: LOOP3:MOV A, #00H ; A存有P1口欲显值
27: MOV P1, A ; P1端口灯亮
28: LCALL DELAY ; 调延时1秒子程序
29: CPL A ;将A的值反相
30: DJNZ R0, LOOP3 ; 判断闪烁次数 闪烁
31: POP PSW ;从堆栈取回PSW值 恢复
32: POP ACC ;从堆栈取回值 A值 现场 中断
33: RETI ;返回主程序 子程序
9.4功能说明:
开始时P1端口8个LED灯在闪烁。当按外部中断INT0开关K1时,使一个灯左右移3次。当按外部中断INT1开关 K2时,使二个灯左右移4次。之后, 8个LED灯恢复闪烁。
程序:ZD02.ASM
01: ORG 00H ; 主程序起始地址
02: JMP START ; 跳到主程序START
03: ORG 03H ; INT0中断子程序起始地址
04: JMP EXT0 ; 跳至中断子程序EXT0
05: ORG 13H ; INT1中断子程序起始地址 地址
06: JMP EXT1 ; 跳至中断子程序EXT1 设置
07: START:MOV IE, #10000101B ; 中断开通
08: MOV IP, #00000100B ; INT1优先中断
09: MOV TCON, #00000000B ; INT0 、INT1为电平触发 中断
10: MOV SP, #70H ; 设定堆栈在(70 H) 设置
11: MOV A, #00H ; 设初始值
12: LOOP: MOV P1,A ; 使P1闪烁
13: LCALL DELAY ; 调延时子程序
14: CPL A ; 将A的值反相
15: JMP LOOP ; 重复循环 闪烁
16: EXT0: PUSH ACC ; 将A 值压入堆栈
17: PUSH PSW ; 将 PSW值压入堆栈
18: SETB RS0 ; 保护
19: CLR RS1 ; 设置寄存器组1 现场
20: MOV R3,#03 ; 左右移3次
21: LOOP1:MOV R0, #08 ; 设置左移位数
22: MOV A ,#0FEH ; 设置左移初值
23: LOOP2:MOV P1, A ; 输出至P1
24: ACALL DELAY ; 调延时子程序