对楼上所有的楼主和访客表示感谢,提供了很多有用的资料。
我在此基础上实现了64*32LED阵列的显示,但是问题是用软件SPI刷新速度跟不上,屏幕呈闪烁状态。顾想通过软硬SPI一起执行,提高速率。但是失败了。用了硬件SPI就没法用软件SPI,用了软件SPI就没法用硬件SPI。(我对SPI通信不是很懂)望各位能不能提供好的方法提高刷新速度。
PS:刷 64 * 16 还算可以,可是64 * 32 就 不行了。
附上代码: - int R1=11;
- int R2=9;
- int STR=10;
- int CLK=13;
- int EN=6;
-
-
- int dig0=2;
- int dig2=3;
- int dig4=4;
- int dig8=5;
- //int i,m;
-
- unsigned char jj,j;
- int down = 0;
- int row_ = 0;
- void setup()
- {
- pinMode(R1,OUTPUT);
- pinMode(R2,OUTPUT);
- pinMode(STR,OUTPUT);
- pinMode(CLK,OUTPUT);
- pinMode(EN,OUTPUT);
- pinMode(dig0,OUTPUT);
- pinMode(dig2,OUTPUT);
- pinMode(dig4,OUTPUT);
- pinMode(dig8,OUTPUT);
- //Serial.begin(19200);
- //SPCR = (1<<SPE)|(1<<MSTR);
- //delay(10);
- }
-
- unsigned char zi[]={
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFD,0xFE,0x1E,0x01,0xBF,0x7F,0x7F,0x7F,0xFD,0xFD,0xEF,0xFD,0xBE,0xFF,0x7F,0x7F,
- 0xF9,0xFB,0xF7,0xFB,0xBD,0xFF,0x7F,0x7F,0xFA,0xFB,0xFF,0xF7,0xBB,0xFF,0x6F,0x7B,
- 0x87,0x0D,0xFF,0xEF,0xB7,0xFF,0x70,0x07,0xEF,0xBE,0x1F,0xDF,0xAB,0xFF,0x7C,0x1F,
- 0xF7,0x7F,0xEF,0xDF,0x9D,0xFF,0x7E,0x3F,0xF7,0x7F,0xF7,0xBF,0xBD,0xFF,0x7C,0x1F,
- 0xF0,0x7B,0xF7,0x7F,0xBE,0xEF,0x7D,0xDF,0xF7,0x7D,0xEE,0xFF,0xBF,0x6F,0x7B,0xEF,
- 0xEF,0xBE,0x1E,0x01,0xBF,0xB0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xED,0xB7,0xFE,0xFF,0xFD,0xFF,0x90,0x07,0xE5,0x37,0xFF,0x7F,0xFE,0xFF,0xDF,0xF7,
- 0xF5,0xE0,0x40,0x01,0x80,0x03,0xFF,0xF7,0xC8,0x2F,0xDF,0xFD,0xBF,0xFB,0x60,0x37,
- 0xF1,0xCE,0xF8,0x07,0xF3,0x3F,0x6F,0xB7,0xCC,0x4E,0xFF,0xCF,0xE7,0xCF,0x6F,0xB7,
- 0xFB,0xF5,0xFF,0xBF,0x9F,0xE3,0x60,0x37,0xC0,0x75,0xFF,0x7F,0x3F,0xF9,0x6F,0xB7,
- 0xEE,0xF9,0x80,0x00,0xC0,0x07,0x6F,0xB7,0xEE,0xFB,0xFF,0x7F,0xFE,0xFF,0x60,0x37,
- 0xF1,0xF5,0xFF,0x7F,0xFE,0xFF,0x6F,0xF7,0xF0,0x4C,0xFF,0x7F,0xFE,0xFF,0x7F,0xF7,
- 0xCE,0x9F,0x78,0x7F,0x80,0x03,0x7F,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
- };
-
- void row1(int i)
- {
- digitalWrite(dig0,(i&0x01));
- digitalWrite(dig2,(i&0x02));
- digitalWrite(dig4,(i&0x04));
- digitalWrite(dig8,(i&0x08));
- }
-
- void spi_transfer(volatile char data)
- {
- SPDR = data; // Start the transmission
- while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
- {
- };
- //return SPDR; // return the received byte
- }
- void sendbyte(byte bbyte1){// 高位在前 反相(1亮0灭)
- for (byte i=0; i<8;i++) {
- digitalWrite(CLK,0);
- if ( bbyte1 & 0x80) {
- digitalWrite(R1, 1);
- } else {
- digitalWrite(R1, 0);
- }
- bbyte1= bbyte1<<1;
- digitalWrite(CLK,1);
- }
- }
- void sendbyte2(byte bbyte1){// 高位在前 反相(1亮0灭)
- for (byte i=0; i<8;i++) {
- digitalWrite(CLK,0);
- if ( bbyte1 & 0x80) {
- digitalWrite(R2, 1);
- } else {
- digitalWrite(R2, 0);
- }
- bbyte1= bbyte1<<1;
- digitalWrite(CLK,1);
- }
- }
-
- void loop()
- {
- unsigned char row,m,k;
- for(row=0;row<16;row++){
-
- for (int i=0;i<8;i++){
- sendbyte(zi[i+down*8]);
- }
- // for(row=0;row<16;row++){
- //
- // for (int i=0;i<8;i++){
- // //spi_transfer((zi[i+down*8]));
- // }
-
- down++;
- digitalWrite(EN,1);
- row1(row);
- digitalWrite(STR,0);
- digitalWrite(STR,1);
- delayMicroseconds(0);
- digitalWrite(EN,0);
- delayMicroseconds(0);
- }
-
- for(row=0;row<16;row++){
-
- for (int i=0;i<8;i++){
- sendbyte2(zi[i+down*8]);
- }
- down++;
- digitalWrite(EN,1);
- row1(row);
- digitalWrite(STR,0);
- digitalWrite(STR,1);
- delayMicroseconds(0);
- digitalWrite(EN,0);
- delayMicroseconds(0);
- }
- down = 0;
- }
复制代码 |