历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2021年02月04日 | 如何用51单片机数码管实现跑马灯功能?

2021-02-04 来源:eefocus

基于51单片机学习板。用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方向的启动或者暂停按键。记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。


(2)实现功能:


跑马灯运行:第1个至第8个LED灯一直不亮。在第9个至第16个LED灯,依次逐个亮灯并且每次只能亮一个灯。每按一次独立按键S13键,原来运行的跑马灯会暂停,原来暂停的跑马灯会运行。用S1来改变方向。用S5和S9来改变速度,每按一次按键的递增或者递减以10为单位。


数码管显示:本程序只有1个窗口,这个窗口分成3个局部显示。8,7,6位数码管显示运行状态,启动时显示“on”,停止时显示“oFF”。5位数码管显示数码管方向,正向显示“n”,反向显示“U”。4,3,2,1位数码管显示速度。数值越大速度越慢,最慢的速度是550,最快的速度是50。

如何用51单片机数码管实现跑马灯功能?


(3)源代码讲解如下:


#include "REG52.H"


#define const_voice_short 40 //蜂鸣器短叫的持续时间


#define const_key_time1 20 //按键去抖动延时的时间


#define const_key_time2 20 //按键去抖动延时的时间


#define const_key_time3 20 //按键去抖动延时的时间


#define const_key_time4 20 //按键去抖动延时的时间


void initial_myself();


void initial_peripheral();


void delay_short(unsigned int uiDelayShort);


void delay_long(unsigned int uiDelaylong);


//驱动数码管的74HC595


void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);


void display_drive(); //显示数码管字模的驱动函数


void display_service(); //显示的窗口菜单服务程序


//驱动LED的74HC595


void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);


void led_flicker_09_16(); //第9个至第16个LED的跑马灯程序,逐个亮并且每次只能亮一个.


void led_update(); //LED更新函数


void T0_time(); //定时中断函数


void key_service(); //按键服务的应用程序


void key_scan();//按键扫描函数 放在定时中断里


sbit beep_dr=P2^7; //蜂鸣器的驱动IO口


sbit key_sr1=P0^0; //对应学习板的S1键


sbit key_sr2=P0^1; //对应学习板的S5键


sbit key_sr3=P0^2; //对应学习板的S9键


sbit key_sr4=P0^3; //对应学习板的S13键


sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平


sbit led_dr=P3^5;


sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序


sbit dig_hc595_st_dr=P2^1;


sbit dig_hc595_ds_dr=P2^2;


sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序


sbit hc595_st_dr=P2^4;


sbit hc595_ds_dr=P2^5;


unsigned char ucKeySec=0; //被触发的按键编号


unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器


unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志


unsigned int uiKeyTimeCnt2=0; //按键去抖动延时计数器


unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志


unsigned int uiKeyTimeCnt3=0; //按键去抖动延时计数器


unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志


unsigned int uiKeyTimeCnt4=0; //按键去抖动延时计数器


unsigned char ucKeyLock4=0; //按键触发后自锁的变量标志


unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器


unsigned char ucLed_dr1=0; //代表16个灯的亮灭状态,0代表灭,1代表亮


unsigned char ucLed_dr2=0;


unsigned char ucLed_dr3=0;


unsigned char ucLed_dr4=0;


unsigned char ucLed_dr5=0;


unsigned char ucLed_dr6=0;


unsigned char ucLed_dr7=0;


unsigned char ucLed_dr8=0;


unsigned char ucLed_dr9=0;


unsigned char ucLed_dr10=0;


unsigned char ucLed_dr11=0;


unsigned char ucLed_dr12=0;


unsigned char ucLed_dr13=0;


unsigned char ucLed_dr14=0;


unsigned char ucLed_dr15=0;


unsigned char ucLed_dr16=0;


unsigned char ucLed_update=0; //刷新变量。每次更改LED灯的状态都要更新一次。


unsigned char ucLedStep_09_16=0; //第9个至第16个LED跑马灯的步骤变量


unsigned int uiTimeCnt_09_16=0; //第9个至第16个LED跑马灯的统计定时中断次数的延时计数器


unsigned char ucLedStatus16_09=0; //代表底层74HC595输出状态的中间变量


