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.

Figure-1You 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.

Figure-2I 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 »