本帖最后由 oce4n 于 2024-3-7 14:52 编辑
第十集 数码管动态控制和原理,
这集逻辑没跟上,看了两遍才跟上,这集不懂的地方是这段算法取个位十位百位
- Show_Tab[0]=TimCNT/10000%10;
- Show_Tab[1]=TimCNT/1000%10+10;
- Show_Tab[2]=TimCNT/100%10;
- Show_Tab[3]=TimCNT/10%10;
复制代码
附上数码管动态显示计时器的代码,好让自己温故而知新
因为我这个小开发板只有四位数码管,所以根据冲哥的思路改动了一下,也是可以实现的。
- #include <REGX52.H>
-
- //数码管段码表
- unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
- unsigned char Show_Tab[5]={0,0,0,0};
- unsigned long TimCNT = 0;//变量计次
- unsigned char num=0;
- bit Run_Sta = 0;//开始运行标志
- sbit L1=P2^4;
- sbit L2=P2^5;
- sbit L3=P2^6;
- sbit L4=P2^7;
- sbit K2=P3^4;
- sbit K3=P3^5;
- sbit Beep=P2^3;
- void Delay1ms(unsigned char xms) //@11.0592MHz
- {
- unsigned char data i, j;
- while(xms--)
- {
-
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- }
-
- void NiXie(unsigned char i)
- {
- switch(i){
- case 0:
- L1=1;L2=0;L3=0;L4=0;break;
- case 1:
- L1=0;L2=1;L3=0;L4=0;break;
- case 2:
- L1=0;L2=0;L3=1;L4=0;break;
- case 3:
- L1=0;L2=0;L3=0;L4=1;break;
- }
-
-
- }
- void Show_Fre(void)
- {
- NiXie(num);
- P0=NixieTable[Show_Tab[num]];
- Delay1ms(1);
- num++;
- if(num>3)
- num=0;
- }
- void main()
- {
-
- while(1)
- {
-
-
- if(Run_Sta==1)
- { TimCNT++;
- Show_Tab[0]=TimCNT/10000%10;
- Show_Tab[1]=TimCNT/1000%10+10;
- Show_Tab[2]=TimCNT/100%10;
- Show_Tab[3]=TimCNT/10%10;
- }
- Show_Fre();
- if(K2==0)
- {
- Delay1ms(10);
- if(K2==0)
- {
- Beep=0;
- Delay1ms(10);
- Beep=1;
- while(K2==0){
- Show_Fre();
- }
- if(Run_Sta==0)
- TimCNT=0;
- Run_Sta = !Run_Sta;
- }
- }
- }
- }
复制代码
|