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

8088单板机C语言sprintf()格式化串口输出---Prj04_第1张图片

#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帮了我很大的忙

8088单板机C语言sprintf()格式化串口输出---Prj04_第2张图片

你可能感兴趣的:(c语言,单片机,开发语言)