矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 5296|回复: 21

做好2块小板

[复制链接]
     
发表于 2020-3-28 10:22:43 | 显示全部楼层 |阅读模式
本帖最后由 iffi123 于 2020-3-28 10:54 编辑

初衷是做个通用的LED显示板和输入板(键盘+编码器), 于是5元打板后开始弄程序,已经调试好了,

以后做些diy电路,可以省掉输入输出电路

实际上,如果要最简单的方案,用专门的LED驱动/键盘二合一芯片最好,比如TM1627之类芯片,I2C接口,还带中断脚,才1块左右,性价比更高
不过抱着折腾的目的,还是用逻辑电路实现。

显示目前只设计了6位数码管,方案是一片74HC595串入并出(带输出锁存)作为8段输出, 74HC138 三八译码器作为位选通,实际上支持8位,这样只需要6根IO; 如果用74HC164不带锁存的,还可以少一根
1.jpg

键盘板设计了16个按键,除了0-9,还有6个功能键自由定义, 外加2个带开关编码器,比如调节参数,音量,频率这些(如果有需要)
按键部分用了2片74HC165级联,并入串出,所以支持16个按键;编码器就是常规EC11的了, 30定位15脉冲(n定位n脉冲也可以,只是软件的区别)
2.jpg

这样IO消耗: 显示6根,按键3根, 每个编码器各3根, 编码器根据需要使用1个还是2个,以及是否开关
3.jpg

评分

2

查看全部评分

     
发表于 2020-3-28 11:09:14 | 显示全部楼层
为什么不用两个 595 来做?
回复 支持 1 反对 0

使用道具 举报

     
 楼主| 发表于 2020-3-28 10:40:02 | 显示全部楼层
本帖最后由 iffi123 于 2020-3-28 10:49 编辑

参考电路,程序也比较简单

显示
4.gif

键盘
5.gif

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-28 11:28:15 | 显示全部楼层
飞翔鸭2016 发表于 2020-3-28 11:20
用了编码器还有那么多按键? 画蛇添足

各有各的好处,谁也替代不了谁,根据需要用哪个或者2个都用
回复 支持 反对

使用道具 举报

     
发表于 2020-3-28 12:26:31 | 显示全部楼层
at89c2051/4051可以直接驱动led,
建议楼主用上2片,
保留现有的旋转编码器,
再加上红外遥控,
。。。。。。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-28 12:31:59 | 显示全部楼层
本帖最后由 iffi123 于 2020-3-28 12:39 编辑
lxa000 发表于 2020-3-28 12:26
at89c2051/4051可以直接驱动led,
建议楼主用上2片,
保留现有的旋转编码器,


这个挂在stm32 GPIO上,用stm32驱动它
回复 支持 反对

使用道具 举报

     
发表于 2020-3-28 17:57:06 | 显示全部楼层
TM1650一类的专用芯片,1块钱一片(比大部分74XX门电路都便宜),连电容都不需要,整板就一个电阻(如果使用按键的话),I2C两根线驱动N个数码管和N个按键
回复 支持 反对

使用道具 举报

     
发表于 2020-4-8 15:18:20 | 显示全部楼层
驱动LED用3片595,一片输出段信号,2片做位驱动,可以驱动16位LED。只用3根IO,其中2根(DI,CLK)还可以复用,再多一根IO做输入与LED位驱动的2片595扫描,组成16个键盘,一共用4根IO,其中2根还可以复用,做其它用。595又是最容易找,最便宜的芯片(0.18元一片)。电路也非常简单,这部更好?
回复 支持 反对

使用道具 举报

     
发表于 2020-4-8 15:29:14 | 显示全部楼层
如果觉得LED显示还少了,可采用分组驱动LED,用4片595,轻松驱动24位LED+24个按键。
24LED+KEY.jpg

回复 支持 反对

使用道具 举报

     
发表于 2020-4-8 15:38:56 | 显示全部楼层
来点代码:
#include         "use.h"
#include         "AscLed.h"
#include        "Ver.H"

#define                LedK                         2                //¶¨Ê±¼ä¸ô2500us/8       
#define                Led_Data                (-LedK*Pclk/1000)        //¶¨Ê±³£Êý ÓÉÓÚF¸ßʵ¼ÊSECK=1/2=0¡£5s
//extern void Delay(unsigned int i);
/*************************
¶¨ÒåCLK£¬DAT£¬RCK
*************************/
sbit        Clk595=P2^5;
sbit        Dat595=P2^2;        //LED1-LED8
sbit         Rck595=P2^4;
//*******************************************
static unsigned char L_Buf[4];
//*******************************************

