×
单片机 > 单片机程序设计 > 详情

51单片机汇编语言(四)

发布时间:2020-09-03 发布时间:
|
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=1

10:         MOV   R5,#04H  ;扫描P3.4~P3.7

11:  L3:    RLC         ;将按键值左移一位

12:         JNC   KEY       ; 有键按下C=0,跳至KEY

13:         INC   R1       ;C=1没键按下,指针值加1  

14:         DJNZ  R5,L3    ;4列扫描完毕了?                    左移检测列

15:         MOV   A,R3     ;扫描值载入

16:         SETB        ;C=1

17:         RRC         ;扫描下一行

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,     ; 输出至P1

12:         ACALL  DELAY     ; 调延时子程序

13:         RL              ; 左移一位

14:         DJNZ    R0, LOOP1  ; 判断移动位数              左移             

15:         MOV    R0, #8      ; 设置右移位数

16: LOOP2:RR              ; 右移一位

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的值反相

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      调延时子程序

25:         RL                左移一位

26:         DJNZ    R0, LOOP2   判断移动位数                  

27:         MOV    R0,#07       设置右移位数

28: LOOP3:RR               右移一位

29:         MOV    P1, A        输出至P1

30:         LCALL  DELAY      调延时子程序

31:         DJNZ    R0, LOOP3   ; 右移7 位?                  左右

32:         DJNZ    R3,LOOP1   左右移3次?                 

33:         POP    PSW         ; 从堆栈取回PSW值             恢复   EXT0 

34:         POP    ACC         ; 从堆栈取回值 A值             现场   中断子

35:         RETI                   返回主程序                         程序

 

36: EXT1: PUSH   ACC        将A值压入堆栈

37:         PUSH   PSW        将 PSW值压入堆栈    

38:         SETB   RS1         ; 设工作组2 ,RS1=1          保护

39:         CLR    RS0         ; RS0=0                       现场

40:         MOV   R3,#04       ;左右移4次

41: LOOP4:MOV   R0, #06      设置左移位数

42:         MOV   A ,#0FCH    设置左移初值

43: LOOP5:MOV   P1, A        输出至P1

44:         ACALL  DELAY     调延时子程序

45:         RL              左移一位

46:         DJNZ   R0, LOOP5   判断移动位数       

47:         MOV   R0,#06       设置右移位数

48: LOOP6:RR              右移一位

49:         MOV    P1, A       输出至P1

50:         LCALL  DELAY     调延时子程序

51:         DJNZ   R0, LOOP6   ; 判断                         左右

52:         DJNZ   R3,LOOP4   ; 左右移4次?                  

53:         POP    PSW        ; 从堆栈取回PSW值              恢复   EXT1

54:         POP    ACC        ; 从堆栈取回值 A值              现场   中断子

55:         RETI                返回主程序                           程序

56: DELAY:MOV   R5, #20      ; 延时0.2秒子程序

57: DLY1: MOV   R6, #20      ;

58: DLY2: MOV   R7, #248     ;

59:         DJNZ   R7, $        ;

60:         DJNZ   R6, DLY2    ;

61:         DJNZ   R5, DLY                                          延时子

62:         RET                                                       程序

63:         END                                                    程序结束



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430F5529 上手小例程2