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

news2025/6/7 18:29:25

#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, addr
      mov al, data
      out dx, al
    }
 }
char inp(unsigned int addr)
// 从I/O端口输入一字节
 { char result;
   __asm
    { mov dx, addr
      in al, dx
      mov 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_H

typedef 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.coloradmin.cn/o/2401119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

板凳-------Mysql cookbook学习 (九)

第4章&#xff1a;表管理 4.0 引言 MySQL &#xff1a;&#xff1a; 员工样例数据库 &#xff1a;&#xff1a; 3 安装 https://dev.mysql.com/doc/employee/en/employees-installation.html Employees 数据库与几种不同的 存储引擎&#xff0c;默认情况下启用 InnoDB 引擎。编…

基于SpringBoot的“嗨玩旅游”网站设计与实现(源码+定制+开发)嗨玩旅游平台开发:景点展示与个性化推荐系统(SpringBoot)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

python版若依框架开发:python版若依部署

python版若依框架开发 从0起步,扬帆起航。 python版若依部署文章目录 python版若依框架开发1.源码2.概述3.部署1.源码 https://gitee.com/insistence2022/RuoYi-Vue-FastAPI 请诸君移步上述链接,即可对python版若依项目进行初步了解。 2.概述 若依框架本身基于java,可以快…

h5的aliplayer-min.js 加密视频会走到debugger

h5的aliplayer-min.js 如果 https://g.alicdn.com/apsara-media-box/imp-web-player/2.19.0/aliplayer-min.js走加密视频的话会有debugger 更换aliplayer-min.js版本解决了 https://g.alicdn.com/apsara-media-box/imp-web-player/2.25.1/aliplayer-min.js 对应css&#xff1a…

DashBoard安装使用

DashBoard安装使用 一、实验目的 1、掌握dashboard 的安装部署 2、熟悉图像化部署任务&#xff1a;产生pod---定义服务--验证访问 二、实验内容&#xff1a; 1、配置步骤 1.1、Helm安装 离线安装&#xff08;适用于内网/离线环境&#xff09; # 根据系统架构选择版本&am…

极客大挑战 2019 EasySQL 1(万能账号密码,SQL注入,HackBar)

题目 做法 启动靶机&#xff0c;打开给出的网址 随便输点东西进去&#xff0c;测试一下 输入1、1’、1"判断SQL语句闭合方式 输入以上两个都是以下结果 但是&#xff0c;输入1’时&#xff0c;出现的是另外结果 输入1&#xff0c;1"时&#xff0c;SQL语句没有…

采用 Docker GPU 部署的 Ubuntu 或者 windows 桌面环境

# 国内下载不了 docker pull gezp/ubuntu-desktop:24.04-cu12.6.2# 阿里云镜像 docker pull registry.cn-hongkong.aliyuncs.com/gezp/ubuntu-desktop:24.04-cu12.6.2# create container with nomachine docker run -d --restarton-failure --name myubuntu --shm-size1024m -e…

关于面试找工作的总结(四)

不同情况下收到offer后的处理方法 1.不会去的,只是面试练手2.还有疑问,考虑中3.offer/职位不满足期望的4.已确认,但又收到更好的5.还想挽回之前的offer6.确认,准备入职7.还想拖一下的1.不会去的,只是面试练手 HR您好,非常荣幸收到贵司的offer,非常感谢一直以来您的帮助,…

分布式拜占庭容错算法——实现工作量证明(PoW)算法详解

Java 实现工作量证明&#xff08;PoW&#xff09;算法详解 一、PoW 核心原理 #mermaid-svg-AAj0Pvst1PVcVy5v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AAj0Pvst1PVcVy5v .error-icon{fill:#552222;}#mermaid…

深度解析Mysql中MVCC的工作机制

MVCC,多版本并发控制 定义&#xff1a;维护一个数据的多个版本&#xff0c;使读写操作没有冲突&#xff0c;依赖于&#xff1a;隐藏字段&#xff0c;undo log日志&#xff0c;readView MVCC会为每条版本记录保存三个隐藏字段 DB_TRX_ID: 记录最近插入或修改该记录的事务IDDB_R…

MP4文件声音与视频分离

最近学习PR剪辑 要添加视频文件和音频文件 但是直接给MP4文件 得到的是一个整体 不管怎么切分 都是无法得到单独的整体 这就需要将视频文件和音频文件分离 我推荐使用ffmpeg工具进行分离 迅雷链接&#xff1a;https://pan.xunlei.com/s/VORu5x64jjL-gXFd_VTpYjRPA1?pwd8wec#…

接口自动化测试之pytest 运行方式及前置后置封装

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、Pytest 优点认知 1.可以结合所有的自动化测试工具 2.跳过失败用例以及失败重跑 3.结合allure生产美观报告 4.和Jenkins持续集成 5.很多强大的插件 pytest-htm…

06-排序

排序 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

FPGA管脚类型,及选择

fpga的IO Type选择&#xff0c;如下&#xff1a; 具体的定义&#xff1a;

如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ

单体架构学的差不多了&#xff0c;可以朝着微服务进军了&#xff0c;笔者打算实操一下 RabbitMQ&#xff08;这个和 Redis 一样重要的组件) 笔者这里采用的是本地 wsl2 的 Ubuntu22.04 先按指定的博客进行前置操作 Ubuntu22.04 安装 RabbitMQ 解决 ARM Ubuntu 22.04 缺少 libs…

R-CNN 模型算法流程梳理

目录 一、R-CNN整体流程 二、需要注意的地方 论文连接&#xff1a;[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation 如果你之前了解过RNN&#xff0c;很容易混淆认为R-CNN也具有RNN的时序循环功能&#xff0c;这种理解是错误…

本地日记本,用于记录日常。

文章目录 想法程序说明展望 想法 本人想要复盘以前的事情&#xff0c;所以就想着写一个小程序&#xff0c;记录一下一天发生了什么事情。以后如果忘记了可以随时查看。写日记的想法来自我看的一本书&#xff0c;里面有一段话说的意思是&#xff0c;经验从来都不是随着年龄增长…

[蓝桥杯]格子刷油漆

格子刷油漆 题目描述 X 国的一段古城墙的顶端可以看成 2N2N 个格子组成的矩形&#xff08;如下图所示&#xff09;&#xff0c;现需要把这些格子刷上保护漆。 你可以从任意一个格子刷起&#xff0c;刷完一格&#xff0c;可以移动到和它相邻的格子&#xff08;对角相邻也算数&…

ubuntu下libguestfs-tools

在ubuntu下&#xff0c;使用libguestfs-tools工具挂载其他磁盘和分区。 首先安装libguestfs-tools将vmx虚拟磁盘共享&#xff1a;sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other执行如下命令查看分区名称&#xff1a;virt-filesystems -a /mnt/hgfs/D/vmware/FGT_VM64-v7…

Authentication failed(切换了新的远程仓库tld)

启用 Git Credential Manager git config --global credential.helper manager 强制弹出凭据输入窗口 git config --global credential.helper.modalprompt true 指定 TFS 服务器使用基础认证&#xff08;Basic Auth&#xff09; git config --global credential.https://…