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