当前位置: 首页 > news >正文

8086最小系统串口发送测试

1.硬件

2.汇编程序

;------------------------------------------------------------------------------------------- ;2017.9.15 ;用nasm重新写原来的代码 ;例程001 ;ex1.asm =example_1 ;8088启动,点亮系统板上的LED ;重点在于正确使用程序编辑环境,nasm汇编方法,EEprom的烧写方法 ; ;ex001----用下载到RAM中的程序,点亮系统板上的LED ;8088.asm是汇编源程序 ;8088.bin是编译生成的可下载执行的最终代码 ; ;编译很简单,双击make即可自动完成 ; ;Notepad++是我计算机上Notepad++的快捷方式 ;--------------------------------------------------------------------------------------------- led_port equ 800h ;--------------------------------------------------------------------------------------------- ; org 2000h ;程序将由监控bios下载到内存RAM的地址(0000:2000) org 0h start: ;------------------------------------------------------ ;init part ;------------------------------------------------------ mov ax,0 mov ds,ax mov ss,ax mov sp,1fffh mov ax,0f000h mov es,ax CALL COM_INIT call DELAY call DELAY call DELAY st001: nop ;----------------------------------------------------- ;点亮系统板上的LED ;----------------------------------------------------- ;MOV DX,800H ;800H是板子上8个LED的端口地址号 mov dx,led_port MOV AL,0aaH ;一亮一灭间隔点亮 OUT DX,AL call DELAY ;MOV DX,800H ;800H是板子上8个LED的端口地址号 mov dx,led_port MOV AL,00H ;一亮一灭间隔点亮 OUT DX,AL call DELAY mov ah,'$' call SEND ; lea di,STR1 ;nasm编译器不认 mov di, STR1 CALL STR_OUT mov di, STR2 CALL STR_OUT ;mov al,01010101b ;mov al,0f0h; ;out 25H,al ;hlt jmp st001 jmp start ;------------------------------------------------------------ ; DELAY PROC NEAR ;------------------------------------------------------------ ;push DELAY: PUSH CX PUSH BX NOP NOP mov bx,10 del1: mov cx,5882 del2: loop del2 dec bx jnz del1 ;pop cx ;pop bx POP BX POP CX RET ;------------------------------------------- ;pc16550 uart send by AH ;------------------------------------------- ;LSTAT EQU 1F5H ;DAT_165 EQU 1F0H ;LINE_165 EQU 1F3H ;LSB_165 EQU 1F0H ;MSB_165 EQU 1F1H ;FIFO_165 EQU 1F2H LSTAT EQU 10AH DAT_165 EQU 100H LINE_165 EQU 106H LSB_165 EQU 100H MSB_165 EQU 102H FIFO_165 EQU 104H SEND: ; PROC NEAR MOV DX,LSTAT WAITx: IN AL,DX TEST AL,20H JZ WAITx MOV AL,AH MOV DX,DAT_165 OUT DX,AL RET ;SEND ENDP ;------------------------------------------- ;串口打印字符串 ;------------------------------------------- STR_OUT :; PROC NEAR nop; LEA DI,STR1 STR_LOOP: ;MOV AH,BYTE PTR [DI] mov ah,byte [es:di];注意rom的寻址与ram的寻址不同的地方 CMP AH,'$' JZ STR_EXIT CALL SEND INC DI JMP STR_LOOP STR_EXIT: NOP RET ;STR_OUT ENDP ;--------------------------------------------------- ;16650 init ;--------------------------------------------------- COM_INIT:; PROC NEAR ;LINE MOV AL,8AH ;MOV DX,1F3H MOV DX,LINE_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;LSB MOV AL,120 ;MOV DX,1F0H MOV DX,LSB_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;MSB MOV AL,0 ;MOV DX,1F1H MOV DX,MSB_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;LINE ;MOV AL,0AH MOV AL,03H ;MOV DX,1F3H MOV DX,LINE_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;FIFO MOV AL,07H ;MOV DX,1F2H MOV DX,FIFO_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;MOV DX,800H MOV DX,led_port MOV AL,0f0H OUT DX,AL RET ;COM_INIT ENDP STR1 DB 'i8088-HELLO boy or girl!' ,13,10,'$' STR2 DB 0AH,0DH,' ',0dh,0ah,'$' ;------------------------------------------------------------------ ;rom boot ;------------------------------------------------------------------ TIMES 0FFF0H-($-$$) DB 0 ;JMP word 0F000H:label ;Not clear why but need long jump for board hardware jmp word 0f000h:0000h ;------------------------------------------------------------------ ;db 55h,55h,55h,55h,55h,55h ;程序结束标志,监控bios程序,收到后自动跳转到内存0000:2000处执行 ;----------------------------------------------------------------------------------------------

3.测试结果

保存图片
编辑图片
移除物体
提取文字
图片翻译

4.误区陷阱

起初,是用8088单板机测试好的程序,进行移植的,结果怎么都不对,弄了三、四天,怀疑各种硬件问题。最后发现,是PC16550的片内寄存器地址不一致造成的。

代码修改如下

然后就一切正常了!!!Happy!

http://www.jsqmd.com/news/780021/

相关文章:

  • 学术数据采集利器crab-scholar:从爬虫原理到科研实战应用
  • 深度强化学习在《我的世界》AI智能体开发中的实战应用
  • RocketAI:开箱即用的AI服务平台部署与商业化运营指南
  • Flutter for OpenHarmony 效率工具开发实战:我实现的番茄钟与倒计时功能总结
  • 走上管理岗进步最快的方式,没有之一
  • 基于RAG的智能文档问答系统:从原理到部署实践
  • 脉搏血氧仪原理与ADuC7024微控制器应用解析
  • Need项目:将项目环境配置从文档升级为可执行规范
  • Tbeas青和生日邮件自动祝福发送系统 一键配置情侣/人事必备
  • 机器人交互式抓取:基于强化学习的Peekaboo技能实现与调优
  • 从BBC Simorgh看现代前端架构:同构渲染、性能优化与工程化实践
  • Python 爬虫进阶技巧:iframe 嵌套页面数据抓取方案
  • rocky linux 9.7
  • 飞机结构健康监测:基于热电效应的无线传感器自供电技术解析
  • llama_ros:在ROS 2中集成高效大语言与视觉语言模型
  • 基于Tauri构建Claude Code GUI管理工具:opcode核心功能与开发实践
  • 100x-dev项目解析:从高效工具链到架构思维,打造10倍效能开发者
  • 第22篇:嵌入式芯片选型全攻略:从需求到参数匹配的完整方法论
  • 推荐一家杭州比较好的直播代运营公司
  • c++怎么在写入文件时自动创建缺失的目录_路径检查与创建【详解】
  • c++ 内存排序和编译器重排 c++ memory reordering如何发生
  • mysql连接查询中包含大表如何优化_采用嵌套循环JOIN优化顺序
  • Go语言实现物理内存读写工具devmem-cli:嵌入式调试与系统编程利器
  • Kubernetes 学习笔记第一篇介绍讲了什么?
  • 基于本地AI与OCR的智能PDF重命名工具:Nominate开发全解析
  • Linux49:rockx读取单张图片并检测图片内人脸的矩形
  • 机器人集群控制框架:从ROS 2通信到多机协同任务调度实战
  • Keel:基于Kubernetes的声明式镜像自动部署工具实战指南
  • 基于Dify平台构建AI深度研究工作流:从原理到实践部署指南
  • c++如何判断一个路径是否是符号链接_is_symlink函数用法【附代码】