8088单板机C语言sprintf()格式化串口输出---Prj04

article/2025/6/24 10:15:26

#include "tiny_stdarg.h"  // 使用自定义可变参数实现#define ADR_273 0x0200
#define ADR_244 0x0400
#define  LED_PORT   0x800
#define  PC16550_THR   0x1f0
#define  PC16550_LSR   0x1f5
/
//基本的IO操作函数
/
char str[]="Hello World!  20250531  Very Ok!!!\r\n";
//char  buff[60]
char cx='A';
void outp(unsigned int addr, char data)
// 输出一字节到I/O端口{ __asm{ mov dx, addrmov al, dataout dx, al}}
char inp(unsigned int addr)
// 从I/O端口输入一字节{ char result;__asm{ mov dx, addrin al, dxmov result, al}return result;}//串口发送函数void  uart_send(char x)
{int temp;while(1){temp=inp(PC16550_LSR);if((temp&0x20)==0x20){break;}}outp(PC16550_THR,x);}void uart_str_send(char *p)
{//int i=0;//char str1[20]="Hello World!\r\n";//char *p;//p=str1;while(*p!='\0'){uart_send(*p);p++;}/*for(i=0;i<14;i++){uart_send(str1[i]);}
*/}
///
/* sprintf()函数实现 */
/* tiny_sprintf.c */
#include "tiny_stdarg.h"static void itoa(unsigned num, int base, char *out) {char buf[6]; // 16位整数最大5位数字 + 结束符char *p = buf;int i = 0;if (num == 0) {*out++ = '0';*out = '\0';return;}while (num > 0) {int r = num % base;*p++ = (r < 10) ? (r + '0') : (r - 10 + 'a');num /= base;i++;}while (i-- > 0) {*out++ = *--p;}*out = '\0';
}int tiny_sprintf(char *buf, const char *fmt, ...) {va_list args;char *p = buf;const char *s = fmt;va_start(args, fmt);while (*s) {if (*s != '%') {*p++ = *s++;continue;}s++;switch (*s) {case 'd': {int num = va_arg(args, int);if (num < 0) {*p++ = '-';num = -num;}itoa(num, 10, p);while (*p) p++;s++;break;}case 'x': {unsigned num = va_arg(args, unsigned);itoa(num, 16, p);while (*p) p++;s++;break;}case 's': {char *str = va_arg(args, char *);while (*str) *p++ = *str++;s++;break;}case 'c': {char c = (char)va_arg(args, int);*p++ = c;s++;break;}case '%': {*p++ = '%';s++;break;}default: {*p++ = '%';*p++ = *s++;break;}}}*p = '\0';va_end(args);return p - buf;
}
/////char  end_flag[5]={0x55,0x55,0x55,0x55,0x55};
void main(void)
/*检测按键状态并由LED发光二极管显示,若按键闭合对应LED发光二极管点亮,若按键断开对应LED发光二极管灭.*/{ int i=0;char buffer[80];// 使用安全格式化//tiny_sprintf(buffer, "Hex: %x\n",255);// 使用安全格式化tiny_sprintf(buffer, "Decimal: %d    \n""Hex: %x    \n""String: %s    \r\n", -123, 0xABCD, "Hello");while (1){//char button_state;//button_state=inp(ADR_244);//int i=0;//uart_str_send(str);uart_str_send(buffer);//uart_send(cx);for(i=0;i<5000;i++);for(i=0;i<5000;i++);outp(LED_PORT, 0xff);for(i=0;i<5000;i++);for(i=0;i<5000;i++);outp(LED_PORT, 0x00);}}
char  end_flag[5]={0x55,0x55,0x55,0x55,0x55};
/* tiny_stdarg.h */
#ifndef TINY_STDARG_H
#define TINY_STDARG_Htypedef char * va_list;#define va_start(ap, parmN) (ap = (va_list)(&parmN + 1))
#define va_arg(ap, type) (*(type *)((ap += sizeof(type)), (ap - sizeof(type))))
#define va_end(ap)#endif

2025.5.31

感觉很棒!挺好玩的!Deepseek帮了我很大的忙


http://www.hkcw.cn/article/ihvSdYSEER.shtml

相关文章

HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。

名人说&#xff1a;龙舟争渡&#xff0c;助威呐喊&#xff0c;凭吊祭江诵君赋。——苏轼《六幺令天中节》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、项目概览&#xff1a;传统与现代的技术碰撞1. 核心特…

YOLOv10改进|爆改模型|涨点|在颈部网络添加结合部分卷积PConv和SDI融合方法的PSDI特征融合层(附代码+修改教程)

一、文本介绍 本文修改的模型是YOLOv10&#xff0c;YOLOv10无需非极大值抑制&#xff08;NMS&#xff09;进行后处理&#xff0c;其推理速度以及参数量上都优于现有的模型。然而&#xff0c;针对某些目标检测任务中需要同时处理多尺度目标的挑战&#xff0c;YOLOv10 在此类场景…

Redis最佳实践——安全与稳定性保障之高可用架构详解

全面详解 Java 中 Redis 在电商应用的高可用架构设计 一、高可用架构核心模型 1. 多层级高可用体系 #mermaid-svg-Ffzq72Onkv7wgNKQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Ffzq72Onkv7wgNKQ .error-icon{f…

虚拟存储器:将十六进制逻辑地址 0A5C、103C、1A5C 转换成物理地址(2)

转换成十进制&#xff08;分步骤解析&#xff09; 确定页号和偏移的计算方式 页大小1KB 2^10&#xff0c;逻辑地址中 页号 逻辑地址 1024&#xff08;整数除法&#xff09;&#xff0c;页内偏移 逻辑地址 % 1024。物理地址 物理块号 1024 页内偏移&#xff0c;其中物理块…

【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 102 篇 - Date: 2025 - 05 - 31 Author: 郑龙浩/仟墨 文章目录 HTML 基础学习一 了解HTML二 HTML的结构三 HTML标签1 标题2 文本段落3 换行4 加粗、斜体、下划线5 插入图片6 添加链接7 容器8 列表9 表格10 class类 HTML 基础学习 一 了解HTML 一个网页分为为三部分&…

吴恩达MCP课程(2):research_server

目录 代码代码解释导入模块常量定义MCP服务器初始化工具函数定义1. search_papers 函数2. extract_info 函数 主程序总结 运行示例 代码 import arxiv import json import os from typing import List from mcp.server.fastmcp import FastMCPPAPER_DIR "papers"mc…

【数据结构】——二叉树--链式结构

一、实现链式结构二叉树 二叉树的链式结构&#xff0c;那么从名字上我们就知道我们这个二叉树的底层是使用链表来实现的&#xff0c;前面我们的二叉树是通过数组来实现的&#xff0c;那么在其是完全二叉树的情况下&#xff0c;此时我们使用数组来实现就会使得其空间浪费较少&a…

netty中的EventLoop原理解析

一起来学netty 1. EventLoop的基本概念2. EventLoop的核心组件3. EventLoop的工作流程4. EventLoop与Channel的关系5. EventLoop的实现类6. EventLoop的线程模型7. EventLoop的优点8. EventLoop的注意事项9. 示例代码10.异步编程模型解析异步编程的定义异步编程的核心特点异步编…

使用Java实现简单的计算机案例

第一个案例我决定做一个简单的“简易计算器”&#xff0c;来开启编程之旅。为什么我会选择这个案例来作为第一个Java案例呢&#xff1f;大家可别小看这个小小的计算器&#xff0c;它既简单又实用。通过这个案例&#xff0c;大家可以学会或着练习如何处理用户输入、如何实现基本…

流媒体基础分析:延迟分析与安全性保障

在流媒体传输过程中&#xff0c;延迟和安全性是两个至关重要的方面。它们直接影响着用户的观看体验和内容的版权保护。本文将深入分析延迟的来源与追赶技术&#xff0c;并探讨流媒体传输的安全性保障手段。 1. 延迟分析 1.1 延迟说明 延迟是流媒体传输中不可避免的问题&#…

S32K3 工具篇9:如何在无源码情况下灵活调试elf文件

S32K3 工具篇9&#xff1a;如何在无源码情况下灵活调试elf文件 一&#xff0c;文档简介二&#xff0c; 功能实现2.1 代码工具准备2.2 elf修改功能实现&#xff1a;Fun2功能跳过2.2.1 PC越过Fun22.2.2 Fun2替换为nop 2.3 elf修改功能实现&#xff1a;Fun4替换Fun2入口2.3.1 link…

树莓派PWM控制LED灯

目录 一、什么是PWM二、树莓派引脚图三、命令行控制LED灯四、PWM控制LED呼吸灯 一、什么是PWM PWM&#xff08;Pulse Width Modulation&#xff0c;脉冲宽度调制&#xff09;是一种通过调节数字信号的占空比&#xff08;Duty Cycle&#xff09;来模拟模拟信号的技术。它通过快…

第十四章 MQTT订阅

系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

六.MySQL增删查改

CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 一.增 insert 1.单行数据 全列插入 语法特点&#xff1a;不指定字段名&#xff0c;按表结构字段顺序依次提供所有值。 注意&#xff1a;字段顺序必须与表定义一…

TKernel模块--自定义RTTI,对象句柄,引用计数

TKernel模块–RTTI&#xff0c;对象句柄&#xff0c;引用计数 1.DEFINE_STANDARD_HANDLE(x1, x2) #define DEFINE_STANDARD_HANDLE(C1,C2) DEFINE_STANDARD_HANDLECLASS(C1,C2,Standard_Transient)其中&#xff1a; #define DEFINE_STANDARD_HANDLECLASS(C1,C2,BC) class C1…

关于TongWeb数据源兼容mysql驱动的注意事项

问题现象&#xff1a; TongWeb数据源在采用mysql驱动的国产数据库时&#xff0c;因数据库慢报超时为数据源配置参数的 validation-query-timeout值5秒&#xff0c;而不是期望的maxwait、connectiontimeout值。 The last packet successfully received from the server was 5,0…

CSS专题之水平垂直居中

前言 石匠敲击石头的第 16 次 在日常开发中&#xff0c;经常会遇到水平垂直居中的布局&#xff0c;虽然现在基本上都用 Flex 可以轻松实现&#xff0c;但是在某些无法使用 Flex 的情况下&#xff0c;又应该如何让元素水平垂直居中呢&#xff1f;这也是一道面试的必考题&#xf…

(新)MQ高级-MQ的可靠性

消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、数据持久化 为了提升性能&#xff0c;默认情况下MQ的数据都是在内存存储的临时数据&#xff0c;重启后就会消失。为了保证数据的可靠性&#xff0c;必须…

Microsoft Word使用技巧分享(本科毕业论文版)

小铃铛最近终于完成了毕业答辩后空闲下来了&#xff0c;但是由于学校没有给出准确地参考模板&#xff0c;相信诸位朋友们也在调整排版时感到头疼&#xff0c;接下来小铃铛就自己使用到的一些排版技巧分享给大家。 注&#xff1a;以下某些设置是根据哈尔滨工业大学&#xff08;威…

Linux 基础IO(上)

目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…