Showing posts with label Proteus Design. Show all posts
Showing posts with label Proteus Design. Show all posts

Friday, September 30, 2022

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Shift Registers are very useful for expanding the controller I/O ports. However driving a dot matrix display, or multiple seven-segment display also need this kind of chip. Because only multiplexing could not achieve a good displaying task.

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Eight-Digit and Ten-Digit Serial Seven-Segment Display Using SN74HC595N

It's not important to make any DIY display like this. But I have many common-cathode type seven-segments display, SN74HC595N shift registers, copper clad board, etc. So I want to use them all rather than keep them new in my own repair shop.

The design was complicated due to multiple count of connection between register to register, and register to display. So I tried to eliminate some components especially the current cutting resistors.

The shift register chip output pin voltage is +5V while the display need around 2V to operate. Without using dozens of current cutting resistors, I reduce the voltage by making voltage division. I add 3 rectifier diodes in series with each common cathodes of the display to divide the voltage.

Eight-Digit Seven-Segment Display

For the first time I design, I was unwilling to do this task due to difficulty in PCB fabrication, and laser printing toner problem. Because the ink cartridge was old. So I only made an 8-digit display.

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Arduino Test Program

 I use Proteus 8.10 to design the schematic and PCB.

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Schematic Design
PCB contains a lot of wire connections due to a large amount of registers an displays. It seems to be a double side PCB, but I use jumper wire instead.
 

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

PCB View In Proteus

I previewed this design in 3D viewer. Most of components are lack of 3D packages.

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Design 3D View
I use toner transfer method to make this DIY PCB. Using sing any online PCB order cost around 10 US Dollars excluding shipping cost. However it is not necessary here.

 

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Component Side Label Transferring

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Copper Side After Etching

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Copper Side After Soldering

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Copper Side Before Etching
I spent one day to finish this DIY electronic hobby project.


Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Finished PCBA Assembling

It works well but the display doesn't have Dot Point.

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
I firstly test this PCBA With Arduino Program Due To Ease Of Use.

I store this design file in Github.

Arduino Test Program #1 Using SPI

#include <SPI.h>
 
 
void setup() {
  // put your setup code here, to run once:
  SPI.begin();
  pinMode(10,OUTPUT);
 
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 digitalWrite(10,LOW);
  SPI.transfer(0x3F);
  SPI.transfer(0x06);
  SPI.transfer(0x5B);
  SPI.transfer(0x4F);
  SPI.transfer(0x6D);
  SPI.transfer(0x7D);
  SPI.transfer(0x07);
  SPI.transfer(0x7F);
  digitalWrite(10,HIGH);
  delay(3000);
}

Arduino Test Program #2


#include <SPI.h>
 
unsigned char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
                      0x77,0x7C,0x39,0x5E,0x79,0x71};
 
unsigned char msg1[10]={0x08,0x08,0x76,0x79,0x38,0x38,0x5C,0x08,0x08,0x08};
void setup() {
  // put your setup code here, to run once:
  SPI.begin();
  pinMode(10,OUTPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  /*
 digitalWrite(10,LOW);
 
  for(int i=9;i>=0;i--)
    SPI.transfer(ssd[i]);
  digitalWrite(10,HIGH); 
  delay(5000);
 
  digitalWrite(10,LOW);
 
  for(int i=15;i>=10;i--)
    SPI.transfer(ssd[i]);
  digitalWrite(10,HIGH); 
  delay(5000);
  */

   for(int i=9;i>=0;i--){
   digitalWrite(10,LOW);
 
  SPI.transfer(msg1[i]);
  delay(1000);
  digitalWrite(10,HIGH); 
   }
}

Eight-Digit Seven-Segment Display

I add two more digits to previous design. The PCB design is  quit bigger.

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board

Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board


Making A DIY SN74HC595 Serial 10-Digit 7-Segment Display Board
Arduino Test Program

 Arduino Test Program for this PCBA

or #include <SPI.h>
 
unsigned char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
                      0x77,0x7C,0x39,0x5E,0x79,0x71};
