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
-
div=10000:
123/10000=0,flag=0 → 不打印 -
div=1000:
123/1000=0,flag=0 → 不打印 -
div=100:
123/100=1,d不为0 → 打印'1',flag=1;num=23 -
div=10:
23/10=2,flag=1 → 打印'2';num=3 -
div=1:
3/1=3,flag=1 → 打印'3';num=0 -
div /=10 → div=0,退出while
-
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"
关键点说明
u16范围:0~65535,最大5位十进制数,所以除数从10000开始,刚好覆盖全部位数。flag作用:消除前导零,但保留数字中间和末尾的0。- 没打印过有效数字前,遇到0直接跳过;
- 一旦打印了第一个非0数字(flag=1),后面所有位哪怕是0都会输出。
d + '0':ASCII编码转换。字符'0'的ASCII码是48,数字0+48='0'、1+48='1'。TX2_write2buff():底层串口2函数,把字符放进发送缓冲区,由硬件后续发送。
潜在局限
- 只能打印无符号16位正数(0~65535),不能打印负数;
- 固定最多5位,如果传大于65535的数会溢出;
- 依赖
TX2_write2buff这个串口底层函数,没有串口发送完成等待。
浙公网安备 33010602011771号