driver 7 segment max7219 (input data spi – output scanning di golang)


max7219 itulah namanya. driver 7 segment ini buatan maxim, perusahaan sejuta umat untuk para hoby elektronik, contohnya max232 siapa yang tidak kenal.

perkenalan dengaan ic ini dumulai ketika

1. malas membuat program scanning di mikro, (dalam jumlah banyak harus menggolang scanning, telat sedikit saja berkedip)

2. pemakaian ic shift register dalam jumlah banyak misal 300 digit (akan membuat rancangan design berarus gede) nanti ujung ujungnya mesti cari power supply arus gede, mending kalo 12v arus gede, ini kalo 5v arus gede pusing nyarinya.

3. harganya lumayan masuk cuma 9000 perak itu kalo beli ke toko gede, kalo beli ke saya saya naikkan aja jadi 15000 per pcs. itung itung, lihat contoh source code di blog saya. wkwkwkwkwkkw

 

sekarang kita bahas speknya

1. tegangannya 5 v

2. inputnya spi (cuma butuh 3 pin mosi miso sck)

3. bisa di cascade dengan hardware (manfaatin pin cs)

4, bisa di cascade memamfaatkan pin din-dout (tinggal nambah pemrograman di mikro)

5. ic ini untuk driver common catoda, tapi gampang kalo mau di buat untuk common anoda, nanti tinggal jiplak aja puny saya. karena di indonesia tercinta ini para importir lebih senang common anoda, menyebabkab di pasaran indonesia,, siswa, mahasiswa dosen dan para pengusaha mabok common anoda.

untuk data lengkapnya cari sendiri aja, banyak yang bahas kok.

– hal yang penting untuk cascade.

1. misal saya akan merancang  24 digit 7 segment untuk itu diperlukan 3 ic max7219

2. cara memilih ic yang akan di tulis yaitu dengan cara mengirimkan data ke register noop

3, berikut contohnya untuk memilih ic ke 1, ic ke 2 dan ic ke3

void MAX7219_writeData(char data_register, char data,unsigned char chip)
{
cs_hi;
if(chip==0)
{
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(data_register);
spiSendByte(data);
}
if(chip==1)
{
spiSendByte(data_register);
spiSendByte(data);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);

}
if(chip==2)
{
spiSendByte(data_register);
spiSendByte(data);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
}
cs_lo;
}

4. terlihat diatas untuk memilih ic yang akan ditulis datanya yaitu dengan memainkan pengulangan pengiriman NOOP

 

sudah saja berikut simulasinya dulu di proteus, pcbnya belum di bikin euy

 

berikut pemrogramannya pakai code vision. kalo untuk avr studio mah, tinggal jiplak ini aja, pasti pada master lah kalo yang pakai avr studio mah tinggal di rubah aja sedikit.

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Advanced
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 9/12/2012
Author : http://www.Eca.ir *** http://www.Webkade.ir
Company :
Comments:
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
// Declare your global variables here
#define PIN_SCK PORTB5
#define PIN_MOSI PORTB3
#define PIN_SS PORTB2

#define PIN_SS1 PORTB1

#define ON 1
#define OFF 0

#define cs_lo PORTB |= (1<<PIN_SS)
#define cs_hi PORTB &= ~(1<<PIN_SS)

#define cs1_lo PORTB |= (1<<PIN_SS1)
#define cs1_hi PORTB &= ~(1<<PIN_SS1)

#define MAX7219_MODE_DECODE 0x09
#define MAX7219_MODE_INTENSITY 0x0A
#define MAX7219_MODE_SCAN_LIMIT 0x0B
#define MAX7219_MODE_POWER 0x0C
#define MAX7219_MODE_TEST 0x0F
#define MAX7219_MODE_NOOP 0x00

// I only have 3 digits, no point having the
// rest. You could use more though.
#define MAX7219_DIGIT0 0x01
#define MAX7219_DIGIT1 0x02
#define MAX7219_DIGIT2 0x03
#define MAX7219_DIGIT3 0x04
#define MAX7219_DIGIT4 0x05
#define MAX7219_DIGIT5 0x06
#define MAX7219_DIGIT6 0x07
#define MAX7219_DIGIT7 0x08

#define MAX7219_CHAR_BLANK 0xF
#define MAX7219_CHAR_NEGATIVE 0xA

char jumlah_digit = 8;

void spiSendByte (char databyte)
{
SPDR = databyte;
while (!(SPSR & (1 << SPIF)));
}

void MAX7219_writeData(char data_register, char data,unsigned char chip)
{
cs_hi;
if(chip==0)
{
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(data_register);
spiSendByte(data);
}
if(chip==1)
{
spiSendByte(data_register);
spiSendByte(data);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);

}
if(chip==2)
{
spiSendByte(data_register);
spiSendByte(data);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
spiSendByte(MAX7219_MODE_NOOP);
}
cs_lo;
}

void clear_display()
{
unsigned char i,j;
for(j=0;j<3;j++)
{
for(i=1;i<=jumlah_digit;i++)
{
MAX7219_writeData(i, MAX7219_CHAR_BLANK,j);
}
}
}

void kirim_display()
{
MAX7219_writeData(MAX7219_DIGIT0, 0,0);
MAX7219_writeData(MAX7219_DIGIT1, 1,0);
MAX7219_writeData(MAX7219_DIGIT2, 2,0);
MAX7219_writeData(MAX7219_DIGIT3, 3,0);
MAX7219_writeData(MAX7219_DIGIT4, 4,0);
MAX7219_writeData(MAX7219_DIGIT5, 5,0);
MAX7219_writeData(MAX7219_DIGIT6, 6,0);
MAX7219_writeData(MAX7219_DIGIT7, 7,0);

MAX7219_writeData(MAX7219_DIGIT0, 7,1);
MAX7219_writeData(MAX7219_DIGIT1, 6,1);
MAX7219_writeData(MAX7219_DIGIT2, 5,1);
MAX7219_writeData(MAX7219_DIGIT3, 4,1);
MAX7219_writeData(MAX7219_DIGIT4, 3,1);
MAX7219_writeData(MAX7219_DIGIT5, 2,1);
MAX7219_writeData(MAX7219_DIGIT6, 1,1);
MAX7219_writeData(MAX7219_DIGIT7, 0,1);

MAX7219_writeData(MAX7219_DIGIT0, 0,2);
MAX7219_writeData(MAX7219_DIGIT1, 8,2);
MAX7219_writeData(MAX7219_DIGIT2, 0,2);
MAX7219_writeData(MAX7219_DIGIT3, 6,2);
MAX7219_writeData(MAX7219_DIGIT4, 1,2);
MAX7219_writeData(MAX7219_DIGIT5, 9,2);
MAX7219_writeData(MAX7219_DIGIT6, 8,2);
MAX7219_writeData(MAX7219_DIGIT7, 4,2);

}

void main(void)
{
unsigned int j;
DDRB |= (1 << PIN_SCK) | (1 << PIN_MOSI) | (1 << PIN_SS)| (1 << PIN_SS1);
SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR1);

for(j=0;j<3;j++)
{
MAX7219_writeData(MAX7219_MODE_DECODE, 0xFF,j);
MAX7219_writeData(MAX7219_MODE_SCAN_LIMIT, jumlah_digit – 1,j);
MAX7219_writeData(MAX7219_MODE_INTENSITY, 8,j);
MAX7219_writeData(MAX7219_MODE_POWER, ON,j);
}
while(1)
{
kirim_display();
}
}

 

 

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s