unsigned char ucLedStatus08_01=0; //代表底层74HC595输出状态的中间变量


unsigned char ucLedDirFlag=0; //方向变量,把按键与跑马灯关联起来的核心变量,0代表正方向,1代表反方向


unsigned int uiSetTimeLevel_09_16=300; //速度变量,此数值越大速度越慢,此数值越小速度越快。


unsigned char ucLedStartFlag=1; //启动和暂停的变量,0代表暂停,1代表启动


unsigned char ucDigShow8; //第8位数码管要显示的内容


unsigned char ucDigShow7; //第7位数码管要显示的内容


unsigned char ucDigShow6; //第6位数码管要显示的内容


unsigned char ucDigShow5; //第5位数码管要显示的内容


unsigned char ucDigShow4; //第4位数码管要显示的内容


unsigned char ucDigShow3; //第3位数码管要显示的内容


unsigned char ucDigShow2; //第2位数码管要显示的内容


unsigned char ucDigShow1; //第1位数码管要显示的内容


unsigned char ucDigDot8; //数码管8的小数点是否显示的标志


unsigned char ucDigDot7; //数码管7的小数点是否显示的标志


unsigned char ucDigDot6; //数码管6的小数点是否显示的标志


unsigned char ucDigDot5; //数码管5的小数点是否显示的标志


unsigned char ucDigDot4; //数码管4的小数点是否显示的标志


unsigned char ucDigDot3; //数码管3的小数点是否显示的标志


unsigned char ucDigDot2; //数码管2的小数点是否显示的标志


unsigned char ucDigDot1; //数码管1的小数点是否显示的标志


unsigned char ucDigShowTemp=0; //临时中间变量


unsigned char ucDisplayDriveStep=1; //动态扫描数码管的步骤变量


unsigned char ucWd1Part1Update=1; //窗口1的局部1更新显示变量


unsigned char ucWd1Part2Update=1; //窗口1的局部2更新显示变量


unsigned char ucWd1Part3Update=1; //窗口1的局部3更新显示变量


//根据原理图得出的共阴数码管字模表


code unsigned char dig_table[]=


{


0x3f, //0 序号0


0x06, //1 序号1


0x5b, //2 序号2


0x4f, //3 序号3


0x66, //4 序号4


0x6d, //5 序号5


0x7d, //6 序号6


0x07, //7 序号7


0x7f, //8 序号8


0x6f, //9 序号9


0x00, //无 序号10


0x40, //- 序号11


0x73, //P 序号12


0x5c, //o 序号13


0x71, //F 序号14


0x3e, //U 序号15


0x37, //n 序号16


};


void main()


{


initial_myself();


delay_long(100);


initial_peripheral();


while(1)


{


key_service(); //按键服务的应用程序


display_service(); //显示的窗口菜单服务程序


led_flicker_09_16(); //第9个至第16个LED的跑马灯程序,逐个亮并且每次只能亮一个.


led_update(); //LED更新函数


}


}


/* 注释一:


* 由于本程序只有1个窗口,而这个窗口又分成3个局部,因此可以省略去窗口变量uWd,


* 只用三个局部变量ucWdxPartyUpdate就可以了。


*/


void display_service() //显示的窗口菜单服务程序


{


if(ucWd1Part1Update==1) //更新显示当前系统是处于运行还是暂停的状态


{


ucWd1Part1Update=0; //及时把更新变量清零,防止一直进来更新


if(ucLedStartFlag==1) //启动,显示on


{


ucDigShow8=13; //显示o


ucDigShow7=16; //显示n


ucDigShow6=10; //显示空


}


else //暂停,显示oFF


{


ucDigShow8=13; //显示o


ucDigShow7=14; //显示F


ucDigShow6=14; //显示F


}


}


if(ucWd1Part2Update==1) //更新显示当前系统是处于正方向还是反方向


{


ucWd1Part2Update=0; //及时把更新变量清零,防止一直进来更新


if(ucLedDirFlag==0) //正方向,向上,显示n


{


ucDigShow5=16; //显示n


}


else //反方向,向下,显示U


{


ucDigShow5=15; //显示U


}


}


if(ucWd1Part3Update==1) //更新显示当前系统的速度,此数值越大速度越慢,此数值越小速度越快。


{


ucWd1Part3Update=0; //及时把更新变量清零,防止一直进来更新


ucDigShow4=10; //显示空 这一位不用,作为空格


if(uiSetTimeLevel_09_16>=100)


{


ucDigShow3=uiSetTimeLevel_09_16/100; //显示速度的百位


}


else


{


ucDigShow3=10; //显示空


}


if(uiSetTimeLevel_09_16>=10)


{


ucDigShow2=uiSetTimeLevel_09_16%100/10; //显示速度的十位


}


else


{


ucDigShow2=10; //显示空


}


ucDigShow1=uiSetTimeLevel_09_16%10; //显示速度的个位


}


}


