单片机汇编代码分析示例
来源:互联网 发布:广州公交线路查询软件 编辑:程序博客网 时间: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 ;结束
阅读全文
1 0
- 单片机汇编代码分析示例
- 51单片机ucos ii任务切换汇编代码分析(1)
- 51单片机ucos ii任务切换汇编代码分析(2)
- 51单片机汇编延时分析:
- C反汇编示例分析
- AT89C52单片机八路温度检测汇编代码
- 51单片机汇编延时计算详细分析
- ARMv7汇编代码分析
- 汇编代码分析
- 反汇编代码分析
- STM8汇编代码分析
- sdram汇编代码分析
- 反汇编代码分析
- 1.汇编代码分析
- 关于单片机的代码分析
- 单片机实现PT2262解码示例代码
- 一段汇编代码的分析
- U-boot汇编代码分析
- 浅谈tcp cubic拥塞算法以及优化建议
- 203. Remove Linked List Elements
- django学习笔记(二)——mysql数据库
- 整理出来前端面试题 js篇
- 类,对象,属性,方法是什么
- 单片机汇编代码分析示例
- 罗素说理想与历程—幸福心灵的获取
- [kmp] hdu6153 A Secret
- [LintCode]54.转换字符串到整数
- html事件属性总结
- linux下命令行解析getopt函数
- 读书笔记_C#入门经典(第5版)第四章_流程控制
- Fedora 25 安装搜狗输入法
- h5中音频插入标签 audio