Hot Posts

6/recent/ticker-posts

7 Segment Display Menggunakan Shift Register 74595

Tampilan Simulasi Rangkaian Menggunakan Proteus
Aplikasi berikut ini adalah menampilkan 4 digit angka pada 7 segment, dalam penerapanya bisa digunakan sebagai jam digital dengan menambahkan RTC atau sebagai counter UP/down dengan manambahkan tombol sebagai inputan. Material yang digunakan adalah mikrokontroler AVR Mega8, 4 buah 7-segment dan 4 biji shift register 74HC595 sebagai driver untuk mengendalikan 7-segment.

Berikut kode program lengkapnya menggunakana CodeVisionAVR
#include
#include

#define DDR_SPI DDRB
#define DD_MOSI  3
#define DD_SCK   5
#define DD_SS    2

#define SPI_DS    PORTB.3
#define SPI_SH    PORTB.5
#define SPI_ST    PORTB.2

void SpiMasterInit(void);
void SpiShiftByte(unsigned char nData);
void SpiWriteByte(unsigned char nData);
void SpiWrite4Bytes(unsigned char *pData);

void PutDigit(unsigned char nPos, unsigned nDigit, unsigned char nPt);
void PutByte(unsigned char nPos,unsigned char nByte);

void LedsGeserKanan(void);
void LedsGeserKiri(void);

unsigned char mDigits[4];
unsigned char mFont[11] = {63,6,91,79,102,109,125,7,127,111,0};  

/***************************************************************/
void main(void)
{
    unsigned char i;
    SpiMasterInit();

    while(1)
    {

        //semua led on
        PutDigit(0,8,128);
        PutDigit(1,8,128);
        PutDigit(2,8,128);
        PutDigit(3,8,128);
        SpiWrite4Bytes(mDigits);    
        delay_ms(1000);    

        //semua led off
        PutDigit(0,11,0);
        PutDigit(1,11,0);
        PutDigit(2,11,0);
        PutDigit(3,11,0);
        SpiWrite4Bytes(mDigits);    
        delay_ms(1000);        
        
        //geser kiri
        PutDigit(0,0,0);
        PutDigit(1,1,0);
        PutDigit(2,2,0);
        PutDigit(3,3,0);
        SpiWrite4Bytes(mDigits);    
        delay_ms(1000);
        LedsGeserKiri();
        
        //geser kanan
        PutDigit(0,0,0);
        PutDigit(1,1,0);
        PutDigit(2,2,0);
        PutDigit(3,3,0);
        SpiWrite4Bytes(mDigits);    
        delay_ms(1000);        
        LedsGeserKanan();   
        
        //counter up
        for(i=0;i<200 font="" i="">
        {
            PutByte(0,i);
            SpiWrite4Bytes(mDigits);            
            delay_ms(100);
        }
        delay_ms(2000);
        
        //counter down
        for(i=200;i>0;i--)
        {
            PutByte(0,i);
            SpiWrite4Bytes(mDigits);            
            delay_ms(100);
        }
        
    };      //while
}

/**************************************************************/
void SpiMasterInit(void)
{
    DDR_SPI = (1<
    
    SPI_SH = 0;
    SPI_DS = 0;
    SPI_ST = 0;
}
/************************************************************/
void SpiShiftByte(unsigned char nData)
{
    unsigned char i,nMask;
    nMask = 0x80;
    
    for(i=0;i<8 font="" i="">
    {
        SPI_SH = 0;
        
        if(nData & nMask)
            SPI_DS = 1;
        else
            SPI_DS = 0;
            
        SPI_SH = 1;
        #asm("nop");        
        SPI_SH = 0;
        
        nMask = nMask >> 1;
    }
}
/***************************************************************/
void SpiWriteByte(unsigned char nData)
{
SPI_ST = 0;
SpiShiftByte(nData);
SPI_ST = 1;
}
/*************************************************************/
void SpiWrite4Bytes(unsigned char *pData)
{
SPI_ST = 0;
SpiShiftByte(~*pData);
pData++;
SpiShiftByte(~*pData);
pData++;
SpiShiftByte(~*pData);
pData++;
SpiShiftByte(~*pData);
SPI_ST = 1;
}
/***************************************************************/
/***************************************************************/
void PutDigit(unsigned char nPos, unsigned nDigit, unsigned char nPt)
{
    mDigits[nPos] = mFont[nDigit];    
    mDigits[nPos] = mDigits[nPos] | (nPt & 128);
}
/***************************************************************/
void PutByte(unsigned char nPos,unsigned char nByte)
{
    unsigned char nDg;
    
    //don vi
    nDg = nByte % 100;
    nDg = nDg % 10;
    PutDigit(nPos,nDg,0);    
    
    //chuc
    nDg = nByte/10;
    nDg = nDg % 10;
    PutDigit(++nPos,nDg,0);
    
    //tram
    nDg = nByte/100;
    PutDigit(++nPos,nDg,0);    
}
/***************************************************************/
void LedsGeserKanan(void)
{
    unsigned  char j,i;
    
    for(i=0;i<4 font="" i="">
    {
        for(j=0;j<3 font="" j="">
            mDigits[j] = mDigits[j+1];
        mDigits[3] = mFont[10];         //off led
    
        SpiWrite4Bytes(mDigits);    
        delay_ms(500);
    }
}
/**************************************************************/
void LedsGeserKiri(void)
{
    unsigned  char j,i;
    
    for(i=0;i<4 font="" i="">
    {
        for(j=3;j>0;j--)
            mDigits[j] = mDigits[j-1];
        mDigits[0] = mFont[10];         //off led
    
        SpiWrite4Bytes(mDigits);    
        delay_ms(500);
    }
}

Post a Comment

0 Comments