完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
{:12:}{:12:}{:12:}学到挺多 以后继续关注,谢谢这种乐于分享的人,谢谢
|
|
|
|
|
|
|
|
|
|
|
|
|
|
顶
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2013-1-30 16:19 编辑
第四节:“鸿哥三宝”之74HC165(按键扫描篇) (1) 开场白: 这节将要跟大家介绍一下鸿哥的“三宝”,它们分别是74HC165,74HC595,ULN2003A.之所以它们在我心中的地位那么高,是因为很多工控小项目经常用到它。74HC165使我们从此不再为单片机的输入口不足而烦恼,我们用3根IO口就可以检测100多路的输入信号。74HC595使我们从此不再为单片机的输出口不足而烦恼,我们用4根IO口就可以驱动100多个继电器或者LED。而ULN2003A则大大简化了我们的三极管驱动电路,一个芯片就集成了7个三极管,它有500mA的驱动能力,内部自带续流二极管,用来驱动继电器的时候,二极管也省了。74HC165对静电很敏感,很脆弱,在通电的情况,绝对不要用手摸到他的引脚,我曾经用非绝缘的镊子来短接其输入口,烧坏了很多个,因此对于74HC165我们要懂得怜香惜玉,小心呵护。总之,“鸿哥三宝”实乃电子工程师居家旅行之必备良药。 (2)功能需求:每按一个按键,蜂鸣器就响一次。 (3)硬件原理: (a)把两个74HC165联级起来,就可以达到用3根IO口来检测16个按键的目的。此电路的本质是并入串出的原理。具体的电路读者只要下载芯片资料一看就明。还是那句话,按键那里记得接20K左右的上拉电阻。 (b)用1个IO经过8050三极管来驱动有源蜂鸣器,有源蜂鸣器通电就一直响,断电就停止。 (4)源码适合的单片机:PIC18f4520,晶振为22.1184MHz (5)源代码讲解如下: #include //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_sr #define beep_dr LATA2 //蜂鸣器输出 # define hc165_cp_dr LATA0 //74hc165的3根驱动IO之一 # define hc165_pl_dr LATA1 //74hc165的3根驱动IO之一 # define hc165_q7_sr RE0 //74hc165的3根驱动IO之一 //补充说明:吴坚鸿程序风格是这样的,凡是做延时计数阀值的常量 //前缀都用cnt_表示。 #define cnt_delay_cnt1 40 //按键去抖动延时阀值 #define cnt_voice_time 150 //蜂鸣器响的声音长短的延时阀值 //补充说明:吴坚鸿程序风格是这样的,凡是按键扫描函数都放在定时中 //断里,凡是按键服务程序都是放在main函数循环里。有人说不应该把子程序//放在中断里,别听他们,信鸿哥无坎坷。 void key_scan(); //按键扫描函数,放在定时中断里 void key_service(); //按键服务函数,放在main函数循环里 //补充说明:吴坚鸿程序风格是这样的,凡是switch()语句括号里面的变量名 //后缀都用_step表示。 unsigned char key_step=1; //按键扫描步骤变量,在switch()语句的括号里 //补充说明:吴坚鸿程序风格是这样的,凡是按键或者感应输入的自锁变量名 //后缀都用_lock表示。 unsigned char key_lock1=0; //按键自锁标志 unsigned char key_lock2=0; //按键自锁标志 unsigned char key_lock3=0; //按键自锁标志 unsigned char key_lock4=0; //按键自锁标志 //补充说明:吴坚鸿程序风格是这样的,凡是计数器延时的变量 //后缀都用_cnt表示。 unsigned int delay_cnt1=0; //延时计数器的变量 unsigned int delay_cnt2=0; //延时计数器的变量 unsigned int delay_cnt3=0; //延时计数器的变量 unsigned int delay_cnt4=0; //延时计数器的变量 unsigned int voice_time_cnt; //蜂鸣器响的声音长短的计数延时 //补充说明:吴坚鸿程序风格是这样的,凡是做类型的变量的分类 //后缀都用_sec表示。 Unsigned char key_sec=0; //哪个按键被触发 Unsigned int key_status=0; //一个字节8位,此处2个字节,共16位,每一位代表一////个按键的状态 //主程序 main() { ADCON0=0x00; ADCON1=0x0f; //全部为数字信号 ADCON2=0xa1; //右对齐 RBPU=0; //上拉电阻 SSPEN=0; //决定RA5不作为串口 TRISA2=0; //蜂鸣器输出 TRISA0=0; //74hc165的3根驱动IO之一 TRISA1=0; //74hc165的3根驱动IO之一 TRISE0=1; //74hc165的3根驱动IO之一 T1CON=0x24; //定时器中断配置 TMR1H=0xFE; TMR1L=0xEF; TMR1IF=0; TMR1IE=1; TMR1ON=1; TMR1IE=1; //补充说明,以上的内容为寄存器配置,每种不同的单片机会有点差异, //大家不用过度关注以上寄存器的配置,只要知道有这么一回事即可 beep_dr=0; //关蜂鸣器,上电初始化IO while(1) { CLRWDT(); //喂看门狗,大家不用过度关注此行 key_service(); //按键服务 } } void key_scan() //按键扫描函数 { unsigned char j; //中间循环变量 Key_status =0x0000; //每个按键的电平状态,共16个 hc165_pl_dr=0; asm("nop"); asm("nop"); hc165_pl_dr=1; asm("nop"); asm("nop"); for(j=0;j<16;j++) { hc165_cp_dr=0; asm("nop"); asm("nop"); key_status=key_status<<1; if(hc165_q7_sr==1)key_status=key_status+1; hc165_cp_dr=1; asm("nop"); asm("nop"); } //以上一小段代码是通过驱动2个74HC165来获取16个按键的电平状态 //key_status //以下代码通过解析每一位电平状态来确定哪个按键被触发 if((key_status &0x0001)==0x0001) { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock1==0) { ++ delay_cnt1; if(delay_cnt1> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt1=0; key_lock1=1; key_sec=1; //触发1号键 } } if((key_status &0x0002)==0x0002) { key_lock2=0; //按键自锁标志清零 delay_cnt2=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock2==0) { ++ delay_cnt2; if(delay_cnt2> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt2=0; key_lock2=1; key_sec=2; //触发2号键 } } if((key_status &0x0004)==0x0004) { key_lock3=0; //按键自锁标志清零 delay_cnt3=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock3==0) { ++ delay_cnt3; if(delay_cnt3> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt3=0; key_lock3=1; key_sec=3; //触发3号键 } } if((key_status &0x0008)==0x0008) { key_lock4=0; //按键自锁标志清零 delay_cnt4=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock4==0) { ++ delay_cnt4; if(delay_cnt4> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt4=0; key_lock4=1; key_sec=4; //触发4号键 } } //如果要接16个按键,读者可以继续往下添加类似的代码,本例只触发4个按键作为演示 } void key_service() //按键服务函数 { switch(key_sec) //按键服务状态切换 { case 1:// 1号键 // 补充说明:voice_time_cnt只要不为0蜂鸣器就会响,中断里判断voice_time_cnt不为0 //时,会不断自减,一直到它为0时,自动把蜂鸣器关闭 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 2:// 2号键 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 3://3号键 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 4://4号键 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; } } //中断 void interrupt timer1rbint(void) { if(TMR1IE==1&&TMR1IF==1) //定时中断 { TMR1IF=0; //定时中断标志位关闭 TMR1ON=0; //定时中断开关关闭 key_scan(); //按键扫描函数 if(voice_time_cnt) //控制蜂鸣器声音的长短 { beep_dr=1; //蜂鸣器响 --voice_time_cnt; //蜂鸣器响的声音长短的计数延时 } else { beep_dr=0; //蜂鸣器停止 } TMR1H=0xFe; //重新设置定时时间间隔 TMR1L=0x00; TMR1ON=1; //定时中断开关打开 } } (6)小结: 有一些人咋看我的程序,觉得不咋地,甚至有人觉得臃肿多余,还不够精简。我在这里多分享一下这方面的经验。只要单片机ROM允许的情况下,写程序最重要的不是精简,因为刚开发一个项目的时候,把过多的时间用在精简优化上,反而会影响开发效率。应该像记流水账一样,想到哪一步就写哪一步的代码即可,代码多占点程序容量没关系,关键是不要影响程序运行效率,而且程序哪怕是记流水账也要有它的规律性。因为精简就意味着要用循环,要用数组这些元素,而程序一旦加入这些元素,其实后续的可读性与可改性就没有那么强。比如说我上面按键扫描那段程序key_scan(),其实4个按键的扫描程序都很有规律性,代码相似度有百分之九十。如果因为单片机ROM确实不够,我非要去优化,我只要加一个循环就可以大概省了四分之三的容量,但是一般容量允许的情况下,我没必要去优化容量。因为优化容量并不等于优化运行效率,而且影响易读性与可改性。(未完待续) |
|
|
|
|
|
本帖最后由 jianhong_wu 于 2014-1-8 01:43 编辑
第五节:“鸿哥三宝”之74HC595(继电器驱动篇) (1) 开场白: 用74HC595驱动很多继电器时,有2个地方需要特别注意. (a) 就是此芯片的片选脚OE不要为了省一个IO口而直接接地,否则会引起上电瞬间继电器莫名其妙地动作。为了解决这个问题,OE脚应该用一个IO口单独驱动,并且千万要记住,此IO必须接一个15K左右的上拉电阻,然后在程序刚上电运行时,必须尽快把所有的74HC595输出口置低。当然还有另外一种解决办法,就是用一个10uF的电解电容跟一个100K的下拉电阻,组成跟51单片机外围复位电路原理一样的电路,连接到OE口,这样确保上电瞬间OE口有一小段时间是处于高电平状态,在此 期间,尽快通过软件把74hc595的所有输出口置低。 (b) 如果驱动有70个继电器以上,那么st与sh的两个脚要对地接一个103电容,抗干扰效果很好。 (2) 功能需求: (a) 每按一个按键,蜂鸣器就响一次。 (b) 按第一个按键时,第一个继电器启动,其它所有的继电器关闭。按第二个按键时,第二个继电器启动,其它所有的继电器关闭。每个按键依次下去。 (3)硬件原理: (a)把两个74HC165联级起来,就可以达到用3根IO口来检测16个按键的目的。此电路的本质是并入串出的原理。具体的电路读者只要下载芯片资料一看就明。还是那句话,按键那里记得接20K左右的上拉电阻。 (b)用1个IO经过8050三极管来驱动有源蜂鸣器,有源蜂鸣器通电就一直响,断电就停止。 (c)把两个74HC595联级起来,74HC595并口输出的是TTL电平,经过ULN2003A后,就可以达到用4根IO口驱动16个继电器的目的。用了ULN2003A后,电路显得非常简洁,续流二极管也不用了。昨天我搞了一个项目,就是用ULN2003A来驱动继电器的,交给客户的时候,客户找了一个40岁左右的工程师来验货,他一上来就跟我摆架子,他一看电路就说不行,说我犯了最基本的错误,怎么驱动继电器不加续流二极管呢。我骄傲地说,你OUT了,ULN2003A本身已经集成了续流二极管。他无语。 (4)源码适合的单片机:PIC18f4520,晶振为22.1184MHz (5)源代码讲解如下: #include //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_sr #define beep_dr LATA2 //蜂鸣器输出 # define hc165_cp_dr LATA0 //74hc165的3根驱动IO之一 # define hc165_pl_dr LATA1 //74hc165的3根驱动IO之一 # define hc165_q7_sr RE0 //74hc165的3根驱动IO之一 # define hc595_sh_dr LATA3 //74hc595的4根驱动IO之一 # define hc595_st_dr LATA4 //74hc595的4根驱动IO之一 # define hc595_ds_dr LATA5 //74hc595的4根驱动IO之一 # define hc595_oe_dr LATE1 //74hc595的4根驱动IO之一 //补充说明:吴坚鸿程序风格是这样的,凡是做延时计数阀值的常量 //前缀都用cnt_表示。 #define cnt_delay_cnt1 40 //按键去抖动延时阀值 #define cnt_voice_time 150 //蜂鸣器响的声音长短的延时阀值 //补充说明:吴坚鸿程序风格是这样的,凡是按键扫描函数都放在定时中 //断里,凡是按键服务程序都是放在main函数循环里。有人说不应该把子程序//放在中断里,别听他们,信鸿哥无坎坷。 void key_scan(); //按键扫描函数,放在定时中断里 void key_service(); //按键服务函数,放在main函数循环里 //补充说明:以下程序函数都放在按键服务程序key_service()中 void relay_status_clear(); //把relay_status清零 void relay_status_set_1(); //把relay_status对应的第1个继电器启动 void relay_status_set_2(); //把relay_status对应的第2个继电器启动 void relay_status_set_3(); //把relay_status对应的第3个继电器启动 void relay_status_set_4(); //把relay_status对应的第4个继电器启动 void relay_drive(); //继电器驱动程序,relay_status映射继电器的状态 void _nop_(); //驱动时序延时函数 //补充说明:吴坚鸿程序风格是这样的,凡是switch()语句括号里面的变量名 //后缀都用_step表示。 unsigned char key_step=1; //按键扫描步骤变量,在switch()语句的括号里 //补充说明:吴坚鸿程序风格是这样的,凡是按键或者感应输入的自锁变量名 //后缀都用_lock表示。 unsigned char key_lock1=0; //按键自锁标志 unsigned char key_lock2=0; //按键自锁标志 unsigned char key_lock3=0; //按键自锁标志 unsigned char key_lock4=0; //按键自锁标志 //补充说明:吴坚鸿程序风格是这样的,凡是计数器延时的变量 //后缀都用_cnt表示。 unsigned int delay_cnt1=0; //延时计数器的变量 unsigned int delay_cnt2=0; //延时计数器的变量 unsigned int delay_cnt3=0; //延时计数器的变量 unsigned int delay_cnt4=0; //延时计数器的变量 unsigned int voice_time_cnt; //蜂鸣器响的声音长短的计数延时 //补充说明:吴坚鸿程序风格是这样的,凡是做类型的变量的分类 //后缀都用_sec表示。 Unsigned char key_sec=0; //哪个按键被触发 //补充说明:吴坚鸿程序风格是这样的,凡是用来映射硬件IO电平的变量 //后缀都用_status表示。 Unsigned int key_status=0; //一个字节8位,此处2个字节,共16位,每一位映射一////个按键的状态 Unsigned int relay_status=0; //一个字节8位,此处2个字节,共16位,每一位映射一 ////个继电器的状态 //主程序 main() { ADCON0=0x00; ADCON1=0x0f; //全部为数字信号 ADCON2=0xa1; //右对齐 RBPU=0; //上拉电阻 SSPEN=0; //决定RA5不作为串口 TRISA2=0; //蜂鸣器输出 TRISA0=0; //74hc165的3根驱动IO之一 TRISA1=0; //74hc165的3根驱动IO之一 TRISE0=1; //74hc165的3根驱动IO之一 TRISA3=0; //74hc595的4根驱动IO之一 TRISA4=0; //74hc595的4根驱动IO之一 TRISA5=0; //74hc595的4根驱动IO之一 TRISE1=0; //74hc595的4根驱动IO之一 //以下此段程序非常重要,一上电必须尽快把74hc595的所有输出为低,避免上电继电//器动作 Hc595_oe_dr=1; //此IO必须接上拉电阻 relay_status_clear(); //把relay_status清零 relay_drive(); //继电器驱动程序,relay_status映射继电器的状态 Hc595_oe_dr=0; T1CON=0x24; //定时器中断配置 TMR1H=0xFE; TMR1L=0xEF; TMR1IF=0; TMR1IE=1; TMR1ON=1; TMR1IE=1; //补充说明,要特别注意上电马上把74HC595清零,以上的内容为寄存器配置,每种////不同的单片机会有点差异, //大家不用过度关注以上寄存器的配置,只要知道有这么一回事即可 beep_dr=0; //关蜂鸣器,上电初始化IO while(1) { CLRWDT(); //喂看门狗,大家不用过度关注此行 key_service(); //按键服务 } } void key_scan() //按键扫描函数 { unsigned char j; //中间循环变量 Key_status =0x0000; //每个按键的电平状态,共16个 hc165_pl_dr=0; asm("nop"); asm("nop"); hc165_pl_dr=1; asm("nop"); asm("nop"); for(j=0;j<16;j++) { hc165_cp_dr=0; asm("nop"); asm("nop"); Key_Code=Key_Code<<1; if(hc165_q7_sr==1)Key_Code=Key_Code+1; hc165_cp_dr=1; asm("nop"); asm("nop"); } //以上一小段代码是通过驱动2个74HC165来获取16个按键的电平状态 //key_status //以下代码通过解析每一位电平状态来确定哪个按键被触发 if((key_status &0x0001)==0x0001) { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock1==0) { ++ delay_cnt1; if(delay_cnt1> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt1=0; key_lock1=1; key_sec=1; //触发1号键 } } if((key_status &0x0002)==0x0002) { key_lock2=0; //按键自锁标志清零 delay_cnt2=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock2==0) { ++ delay_cnt2; if(delay_cnt2> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt2=0; key_lock2=1; key_sec=2; //触发2号键 } } if((key_status &0x0004)==0x0004) { key_lock3=0; //按键自锁标志清零 delay_cnt3=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock3==0) { ++ delay_cnt3; if(delay_cnt3> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt3=0; key_lock3=1; key_sec=3; //触发3号键 } } if((key_status &0x0008)==0x0008) { key_lock4=0; //按键自锁标志清零 delay_cnt4=0; //按键去抖动延时计数器清零,此行非常巧妙 } else if(key_lock4==0) { ++ delay_cnt4; if(delay_cnt4> cnt_delay_cnt1) //延时计数去抖动 { delay_cnt4=0; key_lock4=1; key_sec=4; //触发4号键 } } //如果要接16个按键,读者可以继续往下添加类似的代码,本例只触发4个按键作为演示 } void key_service() //按键服务函数 { switch(key_sec) //按键服务状态切换 { case 1:// 1号键 relay_status_clear(); //把relay_status清零 relay_status_set_1(); //把relay_status对应的第1个继电器启动 relay_drive(); //把relay_status的状态通过74HC595驱动出来 // 补充说明:voice_time_cnt只要不为0蜂鸣器就会响,中断里判断voice_time_cnt不为0 //时,会不断自减,一直到它为0时,自动把蜂鸣器关闭 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 2:// 2号键 relay_status_clear(); //把relay_status清零 relay_status_set_2(); //把relay_status对应的第2个继电器启动 relay_drive(); //把relay_status的状态通过74HC595驱动出来 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 3://3号键 relay_status_clear(); //把relay_status清零 relay_status_set_3(); //把relay_status对应的第3个继电器启动 relay_drive(); //把relay_status的状态通过74HC595驱动出来 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 4://4号键 relay_status_clear(); //把relay_status清零 relay_status_set_4(); //把relay_status对应的第4个继电器启动 relay_drive(); //把relay_status的状态通过74HC595驱动出来 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; } } //中断 void interrupt timer1rbint(void) { if(TMR1IE==1&&TMR1IF==1) //定时中断 { TMR1IF=0; //定时中断标志位关闭 TMR1ON=0; //定时中断开关关闭 key_scan(); //按键扫描函数 if(voice_time_cnt) //控制蜂鸣器声音的长短 { beep_dr=1; //蜂鸣器响 --voice_time_cnt; //蜂鸣器响的声音长短的计数延时 } else { beep_dr=0; //蜂鸣器停止 } TMR1H=0xFe; //重新设置定时时间间隔 TMR1L=0x00; TMR1ON=1; //定时中断开关打开 } } void relay_status_clear() //把relay_status清零 { relay_status=0; } void relay_status_set_1() //把relay_status对应的第1个继电器启动 { relay_status= relay_status|0x0001; } void relay_status_set_2() //把relay_status对应的第2个继电器启动 { relay_status= relay_status|0x0002; } void relay_status_set_3() //把relay_status对应的第3个继电器启动 { relay_status= relay_status|0x0004; } void relay_status_set_4() //把relay_status对应的第4个继电器启动 { relay_status= relay_status|0x0008; } void relay_drive() //继电器驱动程序,relay_status映射继电器的状态 { unsigned char tempdata; hc595_sh_dr=0; hc595_st_dr=0; relay_status_temp=relay_status; for(tempdata=0;tempdata<16;tempdata++) { CLRWDT(); if(relay_status_temp>=0x8000)hc595_ds_dr=1; else hc595_ds_dr=0; hc595_sh_dr=0; _nop_(); _nop_(); hc595_sh_dr=1; _nop_(); _nop_(); relay_status_temp<<=1; } hc595_st_dr=0; _nop_(); _nop_(); hc595_st_dr=1; _nop_(); _nop_(); hc595_sh_dr=0; //拉低,抗干扰就增强 hc595_st_dr=0; hc595_ds_dr=0; } void _nop_() //驱动时序延时函数 { unsigned char n; for(n=0;n<0x0f;n++); } (6)小结: 用74HC595驱动很多继电器时,要特别注意处理上电继电器莫名其妙动作与运行中受干扰的两种方法。这些细节在书上是没有的,这就是功力的体现。类似这样的技术细节,我后面还有很多,我都会把他呈现出来。我当年第一次遇到这样的问题时,只有反复重新设计电路板来吸取教训,现在看起来简单的东西,我当时是付出沉重的经验代价来换取的。所以读者要好好珍惜,我相信像我这样在电子发烧友里奉献经验的人不会很多,遇上我是你的缘。(未完待续) |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2076 浏览 1 评论
3486 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2329 浏览 2 评论
2754 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4012 浏览 5 评论
956浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6343浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 08:53 , Processed in 1.133652 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号