Android Things - >通过74hc595多路复用控制8x8 LED矩阵时闪烁

时间:2018-01-15 10:54:17

标签: java android raspberry-pi3 android-things

嗨,我试图通过级联两个74hc595移位寄存器来控制8x8 led矩阵时卡住了。我已经构建了电路和程序,我在这里包括了。它实际上给了我正确的输出。但主要问题是可见的闪烁。有人可以指导我如何消除闪烁?

    public class MainActivity extends Activity {
    private static final String SR_SRCLK_PIN = "BCM27";  //clock pins shcp
    private static final String SR_RCLK_PIN = "BCM18";  //latch pin   stcp
    private static final String SR_SDI_PIN = "BCM17";  //data pin
    private static final String TAG = "MAT21";

    private Gpio mRCLK;
    private Gpio mSRCLK;
    private Gpio mSDI;
    private int charSeq=0;

    int data[]=
    {
                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //NULL
                0x00,0x00,0x3C,0x42,0x42,0x3C,0x00,0x00, //0
                0x00,0x00,0x00,0x44,0x7E,0x40,0x00,0x00, //1
                0x00,0x00,0x44,0x62,0x52,0x4C,0x00,0x00, //2
                0x00,0x00,0x78,0x14,0x12,0x14,0x78,0x00, //A
                0x00,0x00,0x60,0x90,0x90,0xFE,0x00,0x00, //d
                0x00,0x00,0x1C,0x2A,0x2A,0x2A,0x24,0x00, //e
                0x00,0x00,0x7E,0x12,0x12,0x0C,0x00,0x00, //p
                0x00,0x00,0x08,0x7E,0x88,0x40,0x00,0x00, //t
                0x3C,0x42,0x95,0xB1,0xB1,0x95,0x42,0x3C, //:)
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PeripheralManagerService pms = new PeripheralManagerService();
        try {
            mRCLK = pms.openGpio(SR_RCLK_PIN);
            mRCLK.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            mSRCLK = pms.openGpio(SR_SRCLK_PIN);
            mSRCLK.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            mSDI = pms.openGpio(SR_SDI_PIN);
            mSDI.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }

        try {
            thread.start();
                while (true){
                    Thread.sleep(2000);
                    charSeq++;
                    if(charSeq==10){
                        charSeq=0;
                    }
                }
        } catch (Exception sd) {

        }
    }

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                while (true) {
                    for (int rowNum = 0; rowNum < 8; rowNum++) {
                        mRCLK.setValue(false);
                        shiftOut(data[(charSeq * 8) + rowNum],rowNum);
                        mRCLK.setValue(true);
                    }
                }
            }catch (Exception ex){

            }
        }
    });

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Clean all resources
        if (mSDI != null) {
            try {
                mSDI.setValue(false);
                mSDI.close();
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            }
        }
        if (mRCLK != null) {
            try {
                mRCLK.setValue(false);
                mRCLK.close();
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            }
        }
        if (mSRCLK != null) {
            try {
                mSRCLK.setValue(false);
                mSRCLK.close();
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            }
        }
    }

    void shiftOut(int data, int rowNum) {
        try {
            for (int i = 7; i >= 0; i--) {
                mSRCLK.setValue(false);
                mSDI.setValue((((data >> i) & 1) == 0));
                mSRCLK.setValue(true);
            }
            for (int i = 0; i <8; i++) {
                mSRCLK.setValue(false);
                mSDI.setValue(i==rowNum?true:false);
                mSRCLK.setValue(true);
            }
        } catch (Exception sd) {

        }
    }
}

Schemetic Diagram

1 个答案:

答案 0 :(得分:1)

您的问题并不完全清楚您需要达到什么时钟频率才能正确驱动矩阵显示器,但无论如何,您都不可能在此处使用GPIO进行比特攻击时尚。您看到的闪烁可能是因为I / O在代码中没有足够快地切换。

我建议您移动到显示器的外部硬件控制器(例如MAX7219),您可以通过I2C或SPI等串行端口进行控制。