STC8H延时、串口打印数字代码

STC8H延时、串口打印数字代码

芯片:STC8H8K64U

延时代码:

/* 可调毫秒延时函数 @22.1184MHz */
void MyDelay_ms(u16 ms)	
{
	unsigned char i, j;
	while(ms--)
	{
		i = 29;
		j = 183;
		do
		{
			while (--j);
		} while (--i);
	}
}

应用举例:

MyDelay_ms(12000);              // 延时12秒

串口打印数字代码:

/* 数字打印函数 */
void U2_PrintNum(u16 num)
{
	u16 div = 10000;                 // 除数初始值:10000,对应u16最大5位数:万位 10000,千位1000,百位100,十位10,个位1
	u8 flag = 0;                     // 标志位:0=还没输出有效数字;1=已经开始输出数字
	while(div > 0)                   // 循环依次取出:万、千、百、十、个,共5位
	{
		u8 d = num / div;            // 取出当前最高位数字
		if(d || flag)                // 重要判断:当前位不为0,或者已经输出过数字
		{
			TX2_write2buff(d + '0'); // 数字转ASCII:数字+字符'0',送入串口发送缓存
			flag = 1;                // 标记:已经开始输出有效数字,后面的0不能省略
		}
		num %= div;                  // 去掉已经取出的高位
		div /= 10;                   // 除数除以10,取下一位
	}
	if(!flag) TX2_write2buff('0');   // 如果全程flag都是0,说明输入num=0,单独打印字符'0'
}

应用举例:

PrintString2("count:");            
U2_PrintNum(Num);
PrintString2("\r\n"); 

适用场景:单片机(STM32/51 等)串口输出数字,自动去掉数字前面多余的前导 0。 例如:num=123,不会打印00123,只会打印123;特殊:num=0单独打印0。

例1:num = 123

  1. div=10000:123/10000=0,flag=0 → 不打印

  2. div=1000:123/1000=0,flag=0 → 不打印

  3. div=100:123/100=1,d不为0 → 打印'1',flag=1;num=23

  4. div=10:23/10=2,flag=1 → 打印'2';num=3

  5. div=1:3/1=3,flag=1 → 打印'3';num=0

  6. div /=10 → div=0,退出while

  7. flag=1,不执行最后的if

最终串口输出字符串:"123"

例2:num = 0

while循环5次,每一次d都是0,flag一直保持0。
循环结束后 !flag成立 → 打印'0'
输出:"0"

例3:num = 1005

  • 万位:0,跳过

  • 千位:1 → 打印'1',flag置1

  • 百位:0,flag已经是1,所以这个0要打印 → 打印'0'

  • 十位:0,flag=1 → 打印'0'

  • 个位:5 → 打印'5'

    输出:"1005"

关键点说明

  1. u16范围:0~65535,最大5位十进制数,所以除数从10000开始,刚好覆盖全部位数。
  2. flag作用:消除前导零,但保留数字中间和末尾的0。
    • 没打印过有效数字前,遇到0直接跳过;
    • 一旦打印了第一个非0数字(flag=1),后面所有位哪怕是0都会输出。
  3. d + '0':ASCII编码转换。字符'0'的ASCII码是48,数字0+48='0'、1+48='1'。
  4. TX2_write2buff():底层串口2函数,把字符放进发送缓冲区,由硬件后续发送。

潜在局限

  • 只能打印无符号16位正数(0~65535),不能打印负数;
  • 固定最多5位,如果传大于65535的数会溢出;
  • 依赖TX2_write2buff这个串口底层函数,没有串口发送完成等待。
posted @ 2026-09-09 15:40  Q&25  阅读(14)  评论(0)    收藏  举报