缘由https://ask.csdn.net/questions/7963638
要求数码管从零开始,每隔一秒计数一次,到20号归零,蜂鸣器发出提示音。
cpp
#include <reg52.h>
unsigned char code ShuMaGuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0X80,118,121,56,63};//0~9隐.HELO
sbit fm=P3^4;
void main()
{//缘由https://ask.csdn.net/questions/7963638
unsigned char w=0,ys=0,sy=0,my=0,sz=0;
bit k=0;
while(1)
{
if(++my>40){if(k)fm=~fm;my=0;}//第一步调试蜂鸣器频率
if(++sy==0)//第二步写数码管显示延时
{
P2=P1=0;//写数码管段消隐,位关闭。
if(!w)w=1;else w*=2;P2=255-w;//写2位数码管动态位驱动
P1=ShuMaGuan[w==1?sz/10:w==2?sz%10:10];//写数码管段驱动,并拆分整数送相应位。
if(++ys==0)if(++sz>20){k=1;sz=0;}else k=0;//第三步写数码管显示值步进和延时,并控制蜂鸣器。
}
}
}
单片机时间片策略当然是有的,荔枝:数码管显示延时的时间片,由于写法不同,则时间片的利用也不同,
如使用if判断延时是这样的char ys=0;while(1){if(++ys==0){数码管显示}else 其他处理时间;}
如使用傻等式是这样的char ys=0;while(1){数码管显示;while(++ys==0);}那么只有傻傻等呆空循环完成后才能作其他事情;
而上面用判断的则不然,只要判断延时还没到的这段时间就可以执行其他事件,这就是2种不同思路产生不同结果。