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

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

#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.lryc.cn/news/2401119.html

相关文章:

  • 板凳-------Mysql cookbook学习 (九)
  • 深入解析 Flask 命令行工具与 flask run命令的使用
  • 第6篇:中间件 SQL 重写与语义分析引擎实现原理
  • 基于SpringBoot的“嗨玩旅游”网站设计与实现(源码+定制+开发)嗨玩旅游平台开发:景点展示与个性化推荐系统(SpringBoot)
  • python版若依框架开发:python版若依部署
  • React进阶:状态管理选择题
  • h5的aliplayer-min.js 加密视频会走到debugger
  • 第5篇《中间件负载均衡与连接池管理机制设计》
  • DashBoard安装使用
  • 极客大挑战 2019 EasySQL 1(万能账号密码,SQL注入,HackBar)
  • C# CallerMemberName特性
  • 采用 Docker GPU 部署的 Ubuntu 或者 windows 桌面环境
  • 关于面试找工作的总结(四)
  • 分布式拜占庭容错算法——实现工作量证明(PoW)算法详解
  • 深度解析Mysql中MVCC的工作机制
  • MP4文件声音与视频分离
  • 接口自动化测试之pytest 运行方式及前置后置封装
  • 服务器被攻击了怎么办
  • 06-排序
  • python,shell,linux,bash概念的不同和对比联系
  • FPGA管脚类型,及选择
  • 如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ
  • R-CNN 模型算法流程梳理
  • 细说C语言将格式化输出到FILE *stream流的函数fprintf、_fprintf_I、fwprintf、_fwprintf_I
  • 本地日记本,用于记录日常。
  • [蓝桥杯]格子刷油漆
  • Monorepo架构: 项目管理工具介绍、需求分析与技术选型
  • ubuntu下libguestfs-tools
  • Authentication failed(切换了新的远程仓库tld)
  • 【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析