安卓事物 - >闪烁,同时通过 74hc595 多路复用控制 8x8 LED 矩阵



嗨,当我试图通过级联两个 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) {
        }
    }
}

示意图

从您的问题中还不完全清楚您需要达到什么时钟频率才能正确驱动矩阵显示,但无论如何,您都不太可能以这种方式敲打 GPIO。您看到的闪烁可能是因为 I/O 在代码中的切换速度不够快。

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

最新更新