void setup() {
  // put your setup code here, to run once:
  SPI.begin();
  pinMode(10,OUTPUT);
 
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 digitalWrite(10,LOW);
 /*
  SPI.transfer(ssd[0]);
  SPI.transfer(ssd[1]);
 
  SPI.transfer(ssd[2]);
  SPI.transfer(ssd[3]);
 
  SPI.transfer(ssd[4]);
  SPI.transfer(ssd[5]);
 
  SPI.transfer(ssd[6]);
  SPI.transfer(ssd[7]);
 
  SPI.transfer(ssd[8]);
  SPI.transfer(ssd[9]);
  */

  for(int i=9;i>=0;i--)
    SPI.transfer(ssd[i]);
  digitalWrite(10,HIGH); 
  delay(5000);
 
  digitalWrite(10,LOW);
 
  for(int i=15;i>=10;i--)
    SPI.transfer(ssd[i]);
  digitalWrite(10,HIGH); 
  delay(5000);
}

Click here to download load this PCBA design file. 

 

Friday, July 3, 2020

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers

A dot matrix display is a cool electronics hobby project for most of microcontroller learners. At the time I studied with PIC16F84A microcontroller, I program a simple single 8x8 dot matrix display using assembly language. I solder all LED of the display using only hand tool only.

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
A red 32x8 dot matrix display

Schematic Design

I use Proteus VSM 8.15 SP1 to design its schematic. There are some other professional schematic capture tools. But I get used to Proteus for many years now.
 

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Sheet 1

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Sheet 2

PCB Design

The PCB seems to be a double-sided copper board. But I use only one side to fabricate on copper clad. Another side, I use jumper wire to connect the tracks.

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
PCB View

 
Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Design 3D View
Click here to download Proteus PCB design.

PCB Processing and DIY Assembling 

I make this copper board using toner transfer method with my own laser printer, and stand drill. The copper pattern was etched using Ferric Chloride acid.

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Laser Printing on Glossy Paper

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Toner Transfer to Copper Clad

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Components side toner transfer

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Finished etching with lead plating

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Finished PCBA Etching with lead plating

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Arduino Test Program #1

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Arduino Test Program #2

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Front Panel LED matrix

Making A 32x8 Dot Matrix Display With SN74HC595N Shift Registers
Components side with stand off

Source Code:


/* Main.ino file generated by New Project wizard
 *
 * Created:   Thu Sep 5 2013
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

#include <SPI.h>
#include <TimerOne.h>
 
const char EN=10;
 
//unsigned char dot1[8]={0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
//unsigned char dot1[8]={0x00,0x00,0x00,0x01,0x03,0xFF,0x00,0x00};
//char dot1[8]={0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00};
//unsigned char dot1[8]={0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00};
//unsigned char dot2[8]={0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00};
//unsigned char dot3[8]={0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00};
/*
unsigned char dot1[3][8]={{0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},
                  {0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},
                  {0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}};
*/

/*
volatile unsigned char dot1[26][8]={
    { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00},   // U+0041 (A)
    { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00},   // U+0042 (B)
    { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00},   // U+0043 (C)
    { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00},   // U+0044 (D)
    { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00},   // U+0045 (E)
    { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00},   // U+0046 (F)
    { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},   // U+0047 (G)
    { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},   // U+0048 (H)
    { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0049 (I)
    { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00},   // U+004A (J)
    { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00},   // U+004B (K)
    { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00},   // U+004C (L)
    { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00},   // U+004D (M)
    { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00},   // U+004E (N)
    { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00},   // U+004F (O)
    { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00},   // U+0050 (P)
    { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00},   // U+0051 (Q)
    { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00},   // U+0052 (R)
    { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00},   // U+0053 (S)
    { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0054 (T)
    { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00},   // U+0055 (U)
    { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0056 (V)
    { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00},   // U+0057 (W)
    { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00},   // U+0058 (X)
    { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00},   // U+0059 (Y)
  { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z)
};
*/