void key_scan()//按键扫描函数 放在定时中断里


{


if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位


{


ucKeyLock1=0; //按键自锁标志清零


uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。


}


else if(ucKeyLock1==0)//有按键按下,且是第一次被按下


{


uiKeyTimeCnt1++; //累加定时中断次数


if(uiKeyTimeCnt1>const_key_time1)


{


uiKeyTimeCnt1=0;


ucKeyLock1=1; //自锁按键置位,避免一直触发


ucKeySec=1; //触发1号键


}


}


if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位


{


ucKeyLock2=0; //按键自锁标志清零


uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。


}


else if(ucKeyLock2==0)//有按键按下,且是第一次被按下


{


uiKeyTimeCnt2++; //累加定时中断次数


if(uiKeyTimeCnt2>const_key_time2)


{


uiKeyTimeCnt2=0;


ucKeyLock2=1; //自锁按键置位,避免一直触发


ucKeySec=2; //触发2号键


}


}


if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位


{


ucKeyLock3=0; //按键自锁标志清零


uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。


}


else if(ucKeyLock3==0)//有按键按下,且是第一次被按下


{


uiKeyTimeCnt3++; //累加定时中断次数


if(uiKeyTimeCnt3>const_key_time3)


{


uiKeyTimeCnt3=0;


ucKeyLock3=1; //自锁按键置位,避免一直触发


ucKeySec=3; //触发3号键


}


}


if(key_sr4==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位


{


ucKeyLock4=0; //按键自锁标志清零


uiKeyTimeCnt4=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。


}


else if(ucKeyLock4==0)//有按键按下,且是第一次被按下


{


uiKeyTimeCnt4++; //累加定时中断次数


if(uiKeyTimeCnt4>const_key_time4)


{


uiKeyTimeCnt4=0;


ucKeyLock4=1; //自锁按键置位,避免一直触发


ucKeySec=4; //触发4号键


}


}


}


void key_service() //按键服务的应用程序


{


switch(ucKeySec) //按键服务状态切换


{


case 1:// 改变跑马灯方向的按键 对应学习板的S1键


if(ucLedDirFlag==0) //通过中间变量改变跑马灯的方向


{


ucLedDirFlag=1;


}


else


{


ucLedDirFlag=0;


}


ucWd1Part2Update=1; //及时更新显示方向


uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。


ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发


break;


case 2:// 加速按键 对应学习板的S5键 uiSetTimeLevel_09_16越小速度越快


uiSetTimeLevel_09_16=uiSetTimeLevel_09_16-10;


if(uiSetTimeLevel_09_16<50) //最快限定在50


{


uiSetTimeLevel_09_16=50;


}


ucWd1Part3Update=1; //及时更新显示速度


uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。


ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发


break;


case 3:// 减速按键 对应学习板的S9键 uiSetTimeLevel_09_16越大速度越慢


uiSetTimeLevel_09_16=uiSetTimeLevel_09_16+10;


if(uiSetTimeLevel_09_16>550) //最慢限定在550


{


uiSetTimeLevel_09_16=550;


}


ucWd1Part3Update=1; //及时更新显示速度


uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。


ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发


break;


case 4:// 启动和暂停按键 对应学习板的S13键 ucLedStartFlag为0时代表暂停,为1时代表启动


if(ucLedStartFlag==1) //启动和暂停两种状态循环切换


{


ucLedStartFlag=0;


}


else //启动和暂停两种状态循环切换


{


ucLedStartFlag=1;


}


ucWd1Part1Update=1; //及时更新显示系统的运行状态,是运行还是暂停.


uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。


ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发


break;


}


}


void led_update() //LED更新函数


{


if(ucLed_update==1)


{


ucLed_update=0; //及时清零,让它产生只更新一次的效果,避免一直更新。


if(ucLed_dr1==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x01;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xfe;


}


if(ucLed_dr2==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x02;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xfd;


}


if(ucLed_dr3==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x04;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xfb;


}


if(ucLed_dr4==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x08;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xf7;


}


if(ucLed_dr5==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x10;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xef;


}


if(ucLed_dr6==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x20;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xdf;


}


if(ucLed_dr7==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x40;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0xbf;


}


if(ucLed_dr8==1)


{


ucLedStatus08_01=ucLedStatus08_01|0x80;


}


else


{


ucLedStatus08_01=ucLedStatus08_01&0x7f;


}


if(ucLed_dr9==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x01;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xfe;


}


if(ucLed_dr10==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x02;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xfd;


}


if(ucLed_dr11==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x04;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xfb;


}


if(ucLed_dr12==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x08;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xf7;


}


if(ucLed_dr13==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x10;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xef;


}


if(ucLed_dr14==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x20;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xdf;


}


if(ucLed_dr15==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x40;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0xbf;


}


if(ucLed_dr16==1)


{


ucLedStatus16_09=ucLedStatus16_09|0x80;


}


else


{


ucLedStatus16_09=ucLedStatus16_09&0x7f;


}


hc595_drive(ucLedStatus16_09,ucLedStatus08_01); //74HC595底层驱动函数


}


}


void display_drive()


{


//以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路


switch(ucDisplayDriveStep)


{


case 1: //显示第1位


ucDigShowTemp=dig_table[ucDigShow1];


if(ucDigDot1==1)


{


ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点


}


dig_hc595_drive(ucDigShowTemp,0xfe);


break;


case 2: //显示第2位


ucDigShowTemp=dig_table[ucDigShow2];


if(ucDigDot2==1)


{


ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点


}


dig_hc595_drive(ucDigShowTemp,0xfd);


break;


case 3: //显示第3位


ucDigShowTemp=dig_table[ucDigShow3];


if(ucDigDot3==1)


{


ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点


}


dig_hc595_drive(ucDigShowTemp,0xfb);

推荐阅读

史海拾趣

台湾丰宾(CapXon)公司的发展小趣事

随着全球环保意识的不断提高,CapXon公司积极响应绿色生产的号召,致力于实现可持续发展。公司采用环保材料和制造工艺,减少生产过程中的污染物排放,降低对环境的影响。同时,CapXon还积极参与各种环保活动和公益事业,为推动电子行业的绿色发展贡献自己的力量。

以上五个故事分别从初创与起步、市场拓展与品牌塑造、技术创新与产业升级、品质管理与生产优化以及绿色生产与可持续发展五个方面,展示了台湾丰宾(CapXon)公司在电子行业发展的历程和成就。这些故事不仅体现了公司的实力和魅力,也展现了公司在推动电子行业进步和可持续发展方面所做的努力和贡献。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

1958年,Bals Elektrotechnik公司迎来了一个重大突破——连接器开始批量生产。随着技术的不断进步,公司逐渐将材料从铝转向塑料,这不仅降低了生产成本,还提高了产品的性能和可靠性。这一创新举措使得Bals在电气连接器市场上占据了重要地位,为后续的发展奠定了坚实基础。

Enovation Controls LLC公司的发展小趣事

1958年,Bals Elektrotechnik公司迎来了一个重大突破——连接器开始批量生产。随着技术的不断进步,公司逐渐将材料从铝转向塑料,这不仅降低了生产成本,还提高了产品的性能和可靠性。这一创新举措使得Bals在电气连接器市场上占据了重要地位,为后续的发展奠定了坚实基础。

Beckhoff Automation GmbH公司的发展小趣事

品质是电子行业的生命线,BCD Semi公司深知这一点。因此,公司始终将品质管理放在首位,建立了完善的品质管理体系和质量控制流程。公司从原材料采购、生产制造到产品出厂,每一个环节都进行严格的质量把控,确保产品的高品质和稳定性。同时,BCD Semi还不断引进先进的生产设备和技术,优化生产流程,提高生产效率,为客户提供更优质的产品和服务。

Anytek Technology Corporation Ltd公司的发展小趣事

Anytek始终坚持以创新为驱动,不断推出具有市场竞争力的新产品。2007年,公司自主研发的创新型产品“高清汽车行车记录仪”面世,这款产品以其高清画质、稳定性能和易用性等特点,迅速占领了市场制高点。随后,Anytek又于2008年推出了行业唯一一款双镜头的“双镜头行车记录仪”,这一创新设计进一步提升了行车记录仪的功能性和实用性,赢得了市场的广泛认可。

EDI [Electronic devices inc.]公司的发展小趣事

在1950年代,Eclipse Magnetics公司决定将他们的磁铁涂上红色,并与马蹄形标志和公司颜色相匹配。这个简单的改变在当时看似微不足道,但却成为了一个重要的转折点。红色磁铁不仅提升了产品的视觉吸引力,还增强了品牌识别度。随着红色磁铁的广泛应用,Eclipse Magnetics开始逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

锂离子电池智能充电器硬件的设计

锂离子电池具有较高的能量重量和能量体积比,无记忆效应,可重复充电次数多,使用寿命长,价格也越来越低。一个良好的充电器可使电池具有较长的寿命。利用C8051F310单片机设计的智能充电器,具有较高的测量精度,可很好的控制充电电流的大小,适时 ...…

查看全部问答>

天下最有才的辞职信

  亲爱的老板:    昨天外面下了一场雨嗳,这让我想起我国著名诗人汪国真的诗句:“总有些这样的时候,正是为了爱,才悄悄躲开,躲开的是身影,躲不开的,却是那份,默默的情怀。……“    领导你看,他写得多好啊,我一边读他的诗,一边 ...…

查看全部问答>

wince6.0 bootloader疑问

小弟现在手上有块深圳海天雄的6410开发板。最近在学习它的bootloader源码。 在网上看到we-hjb大侠的帖子上说,一般在eboot之前有个nboot,可是海天雄给的源码中好像没有nboot这一块,生成的eboot.bin是264k。 请问大家在nandflash启动的时候,可 ...…

查看全部问答>

嵌入式做到什么程度可以去开发手机?

听说现在的手机很多用ARM作为处理器,各位大虾能否给小弟一些相关信息,现在对嵌入式比较感兴趣,正准备学习。…

查看全部问答>

verilog HDL程序错误问题

一个数字跑表程序,clk:时钟信号;clr:异步复位信号;pause:暂停信号;msh,msl:百分秒高位和低位:sh,sl:秒高位和低位;mh,ml:分高位和低位module paobiao(msh,msl,sh,sl,mh,ml,clk,clr,pause);output [3:0]msh,msl,sh,sl,mh,ml;input&nbs ...…

查看全部问答>

工作,唉。

上学的时候吧想工作,一直认为上班好,可上班了觉得还是上学好啊,呵呵。开始的时候觉得工作了很新鲜,慢慢的就变得麻木啦,开始的时候还在想要不要换工作,最后还是决定坚持下去,不三心二意的换来换去的,没了换工作的烦恼,缺有了新的烦恼,那就 ...…

查看全部问答>

新手求救!定义bit变量!

我用c写程序的时候想定义一个可位操作的变量,可是430不支持bit指令,请高手赐教怎么实现?…

查看全部问答>

如何选取压敏电阻和热敏电阻

请教各位大侠,如何选取压敏电阻和热敏电阻,有用过TVS的吗?…

查看全部问答>

【共享】芯嵌stm32入门教程 + 视频

(一)芯嵌stm32入门视频,下载地址:http://pan.baidu.com/share/link?shareid=2052956608&uk=3942664303 芯嵌stm32入门视频之一《stm32入门初探》 芯嵌stm32入门视频之二《芯嵌stm32使用指南》 芯嵌stm32入门视频之三《JLink的安装和使用》 ...…

查看全部问答>

已知磁芯 如何选择骨架?

新手在此弱弱地请教一个问题  已知磁芯 如何选择骨架?是每个对应的磁芯可以能找到相对应的骨架吗? \0\0\0eeworldpostqq…

查看全部问答>