Hi all,
Here we are with our new application which is super cool! Actually it's a bit old but I brought it back for the 1kb challenge. Anyways, lets talk about it.
It is an electronic dice based from random number generator which is also based from LFSR(Lineer Feedback Shift Register)
Random generator genarates two integers between 1-6 to perfom dice values. Than it shows the values on 7 segment displays.
You can see schematic circuit at figure-1. It consist of 3 main parts those are Microcontroller(AT89S52), 7 segment displays and their drivers(74HC595) and Dice button to play dice.
I have set circuit up on bread board as you can see at figure-2. Also there is isis simulation for the application. You can find it in the github repo.
Application codes written in assembly language. Code size is around 203 bytes which means it's fitted for 1kb challenge! Hooray!
;************************************************************************
; Program : ElectronicDice.asm *
; Author : Erhan YILMAZ *
; Date : 17-12-2016 *
; Version : 1.0 *
; Size : 203 Byte *
;************************************************************************
SHIFT_DATA EQU 0X20 ; Seri veri yoluna gönderilecek veriyi tutan yazmaç
CHIP_SELECT EQU 0X21.0 ; Gösterge(74HC595) Seçme biti
RASGELE_SAYI EQU 0X30 ; Rasgele sayı değişkeni
ANIMASYON_SAYAC EQU 0X30 ; Animasyon programı sayacı
ZAR_BUTON EQU P1.0 ; Zar atma butonu
SCK EQU P2.0 ; 74HC595 Saat sinyali çıkış pini
SDO EQU P2.1 ; 74HC595 Seri veri çıkış pini
CS1 EQU P2.2 ; Gösterge 1 seçme pini
CS2 EQU P2.3 ; Gösterge 2 seçme pini
ORG 0000H ;RESET vektörü adresi
AJMP BASLA ;BASLA etiketine git
ORG 0100H
;7 parça gösterge veri tablosu
; a
; -----
; | | b
; f | g |
; -----
; e | | c
; | |
; ----- . dp
; d
; .gfedcba
; Segment Data = 0bxxxxxxxx
; 7 parça göstergelere gönderilecek olan değerler program hafızadan sabit olarak okunarak göstegelere gönderilir.
SEGMENT_TABLO: DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71
ANIMASYON_TABLO: DB 0X01,0X02,0X04,0X08,0X10,0X20
BASLA:
CLR A ; Akümülatörü temizle
MOV P2,A ; Port2'yi temizle
MOV ANIMASYON_SAYAC,#0X00 ; Animasyon sayacını sıfırla
MOV TH0,#0X01 ; Timer0 reload değerini yükle
MOV TL0,#0X01 ; Timer0 ilk değerini yükle
MOV TMOD,#0XF2 ; Timer0 8 bit tekrar yüklemeli(0x01) olarak çalıştırılır.
SETB TCON.4 ; Timer0 çalıştırılır.
CLR CHIP_SELECT ; Başlangıçta Gösterge 1 temizlenir.
MOV SHIFT_DATA,#0x00
ACALL SHIFT_SEND_BYTE
SETB CHIP_SELECT ; Başlangıçta Gösterge 2 temizlenir.
MOV SHIFT_DATA,#0x00
ACALL SHIFT_SEND_BYTE
LOOP:
JB ZAR_BUTON,LOOP ; Butona basılana kadar bekle
ACALL GECIKME ; Buton arkını önlemek için bi süre beklenir.
KAL:
JB ZAR_BUTON,ATLA ; Buton bırakılana kadar animasyon programını çalıştır.
ACALL ANIMASYON
AJMP KAL
ATLA:
ACALL ZAR_AT ; Birinci zar değerini üret
CLR CHIP_SELECT ; Gösterge0'i seç
ACALL SEGMENT_GOSTER ; Zar değerini Gösterge0'de göster
ACALL ZAR_AT ; İkinci zar değerini üret
SETB CHIP_SELECT ; Gösterge1'i seç
ACALL SEGMENT_GOSTER ; Zar değerini Gösterge1'de göster
AJMP LOOP ; Sonsuz döngü
; Bu alt program 1-6 arasında rasgele sayı üretir sonucu Akümülatöre yazar.
ZAR_AT:
MOV RASGELE_SAYI,TL0 ; Rasgele sayı üreteci için Timer0'dan başlangıç değeri al
TEKRAR_URET:
ACALL RASGELE_SAYI_URET ; Rasgele sayı üret
MOV A,RASGELE_SAYI...
Read more »