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

Java Android Things->;通过74hc595多路复用控制8x8 LED矩阵时闪烁,java,android,raspberry-pi3,android-things,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

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

        }
    }
}
公共类MainActivity扩展活动{
私有静态最终字符串SR_SRCLK_PIN=“BCM27”//时钟引脚shcp
私有静态最终字符串SR_RCLK_PIN=“BCM18”//闩锁PIN stcp
私有静态最终字符串SR_SDI_PIN=“BCM17”//数据PIN
私有静态最终字符串TAG=“MAT21”;
私人Gpio mRCLK;
私人Gpio mSRCLK;
私人Gpio mSDI;
私有int charSeq=0;
整数数据[]=
{
0x00,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,/:)
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
外围设备管理器服务pms=新的外围设备管理器服务();
试一试{
mRCLK=pms.openGpio(SR_RCLK_引脚);
mRCLK.setDirection(Gpio.DIRECTION\u OUT\u LOW);
mSRCLK=pms.openGpio(SR_SRCLK_引脚);
mSRCLK.setDirection(Gpio.DIRECTION\u OUT\u初始值\u LOW);
mSDI=pms.openGpio(SR_SDI_PIN);
mSDI.setDirection(Gpio.DIRECTION\u OUT\u LOW);
}捕获(IOE异常){
Log.e(标记“外围设备API上的错误”,e);
}
试一试{
thread.start();
while(true){
《睡眠》(2000年);
charSeq++;
如果(charSeq==10){
charSeq=0;
}
}
}捕获(异常sd){
}
}
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{
试一试{
while(true){
对于(int-rowNum=0;rowNum<8;rowNum++){
mRCLK.setValue(假);
移位(数据[(charSeq*8)+rowNum],rowNum);
mRCLK.setValue(真);
}
}
}捕获(例外情况除外){
}
}
});
@凌驾
受保护的空onDestroy(){
super.ondestory();
//清理所有资源
如果(mSDI!=null){
试一试{
mSDI.setValue(假);
mSDI.close();
}捕获(IOE异常){
Log.e(标记“外围设备API上的错误”,e);
}
}
如果(mRCLK!=null){
试一试{
mRCLK.setValue(假);
mRCLK.close();
}捕获(IOE异常){
Log.e(标记“外围设备API上的错误”,e);
}
}
if(mSRCLK!=null){
试一试{
mSRCLK.setValue(假);
mSRCLK.close();
}捕获(IOE异常){
Log.e(标记“外围设备API上的错误”,e);
}
}
}
void shiftOut(int数据,int rowNum){
试一试{
对于(int i=7;i>=0;i--){
mSRCLK.setValue(假);
mSDI.setValue(((数据>>i)和1)==0);
mSRCLK.setValue(真);
}

对于(int i=0;i您的问题并不完全清楚需要达到什么样的时钟频率才能正确驱动矩阵显示,但无论如何,您不太可能以这种方式通过GPIO实现。您看到的闪烁可能是因为代码中的i/O切换速度不够快


我建议您为显示器使用外部硬件控制器(例如,类似的)您可以通过I2C或SPI之类的串行端口进行控制。

请添加您的示意图。添加。请检查Thank@Devunwired。但仍在尝试同样的方法。我用python和c编写了相同的程序示例。它们工作正常。因此,可能有一种方法可以做到这一点(我希望如此)