单片机汇编代码分析示例

来源:互联网 发布:广州公交线路查询软件 编辑:程序博客网 时间:2024/05/19 23:26
控制寄存器; +--------+--------+--------+--------+--------+--------+--------+--------+; |   D7   |   D6   |   D5   |   D4   |   D3   |   D2   |   D1   |   D0   |; +--------+--------+--------+--------+--------+--------+--------+--------+; D0: PC0-3    0 输出 1 输入; D1: PB       0 输出 1 输入; D2: B组方式; D3: PC4-7    0 输出 1 输入; D4: PA       0 输出 1 输入; D6-D5: A组方式; D7: 特征位 必须为1IOY0      EQU   0C400H          ;P0口寄存器口定义IOY1      EQU   0C440H          ;P1口寄存器口定义IOY2      EQU   0C480H          ;P2口寄存器口定义IOY3      EQU   0C4C0H          ;P3口寄存器口定义          M8255_A   EQU   IOY0M8255_B   EQU   IOY0+01H*4M8255_C   EQU   IOY0+02H*4M8255_CTL EQU   IOY0+03H*4IO_B      EQU   IOY1AD0809    EQU   IOY2            ;与AD0809连接的端口寄存器定义M16550_0  EQU   IOY3M16550_1  EQU   IOY3+01H*4M16550_3  EQU   IOY3+03H*4M16550_4  EQU   IOY3+04H*4M16550_5  EQU   IOY3+05H*4;数据段DATA    SEGMENT   TTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H    W1     DB '===========================================================',0DH,0AH,'$'    W2     DB 'Please have a choice: 1.Local & Digital  2.Local & Analog  3.Remote & Digital  4.Remote & Analog',0DH,0AH,'$'    W3     DB '1.Local & Digital',0DH,0AH,'$'    W4     DB '2.Local & Analog',0DH,0AH,'$'    W5     DB '3.Remote & Digital',0DH,0AH,'$'    W6     DB '4.Remote & Analog',0DH,0AH,'$'DATA    ENDS;栈定义 栈大小200B 栈顶为TOPSTACK1   SEGMENT  STACK 'STACK'STT DB 200 DUP(?)TOP     EQU    LENGTH STTSTACK1   ENDS;代码段CODE    SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1            ;指定代码段为CODE 数据段为DAT 栈为STACK1MAIN   PROC  FAR                            ;主函数 远跳转 子程序外部跳转START: MOV AX,STACK1                        ;读取栈段地址 AX = STACK1       MOV SS,AX                            ;设置栈段寄存器SS SS -> STACK1       MOV SP,TOP                           ;设置栈指针 SP -> TOP       MOV AX,DATA                          ;读取数据段地址 AX = DATA        MOV DS,AX                            ;设置数据段寄存器 DS -> DATA              ;初始化8255端口       MOV DX,M8255_CTL                     ;读取8255控制寄存器地址 DX = M8255_CTL       MOV AL,81H                           ;1000 0001 方式0 A口、B口输出,C口低4位输入       OUT DX,AL                            ;设置寄存器值 DX = 81H       CALL  DALLY                          ;调用延时函数 确保端口稳定       ;初始化16550串型接口芯片       MOV DX,MY16550_3                     ;设置16550线路控制寄存器       MOV AL,80H                       OUT DX,AL                            ;输出到端口上 DX = 80H       CALL  DALLY                          ;调用延时函数 等待电路反应       MOV DX,MY16550_0                     ;设置除数寄存器低字节0CH         MOV AL,0CH                        OUT DX,AL                            ;输出到端口上 DX = 0CH                 CALL  DALLY                          ;调用延时函数 等待电路反应                                   MOV DX,MY16550_1                     ;设置除数寄存器高字节00H       MOV AL,00H       OUT DX,AL                            ;输出到端口上 DX = 00H       CALL  DALLY                          ;调用延时函数 等待电路反应              MOV DX,MY16550_3                     ;设置线路控制寄存器,初始化数据格式       MOV AL,1BH                        OUT DX,AL                            ;输出到端口上 DX = 1BH       CALL  DALLY                          ;调用延时函数 等待电路反应       MOV DX,MY16550_4                     ;设置MODEM控制寄存器        MOV AL,03H       OUT DX,AL                            ;输出到端口上 DX = 03H       CALL  DALLY                          ;调用延时函数 等待电路反应               MOV DX,MY16550_1                     ;设置中断允许寄存器       MOV AL,00H                           ;关闭中断       OUT DX,AL                            ;输出到端口上 DX = 00H       CALL  DALLY                          ;调用延时函数 等待电路反应                                               ;输出W1     M1:   MOV  DX,OFFSET W1                    ;DX ->W1       MOV  AH,9       INT  21H                             ;输出字符串 从DX位置开始                                            ;输出W2       MOV   DX,OFFSET W2       MOV  AH,9       INT  21H                                            ;输出W2       MOV  DX,OFFSET W1       MOV  AH,9       INT  21H; 输出;===========================================================;Please have a choice: 1.Local & Digital  2.Local & Analog  3.Remote & Digital  4.Remote & Analog;===========================================================       CALL  SCAN                           ;调用键盘扫描函数 检测是否有按键按下       CALL  DALLY                          ;调用延时函数        CALL  DALLY                          ;调用延时函数               MOV  AH,1       INT  16H                             ;查询键盘缓冲区       JZ   M1                              ;ZF=0 跳转到M1循环执行                                            ;退出QUIT:  MOV AH,4CH       INT 21H       RETMAIN   ENDP                                 ;主程序 结束       SCAN  PROC NEAR                             ;键盘扫描子程序 开始 近跳转 子程序内部跳转      PUSH AX                               ;保存上线文 AX压栈      PUSH DX                               ;保存上线文 DX压栈      PUSH CX                               ;保存上线文 CX压栈 S1:  MOV AL,00H                            ;复位PA口电平      MOV DX,M8255_A                        ;      OUT DX,AL                             ;            MOV DX,M8255_C      IN  AL,DX                             ;读取PC口电平      AND AL,0FH                            ;取低4位      CMP AL,0FH                            ;比较AL是否等于0F      JE  S1                                ;如果相等 跳转至S1 说明没有按键按下      MOV CX,16EAH                          ;否则 说明有按键按下 短暂延时 去抖动  S2: LOOP S2                               ;循环延时      IN  AL,DX                             ;再次读取PC口电平      AND AL,0FH                            ;取低4位      CMP AL,0FH                            ;比较AL是否等于0F      JZ  S1                                ;如果相等 跳转至S1 说明没有按键按下      MOV AL,0                              ;否则 说明有按键按下 复位PA口电平  S3: MOV DX,M8255_A                        ;读取PA口寄存器      OUT DX,AL                             ;复位PA口电平      MOV DX,M8255_C                        ;读取PC口寄存器      IN  AL,DX                             ;读取PC口电平      AND AL,0FH                            ;取低4位          ;  CALL OUT1                            ;显示按键检测结果      CMP AL,0EH                            ;根据按键情况 进入到指定的子程序      JE  S4                                ;跳转至S4      CMP AL,0DH      JE  S5                                ;跳转至S5      CMP AL,0BH      JE  S6                                ;跳转至S6      CMP AL,07H      JE  S7                                ;跳转至S7   S4: MOV AL,01H                            ;设置数码管显示数值为1      MOV DX,OFFSET W3                      ;DX -> W3      CALL OUT1                             ;调用数码管显示子程序      CALL DALLY                            ;延时      CALL LD                               ;调用本地数字采样子程序      JMP Q1                                ;跳转至Q1 退出键盘检测程序  S5: MOV AL,02H                            ;设置数码管显示数值为2      MOV DX,OFFSET W4                      ;DX -> W6      CALL OUT1                             ;调用数码管显示子程序      CALL DALLY                            ;延时      CALL LA                               ;调用本地模拟采样子程序      JMP Q1                                ;跳转至Q1 退出键盘检测程序  S6: MOV AL,03H                            ;设置数码管显示数值为3      MOV DX,OFFSET W5                      ;DX -> W5      CALL OUT1                             ;调用数码管显示子程序      CALL DALLY                            ;延时      CALL RD                               ;调用远程数字采样子程序      JMP Q1                                ;跳转至Q1 退出键盘检测程序  S7: MOV AL,04H                            ;设置数码管显示数值为4      MOV DX,OFFSET W6                      ;DX -> W6      CALL OUT1                             ;调用数码管显示子程序      CALL DALLY                            ;延时      CALL RA                               ;调用远程模拟采样子程序  Q1: POP  CX                               ;恢复上下文      POP  DX      POP  AX      RET                                   ;子程序返回 SCAN ENDP                                   ;键盘扫描子程序 结束OUT0 PROC NEAR                              ;输出字符串子程序 开始 字符串起始位置必须在DX中 近跳转 子程序内部跳转     MOV AH,9     INT 21H     RET                                    ;子程序返回 OUT0 ENDP                                   ;输出字符串子程序 结束LD PROC NEAR                                ;本地数字采样子程序 开始 近跳转 子程序内部跳转      PUSH DX                               ;保存上下文      PUSH CX      PUSH BX      PUSH AX   L1: MOV DX,IO_B                           ;读取IO_B端口地址      OUT DX,AL                             ;复位端口电平      CALL DALLY                            ;延时      MOV DX,IO_B                           ;读取IO_B端口地址      IN  AL,DX                             ;读取端口电平      CALL OUT1                             ;输出结果      MOV AH,1      INT 16H                               ;等待键盘输入一个字符      JZ  L1                                ;如果没有输入 跳转至L1 继续等待      POP AX                                ;恢复上下文      POP BX      POP CX      POP DX      RET                                   ;子程序返回     LD ENDP                                     ;本地数字采样子程序 结束LA PROC NEAR                                ;本地模拟采样子程序 开始 近跳转 子程序内部跳转      PUSH AX                               ;保存上下文      PUSH BX      PUSH CX      PUSH DX  L2: MOV DX,AD0809                         ;读取与AD0809相连的端口地址      OUT DX,AL                             ;复位端口电平      CALL DALLY                            ;延时 等待电路反应      MOV DX,AD0809                         ;读取与AD0809相连的端口地址      IN AL,DX                              ;读取端口电平      CALL OUT1                             ;输出结果      MOV AH,1      INT 16H                               ;等待键盘输入一个字符      JZ  L2                                ;如果没有输入 跳转至L2 继续等待      POP DX                                ;恢复上下文      POP CX      POP BX      POP AX      RET                                   ;子程序返回LA ENDP                                     ;本地模拟采样子程序 结束RD PROC NEAR                                ;远程数字采样子程序 开始 近跳转 子程序内部跳转      PUSH DX                               ;保存上下文      PUSH CX      PUSH BX      PUSH AX        L1: MOV DX,IO_B                           ;读取IO_B端口地址      OUT DX,AL                             ;复位端口电平      CALL DALLY                            ;延时      MOV DX,IO_B                           ;读取IO_B端口地址      IN  AL,DX                             ;读取端口电平      CALL SEND                             ;调用子程序SEND 发送数据到远端            MOV AH,1      INT 16H                               ;等待键盘输入一个字符      JZ  L1                                ;如果没有输入 跳转至L1 继续等待      POP AX                                ;恢复上下文      POP BX      POP CX      POP DX      RET                                   ;子程序返回     RD ENDP                                     ;远程数字采样子程序 结束RA PROC NEAR                                ;远程模拟采样子程序 开始 近跳转 子程序内部跳转      PUSH AX                               ;保存上下文      PUSH BX      PUSH CX      PUSH DX  L2: MOV DX,AD0809                         ;读取与AD0809相连的端口地址      OUT DX,AL                             ;复位端口电平      CALL DALLY                            ;延时      MOV DX,AD0809                         ;读取与AD0809相连的端口地址      IN AL,DX                              ;读取端口电平      CALL SEND                             ;调用子程序SEND 发送数据到远端      MOV AH,1      INT 16H                               ;等待键盘输入一个字符      JZ  L2                                ;如果没有输入 跳转至L2 继续等待      POP DX                                ;恢复上下文      POP CX      POP BX      POP AX      RET                                   ;子程序返回RA ENDP                                     ;远程模拟采样子程序 结束OUT1 PROC NEAR                              ;本地数码管显示子程序 开始      MOV CH,AL      ;AND AL,0F0HMOV CL,4      SHR AL,CL      MOV BX,OFFSET TTABLE      AND AX,000FH      ADD BX,AX      MOV AL,[BX]      PUSH AX      MOV DX,M8255_A      MOV AL,0FEH                           ;LED低电平选通      OUT DX,AL            POP AX      MOV DX,M8255_B      OUT DX,AL      CALL DALLY           MOV AL,CH      MOV BX,OFFSET TTABLE      AND AX,000FH      ADD BX,AX      MOV AL,[BX]      PUSH AX      ;PUSH DX      MOV DX,M8255_A      MOV AL,0FDH      OUT DX,AL            ;POP DX      POP AX      MOV DX,M8255_B      OUT DX,AL      CALL DALLY      RETOUT1 ENDP                                   ;本地数码管显示子程序 结束 SEND PROC NEAR                              ;远程发送子程序 开始      MOV CH,AL                       AND AL,0F0H      MOV CL,04H      SHR AL,CL                      CMP AL,09H      JG A1      ADD AL,30H                      JMP A2A1:  ADD AL,37H               A2:   MOV DX,MY16550_0      MOV AL,AA      OUT DX,AL                    CALL DALLY      MOV AL,CH                     AND AL,0FH                     CMP AL,09H      JG A3      ADD AL,30H      JMP A4A3:  ADD AL,37H              A4:  MOV DX,MY16550_0      MOV AL,AA      OUT DX,AL                    CALL DALLYRETSEND ENDP                              ;远程发送子程序 结束       DALLY PROC NEAR                        ;延时子程序 开始 延时1ms      PUSH CX                          ;保存上下文      PUSH AX      MOV CX,0300H                     ;LOOP循环计数器CX = 0300H D1:   MOV AX,3000H                     ;第二层循环计数器AX = 0300H D2:   DEC AX      JNZ D2      LOOP D1      POP AX                           ;恢复上下文      POP CX      RET                              ;子程序返回DALLY ENDP                             ;延时子程序 结束CODE   ENDS                            ;代码段结束       END   START                     ;结束

原创粉丝点击