code unsigned char LedAsc[]={
        a_0,a_1,a_2,a_3,a_4,
        a_5,a_6,a_7,a_8,a_9,
        a_A,a_B,a_C,a_D,a_E,
        a_F,a_H,a_L,a_N,a_n,
        a_O,a_o,a_P,a_q,a_r,
        a_S,a_U,a_u,a_Black,
        a_88,a_Pol,a_t,b_0,
        b_1,b_2,b_3,b_4,b_5,       
        b_6,b_7,b_8,b_9,b_A,
        b_B,b_C,b_D,b_E,b_F,
        b_H,b_h,b_L,b_N,b_n,
        b_o,b_P,b_q,b_r,b_t,
        b_U,b_u,b_y,b_Pol,a_y,
        a_h
};
//****************************************
/*
void Init_SPI(){         //³õʼ»¯SPI ×ÜÏß
         SPCTL =0xdc;         //³õʼ»¯SPI ʱÖÓ
         SPSTAT =0xc0;         //ÉèÖÃÉÏÉýÑØÓÐЧ
}
*/
//***********************************************************************
/*
void SendDat (unsigned char Dat){
        unsigned char i;
        for (i=0;i<8;i++){
                Clk595=0;
                Dat595=(bit)(Dat&0x80);
                Clk595=1;
                Dat<<=1;       
        }
}
*/
//***********************************************************************
void SendDatTo595(void) {        //SPI

        unsigned char i,j;

        Rck595=0;                                                 //&Ntilde;&iexcl;&Ouml;&ETH;74HC595
        i=4;
        while(i--){
                for (j=0;j<8;j++){
                        Clk595=0;
                        Dat595=(bit)(L_Buf[i] & 0x80);
                        Clk595=1;
                        L_Buf[i]<<=1;       
                }
//                SendDat(p[i]);
/*
                SPSTAT=0xc0;                                         //&Ccedil;&aring;&sup3;&yacute;×&acute;&Igrave;&not;±ê&Ouml;&frac34;
                SPDAT=p[i];                                                 //&frac12;&laquo;&Ecirc;&yacute;&frac34;&Yacute;&ETH;&acute;&Egrave;&euml;·&cent;&Euml;&Iacute;&frac14;&Auml;&acute;&aelig;&AElig;÷
                while(!(SPSTAT&0x80));                         //&micro;&Egrave;&acute;&yacute;·&cent;&Euml;&Iacute;&Iacute;ê&sup3;&Eacute;
*/
        }
        Rck595=1;                                                 //&Ntilde;&iexcl;&Ouml;&ETH;74HC595
}
//**************************
void GetLedBufData (void){

        TR1=0;
        CopyData(LedBuf1,LedBuf,sizeof(LedBuf));
        TR1=1;
}//*************************************
unsigned char code CodeBit[]={
//        0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01
        0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
//        0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08
};
/**************************
LEDDo&Iuml;&Ocirc;&Ecirc;&frac34;&Ouml;÷&sup3;&Igrave;&ETH;ò
***************************/
void LedOut(void){

        static unsigned char Bit=0;

        LedBuf1[17]=LedMenu.HMLFlag;                //&Ouml;&cedil;&Ecirc;&frac34;&micro;&AElig;&Ecirc;&auml;&sup3;&ouml;
        //-----------------------
        L_Buf[0]=~CodeBit[Bit];                //·&Aring;&Egrave;&euml;&Icirc;&raquo;&Ntilde;&iexcl;&Acirc;&eth;
        L_Buf[1]=LedAsc[LedBuf1[Bit]];
        L_Buf[2]=LedAsc[LedBuf1[Bit+8]];
        //-------------------------------------------
        if (LedOff ==1){
                L_Buf[0]=0xff;                //&sup1;&Oslash;±&Otilde;LED
        }
        //--------------------------------------------

        if (Bit==1){
                L_Buf[3]=LedBuf1[17];                        //&Ouml;&cedil;&Ecirc;&frac34;&micro;&AElig;&Ocirc;&acute;&Acirc;&eth;&Acirc;&euml;&Ecirc;&auml;&sup3;&ouml;
        }else{
                L_Buf[3]=LedAsc[LedBuf1[16+Bit]];
        }
        SendDatTo595();
        if (++Bit ==8 )        Bit=0;
}
//********************************************************
//T1&Ouml;&ETH;&para;&Iuml;&iquest;&Oslash;&Ouml;&AElig;&Iuml;&Ocirc;&Ecirc;&frac34;
//********************************************************
void LedCtrlTo() interrupt 3 /*using 1*/{

        TL1         = Led_Data; //&Eacute;è&Ouml;&Atilde;&sup3;&otilde;&Ouml;&micro;
        TH1         = Led_Data>>8;
        //****************************************
        LedOut();        //&Iuml;&Ocirc;&Ecirc;&frac34;&acute;&brvbar;&Agrave;í
}
回复 支持 反对