unsigned char font8x8_basic[128][8] = {
    { 0x000x000x000x000x000x000x000x00},   // U+0000 (nul)
    { 0x000x000x000x000x000x000x000x00},   // U+0001
    { 0x000x000x000x000x000x000x000x00},   // U+0002
    { 0x000x000x000x000x000x000x000x00},   // U+0003
    { 0x000x000x000x000x000x000x000x00},   // U+0004
    { 0x000x000x000x000x000x000x000x00},   // U+0005
    { 0x000x000x000x000x000x000x000x00},   // U+0006
    { 0x000x000x000x000x000x000x000x00},   // U+0007
    { 0x000x000x000x000x000x000x000x00},   // U+0008
    { 0x000x000x000x000x000x000x000x00},   // U+0009
    { 0x000x000x000x000x000x000x000x00},   // U+000A
    { 0x000x000x000x000x000x000x000x00},   // U+000B
    { 0x000x000x000x000x000x000x000x00},   // U+000C
    { 0x000x000x000x000x000x000x000x00},   // U+000D
    { 0x000x000x000x000x000x000x000x00},   // U+000E
    { 0x000x000x000x000x000x000x000x00},   // U+000F
    { 0x000x000x000x000x000x000x000x00},   // U+0010
    { 0x000x000x000x000x000x000x000x00},   // U+0011
    { 0x000x000x000x000x000x000x000x00},   // U+0012
    { 0x000x000x000x000x000x000x000x00},   // U+0013
    { 0x000x000x000x000x000x000x000x00},   // U+0014
    { 0x000x000x000x000x000x000x000x00},   // U+0015
    { 0x000x000x000x000x000x000x000x00},   // U+0016
    { 0x000x000x000x000x000x000x000x00},   // U+0017
    { 0x000x000x000x000x000x000x000x00},   // U+0018
    { 0x000x000x000x000x000x000x000x00},   // U+0019
    { 0x000x000x000x000x000x000x000x00},   // U+001A
    { 0x000x000x000x000x000x000x000x00},   // U+001B
    { 0x000x000x000x000x000x000x000x00},   // U+001C
    { 0x000x000x000x000x000x000x000x00},   // U+001D
    { 0x000x000x000x000x000x000x000x00},   // U+001E
    { 0x000x000x000x000x000x000x000x00},   // U+001F
    { 0x000x000x000x000x000x000x000x00},   // U+0020 (space)
    { 0x180x3C0x3C0x180x180x000x180x00},   // U+0021 (!)
    { 0x360x360x000x000x000x000x000x00},   // U+0022 (")
    { 0x360x360x7F0x360x7F0x360x360x00},   // U+0023 (#)
    { 0x0C0x3E0x030x1E0x300x1F0x0C0x00},   // U+0024 ($)
    { 0x000x630x330x180x0C0x660x630x00},   // U+0025 (%)
    { 0x1C0x360x1C0x6E0x3B0x330x6E0x00},   // U+0026 (&)
    { 0x060x060x030x000x000x000x000x00},   // U+0027 (')
    { 0x180x0C0x060x060x060x0C0x180x00},   // U+0028 (()
    { 0x060x0C0x180x180x180x0C0x060x00},   // U+0029 ())
    { 0x000x660x3C0xFF0x3C0x660x000x00},   // U+002A (*)
    { 0x000x0C0x0C0x3F0x0C0x0C0x000x00},   // U+002B (+)
    { 0x000x000x000x000x000x0C0x0C0x06},   // U+002C (,)
    { 0x000x000x000x3F0x000x000x000x00},   // U+002D (-)
    { 0x000x000x000x000x000x0C0x0C0x00},   // U+002E (.)
    { 0x600x300x180x0C0x060x030x010x00},   // U+002F (/)
    { 0x3E0x630x730x7B0x6F0x670x3E0x00},   // U+0030 (0)
    { 0x0C0x0E0x0C0x0C0x0C0x0C0x3F0x00},   // U+0031 (1)
    { 0x1E0x330x300x1C0x060x330x3F0x00},   // U+0032 (2)
    { 0x1E0x330x300x1C0x300x330x1E0x00},   // U+0033 (3)
    { 0x380x3C0x360x330x7F0x300x780x00},   // U+0034 (4)
    { 0x3F0x030x1F0x300x300x330x1E0x00},   // U+0035 (5)
    { 0x1C0x060x030x1F0x330x330x1E0x00},   // U+0036 (6)
    { 0x3F0x330x300x180x0C0x0C0x0C0x00},   // U+0037 (7)
    { 0x1E0x330x330x1E0x330x330x1E0x00},   // U+0038 (8)
    { 0x1E0x330x330x3E0x300x180x0E0x00},   // U+0039 (9)
    { 0x000x0C0x0C0x000x000x0C0x0C0x00},   // U+003A (:)
    { 0x000x0C0x0C0x000x000x0C0x0C0x06},   // U+003B (;)
    { 0x180x0C0x060x030x060x0C0x180x00},   // U+003C (<)
    { 0x000x000x3F0x000x000x3F0x000x00},   // U+003D (=)
    { 0x060x0C0x180x300x180x0C0x060x00},   // U+003E (>)
    { 0x1E0x330x300x180x0C0x000x0C0x00},   // U+003F (?)
    { 0x3E0x630x7B0x7B0x7B0x030x1E0x00},   // U+0040 (@)
    { 0x0C0x1E0x330x330x3F0x330x330x00},   // U+0041 (A)
    { 0x3F0x660x660x3E0x660x660x3F0x00},   // U+0042 (B)
    { 0x3C0x660x030x030x030x660x3C0x00},   // U+0043 (C)
    { 0x1F0x360x660x660x660x360x1F0x00},   // U+0044 (D)
    { 0x7F0x460x160x1E0x160x460x7F0x00},   // U+0045 (E)
    { 0x7F0x460x160x1E0x160x060x0F0x00},   // U+0046 (F)
    { 0x3C0x660x030x030x730x660x7C0x00},   // U+0047 (G)
    { 0x330x330x330x3F0x330x330x330x00},   // U+0048 (H)
    { 0x1E0x0C0x0C0x0C0x0C0x0C0x1E0x00},   // U+0049 (I)
    { 0x780x300x300x300x330x330x1E0x00},   // U+004A (J)
    { 0x670x660x360x1E0x360x660x670x00},   // U+004B (K)
    { 0x0F0x060x060x060x460x660x7F0x00},   // U+004C (L)
    { 0x630x770x7F0x7F0x6B0x630x630x00},   // U+004D (M)
    { 0x630x670x6F0x7B0x730x630x630x00},   // U+004E (N)
    { 0x1C0x360x630x630x630x360x1C0x00},   // U+004F (O)
    { 0x3F0x660x660x3E0x060x060x0F0x00},   // U+0050 (P)
    { 0x1E0x330x330x330x3B0x1E0x380x00},   // U+0051 (Q)
    { 0x3F0x660x660x3E0x360x660x670x00},   // U+0052 (R)
    { 0x1E0x330x070x0E0x380x330x1E0x00},   // U+0053 (S)
    { 0x3F0x2D0x0C0x0C0x0C0x0C0x1E0x00},   // U+0054 (T)
    { 0x330x330x330x330x330x330x3F0x00},   // U+0055 (U)
    { 0x330x330x330x330x330x1E0x0C0x00},   // U+0056 (V)
    { 0x630x630x630x6B0x7F0x770x630x00},   // U+0057 (W)
    { 0x630x630x360x1C0x1C0x360x630x00},   // U+0058 (X)
    { 0x330x330x330x1E0x0C0x0C0x1E0x00},   // U+0059 (Y)
    { 0x7F0x630x310x180x4C0x660x7F0x00},   // U+005A (Z)
    { 0x1E0x060x060x060x060x060x1E0x00},   // U+005B ([)
    { 0x030x060x0C0x180x300x600x400x00},   // U+005C (\)
    { 0x1E0x180x180x180x180x180x1E0x00},   // U+005D (])
    { 0x080x1C0x360x630x000x000x000x00},   // U+005E (^)
    { 0x000x000x000x000x000x000x000xFF},   // U+005F (_)
    { 0x0C0x0C0x180x000x000x000x000x00},   // U+0060 (`)
    { 0x000x000x1E0x300x3E0x330x6E0x00},   // U+0061 (a)
    { 0x070x060x060x3E0x660x660x3B0x00},   // U+0062 (b)
    { 0x000x000x1E0x330x030x330x1E0x00},   // U+0063 (c)
    { 0x380x300x300x3e0x330x330x6E0x00},   // U+0064 (d)
    { 0x000x000x1E0x330x3f0x030x1E0x00},   // U+0065 (e)
    { 0x1C0x360x060x0f0x060x060x0F0x00},   // U+0066 (f)
    { 0x000x000x6E0x330x330x3E0x300x1F},   // U+0067 (g)
    { 0x070x060x360x6E0x660x660x670x00},   // U+0068 (h)
    { 0x0C0x000x0E0x0C0x0C0x0C0x1E0x00},   // U+0069 (i)
    { 0x300x000x300x300x300x330x330x1E},   // U+006A (j)
    { 0x070x060x660x360x1E0x360x670x00},   // U+006B (k)
    { 0x0E0x0C0x0C0x0C0x0C0x0C0x1E0x00},   // U+006C (l)
    { 0x000x000x330x7F0x7F0x6B0x630x00},   // U+006D (m)
    { 0x000x000x1F0x330x330x330x330x00},   // U+006E (n)
    { 0x000x000x1E0x330x330x330x1E0x00},   // U+006F (o)
    { 0x000x000x3B0x660x660x3E0x060x0F},   // U+0070 (p)
    { 0x000x000x6E0x330x330x3E0x300x78},   // U+0071 (q)
    { 0x000x000x3B0x6E0x660x060x0F0x00},   // U+0072 (r)
    { 0x000x000x3E0x030x1E0x300x1F0x00},   // U+0073 (s)
    { 0x080x0C0x3E0x0C0x0C0x2C0x180x00},   // U+0074 (t)
    { 0x000x000x330x330x330x330x6E0x00},   // U+0075 (u)
    { 0x000x000x330x330x330x1E0x0C0x00},   // U+0076 (v)
    { 0x000x000x630x6B0x7F0x7F0x360x00},   // U+0077 (w)
    { 0x000x000x630x360x1C0x360x630x00},   // U+0078 (x)
    { 0x000x000x330x330x330x3E0x300x1F},   // U+0079 (y)
    { 0x000x000x3F0x190x0C0x260x3F0x00},   // U+007A (z)
    { 0x380x0C0x0C0x070x0C0x0C0x380x00},   // U+007B ({)
    { 0x180x180x180x000x180x180x180x00},   // U+007C (|)
    { 0x070x0C0x0C0x380x0C0x0C0x070x00},   // U+007D (})
    { 0x6E0x3B0x000x000x000x000x000x00},   // U+007E (~)
    { 0x000x000x000x000x000x000x000x00}    // U+007F
};
 
//volatile unsigned char dot1[128][8];
char cnt=0;
 
void dotPrint(char chr[8]){
  int j=0;
 
  for(int i=0;i<8;i++){
    digitalWrite(EN,LOW);
    /*
    SPI.transfer(~font8x8_basic[cnt+32][i]);
    SPI.transfer(~font8x8_basic['C'][i]);
    SPI.transfer(~font8x8_basic['B'][i]);
    SPI.transfer(~font8x8_basic['A'][i]);
    */

 
 
    //SPI.transfer(~font8x8_basic[chr][i]);
    for(int k=7;k>=0;k--)
      SPI.transfer(~font8x8_basic[chr[k]][i]);
 
    digitalWrite(EN,HIGH);
    digitalWrite(A3,HIGH);
    digitalWrite(A0,j&0x01);
    digitalWrite(A1,j&0x02);
    digitalWrite(A2,j&0x04);
    j++; 
    delay(3);
  }
}
 
void dotStr(unsigned char *str){
  while(*str) dotPrint(*str++);
}
 
void timeCount(void){
cnt++;
if(cnt>=90) cnt=0;
}
 
void setup()
 { // put your setup code here, to run once:
   SPI.begin();
   //SPI.beginTransaction(SPISettings(14000000, LSBFIRST, SPI_MODE0));
   pinMode(EN,OUTPUT);
   pinMode(A0,OUTPUT);
   pinMode(A1,OUTPUT);
   pinMode(A2,OUTPUT);
   pinMode(A3,OUTPUT);
   Timer1.initialize(500000);
  Timer1.attachInterrupt(timeCount);
 
 }
 
void loop()
 { // put your main code here, to run repeatedly:
/*
  int j=0;
  for(int i=0;i<8;i++){
    digitalWrite(EN,LOW);
    SPI.transfer(~font8x8_basic[cnt+32][i]);
SPI.transfer(~font8x8_basic['C'][i]);
SPI.transfer(~font8x8_basic['B'][i]);
SPI.transfer(~font8x8_basic['A'][i]);
digitalWrite(EN,HIGH);
    digitalWrite(A3,HIGH);
        digitalWrite(A0,j&0x01);
    digitalWrite(A1,j&0x02);
        digitalWrite(A2,j&0x04);
         j++; 
        delay(3);      
  }
*/

  dotPrint("ABCD");
  //dotStr("1234");
 }

 

Click here to download Arduino sketch.