使用道具 举报

     
发表于 2020-4-8 15:39:20 | 显示全部楼层
注释变成乱码。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-4-8 15:39:28 | 显示全部楼层
本帖最后由 iffi123 于 2020-4-8 15:43 编辑
Mon51 发表于 2020-4-8 15:18
驱动LED用3片595,一片输出段信号,2片做位驱动,可以驱动16位LED。只用3根IO,其中2根(DI,CLK)还可以复 ...


用2片595驱动显示会更简单,当初只考虑了一片, 实际上8位LED足够了,不需要搞10几位,再搞多位干脆上专用芯片
回复 支持 反对

使用道具 举报

     
发表于 2020-4-8 15:39:49 | 显示全部楼层
#include         "use.h"
#include         "AscLed.h"
#include        "Ver.H"

#define                LedK                         1                //&para;¨&Ecirc;±&frac14;&auml;&cedil;&ocirc;2500us/8       
#define                Led_Data                (-LedK*Pclk/1000)        //&para;¨&Ecirc;±&sup3;&pound;&Ecirc;&yacute; &Oacute;&Eacute;&Oacute;&Uacute;F&cedil;&szlig;&Ecirc;&micro;&frac14;&Ecirc;SECK=1/2=0&iexcl;&pound;5s
//extern void Delay(unsigned int i);
/*************************
&para;¨&Ograve;&aring;CLK&pound;&not;DAT&pound;&not;RCK
*************************/
sbit        Clk_595=P0^2;
sbit        Dat_595=P0^4;        //LED1-LED8
sbit         Rck_595=P0^3;
//***********************************************************************
void Send_Dat (unsigned char Dat){
        unsigned char i=8;
        while(i--){
                Clk_595=0;
                Dat_595=(bit)(Dat&0x80);
                Clk_595=1;
                Dat<<=1;       
        }
}

//***********************************************************************
void Send_DatTo595(unsigned char *p) {        //SPI

        unsigned char i=2;

        Rck_595=0;                                                 //&Ntilde;&iexcl;&Ouml;&ETH;74HC595
        while(i--){
                Send_Dat(p[i]);
        }
        Rck_595=1;                                                 //&Ntilde;&iexcl;&Ouml;&ETH;74HC595
}
/**************************
KeyDo&Iuml;&Ocirc;&Ecirc;&frac34;&Ouml;÷&sup3;&Igrave;&ETH;ò
***************************/
void GetKeyIn(unsigned char Dat){
        unsigned char i,j;
        unsigned char Buf[2];

        for (i=0;i<2;i++){
                Buf[1]=~LedMenu.HMLFlag;                //&Ouml;&cedil;&Ecirc;&frac34;&micro;&AElig;&Ecirc;&auml;&sup3;&ouml;
                //-----------------------
                Buf[0]=Dat & 0xf0;                //·&Aring;&Egrave;&euml;&Icirc;&raquo;&Ntilde;&iexcl;&Acirc;&eth;
                j=Buf[1] & 0x0f;
                Buf[0] |=j;                                //&ETH;&macr;&acute;&oslash;1&pound;&not;2&Iacute;¨&micro;&Agrave;&micro;&frac12;KEY595
                //-----------------------------------------------
                Send_DatTo595(Buf);
        }
}
回复 支持 反对

使用道具 举报

     
发表于 2020-4-8 15:44:47 | 显示全部楼层
我们96年后设计电路,基本唾弃165,164等芯片,其它特殊芯片,看都不看了,I2C接口是尽量少用,尽量使用SPI口,基本就用595,一个产品上芯片种类越少越好。单片机设计,元件越少越好。尽量软件代替硬件。。。。。说句不好听的,楼主的设计,如果被当年的技术主管看了,会被骂的狗血临头。。。。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-4-8 15:45:33 | 显示全部楼层
Mon51 发表于 2020-4-8 15:39
注释变成乱码。

只要原理搞清楚,按自己的理解写代码还是比较容易的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-27 21:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表