* SELAMAT DATANG DI SEKAWAN SERVIS ELECTRONIC * SERVIS:TV,COMPUTER,DVC,Ampli fier dll. * Spesialis Kulkas,AC Rumah, AC mobil dan Mesin Cuci. * Alamat: Taraman Sidoharjo Sragen *

SEK4W4N SERVIS ELECTRONIC

oth Mainboard Features
  • Pin compatible for 40-pin AVR and AT89S5x family Microcontrollers
  • Single sided PCB, header for 4 I/O ports, ISP port and RS-232 port
  • Built in +5V voltage regulator LM7805 with heatsink
  • Built in +5V and +12V (depend on input voltage) with terminal screw connector for further expansion
  • Onboard In System Programmer header
  • Schematic Included
  • Both mainboard is identically appearance with minor change
AVR Minimum System
Figure 1 Mainboard layout for ATMega 8535/16/32
MCS-51 Minimum System
Figure 2 Mainboard layout for AT89S5x Family

I/O Modules:
LED Board
  • The LED board provides 8-bit dot LED. The board can tie to the main PCB easily with a 10 pin ribbon cable.
Led Module
Figure 3 LED Module
Tact Switch Module
  • The switch module also for 8 bits input port. When the key was pressed, the logic will be '0'.
Tact Switch Module
Figure 4 Tact SwitchModule
LCD Module
  • The LCD is HD44780 compatible 2x16 text LCD.
16 x 2 LCD
Figure 5 LCD Module
Keypad Module
  • The board is 4 matrix keypad. Student can learn how to write the code that scans the key.
4 x 4 Matrix Keypad
Figure 6 Keypad Module
RTC and 1-Wire Temperature SensorModule
  • The RTC is DS1307 from maxim and 1-Wire temperature sensor is DS1822 from maxim to..
RTC
Figure 7 RTC and 1-Wire Temperature SensorModule
Cooming Soon
  • 7 - Segment display
  • Dot matrix display
ISP Header
Figure 8 Signals of the ISP header
Download the complete file here : kit_module_new.zip.
The zip file contains all PCB boards, include schematic for both mainboard.
Download the old version here : kit_module.zip.
The zip file contains all PCB boards, no schematic included, an older version of mainboard.
For the board with no schematic included (figure 3 - 7), you can make it yourself, is easy to figure out the schematic from the PCB board.
If you have any question, suggestion or maybe you find a bug, I'll very grateful if you contact me at : logixguy@yahoo.de
Updated: 10 December 2010

Meskipun termasuk tua, keluarga Mikrokontroler MCS51 adalah Mikrokontroler yang paling populer saat ini. Keluarga ini diawali oleh Intel yang mengenalkan IC Mikrokontroler type 8051 pada awal tahun 1980-an, 8051 termasuk sederhana dan harganya murah sehingga banyak digemari, banyak pabrik IC besar lain yang ikut memproduksnya, tentu saja masing-masing pabrik menambahkan kemampuan pada mikrokontroler buatannya meskipun semuanya masih dibuat berdasarkan 8051. Sampai kini sudah ada lebih 100 macam mikrokontroler turunan 8051, sehingga terbentuklah sebuah ‘keluarga besar mikrokontroler’ dan biasa disebut sebagai MCS51.

     Belakangan ini, pabrik IC Atmel ikut menambah anggota keluarga MCS51. Atmel merupakan pabrik IC yang sangat menguasai teknologi pembuatan Flash PEROM, jadi sudah selayaknya kalau Atmel memasukkan Flash PEROM ke dalam mikrokontroler buatannya. Usaha Atmel ini ternyatakan bagaikan menambah ‘darah’ baru bagi keluarga MCS51, dengan adanya Flash PEROM yang harganya murah maka tercapailah angan-angan banyak orang untuk membuat alat berbasis mikrokontroler yang sesederhana mungkin dan semurah mungkin.
     Produksi mikrokontroler MCS51 Atmel dibagi dua macam, yang berkaki 40 setara dengan 8051 yang asli, bedanya mikrokontroler Atmel berisikan Flash PEROM dengan kapasitas berlainan. AT89C51 mempunyai Flash PEROM dengan kapasitas 2 Kilo Byte, AT89C52 4 Kilo Byte, AT89C53 12 Kilo Byte, AT89C55 20 Kilo Byte  dan AT89C8252 berisikan 8 Kilo Byte Flash PEROM dan 2 Kilo Byte EEPROM.
     Yang berkaki 20 adalah MCS51 yang disederhanakan, penyederhanaan  dilakukan dengan cara mengurangi jalur untuk input/output paralel, kemampuan yang lain sama sekali tidak mengalami pengurangan. Penederhanaan ini dimaksudkan untuk membentuk mikrokontroler yang bentuk fisiknya sekecil mungkin tapi mempunyai kemampuan sama. Atmel memproduksi 3 buah mikrokontroler ‘mini’ ini, masing-masing adalah AT89C1051 dengan kapasitas Flash PEROM 1 Kilo Byte, AT89C2051 2 Kilo Byte dan AT89C4051 4 Kilo Byte. Ketiga mikrokontroler ini secara umum disebut sebagai AT89Cx051.
klik pada gambar untuk ukuran sebenarnya
 Gambar 1
Susunan kaki AT89Cx051 dan kontruksi dalam chip

Konstruksi AT89Cx051

     Gambar 1 memperlihatkan susunan kaki AT89C2051, susunan kaki ini sama persis dengan AT89C1051 dan AT89C4051. Demikian pula ketiga IC mempunyai konstruksi di dalam chip yang sama persis, perbedaannya hanya terletak pada kapasitas Flash PEROM.
      IC AT89Cx051 hanya memerlukan tambahan 3 kapasitor, 1 resistor dan 1 Xtal serta catu daya 5 Volt. Kapasitor 10 mikro-Farad dan resistor 10 Kilo Ohm dipakai untuk membentuk rangkaian reset, dengan adanya rangkaian reset ini AT89Cx051 otomatis di-reset begitu rangkaian menerima catu daya. Xtal dengan frekuensi maksimum 24 MHz dan 2 kapasitor 30 pico-Farad dipakai untuk melengkapi rangkaian oscilator pembentuk clock yang menentukan kecepatan kerja mikrokontroler.
      Memori merupakan bagian yang sangat penting bagi mikrokontroler, diperlukan 2 macam memori yang sifatnya berbeda.
      Read Only Memory (ROM) yang isinya tidak berubah meskipun IC kehilangan catu daya, dipakai untuk menyimpan program, begitu di-reset mikrokontroler akan langsung bekerja dengan program dalam ROMtersebut. Sesuai dengan keperluannya, dalam susunan MCS51 memori penyimpan program ini dinamakan sebagai MEMORI PROGRAM.
      Random Access Memory (RAM) isinya akan sirna begitu IC kehilangan catu daya, dipakai untuk menyimpan data pada saat program bekerja. Di samping untuk data, RAM dipakai pula untuk Stack. RAMyang dipakai untuk menyimpan data ini disebut pula sebagai MEMORI DATA.
      Ada berbagai jenis ROM. Untuk mikrokontroler dengan program yang sudah baku dan diproduksi secara massal, program diisikan ke dalam ROM pada saat IC mikrokontroler dicetak di pabrik IC. Untuk keperluan yang jumlahnya tidak banyak biasanya tidak dipakai ROM, tapi dipakai ROM yang bisa di-isi-ulang atauProgramable-Eraseable ROM (disingkat menjadi PEROM atau PROM). Dulu banyak dipakai UV-EPROM(Ultra Violet Eraseable Programable ROM) yang kemudian dinilai mahal harganya dan ditinggalkan setelah ada Flash PEROM yang harganya jauh lebih murah.
      Jenis memori yang dipakai untuk Memori Program AT89Cx051 adalah Flash PEROM, program untuk mengendalikan mikrokontroler diisikan ke memori itu lewat bantuan alat yang dinamakan sebagaiAT89Cx051 Flash PEROM Programmer.
Memori Data yang disediakan dalam chip AT89Cx051 sebesar 128 byte, meskipun hanya kecil saja tapi untuk banyak keperluan memori kapasitas itusudah mencukupi.
      Sarana Input/Output yang disediakan cukup banyak dan bervariasi. AT89Cx051 mempunyai 17 jalur Input/Output paralel. Jalur Input/Output paralel ini dikenal sebagai Port 1 (P1.0..P1.7) dan Port 3 (P3.0..P3.5 dan P3.7).
      AT89Cx051 dilengkapi UART (Universal Asynchronous Receiver/Transmiter) yang biasa dipakai untuk komunikasi data secara seri. Jalur untuk komunikasi data seri (RXD dan TXD) diletakan berhimpitan dengan P1.0 dan P1.1 di kaki nomor 2 dan 3, sehingga kalau sarana UART ini dipakai maka P1.0 danP1.1 tidak lagi bisa dipakai untuk jalur input/output paralel.
    Timer 0 dan Timer 1 masing-masing adalah untaian pencacah biner 16 bit (16 bit binary counter) di dalam chip yang dipakai sebagai sarana input/output yang bekerja menurut fungsi waktu. Clock penggerak untaian pencacah ini bisa berasal dari oscilator kristal atau clock yang diumpan dari luar lewatT0 dan T1. T0 dan T1 berhimpitan dengan P3.4 dan P3.5, sehingga P3.4 dan P3.5 tidak bisa dipakai untuk jalur input/output paralel kalau T0 dan T1 dipakai.
       AT89Cx051 mempunyai 5 sumber pembangkit interupsi, 2 diantaranya adalah sinyal interupsi yang diumpankan ke kaki INT0 dan INT1, kedua kaki ini berhimpitan dengan P3.2 dan P3.3 sehingga tidak bisa dipakai sebagai jalur input/output paralel kalau INT0 dan INT1 dipakai untuk menerima sinyal interupsi.
        3 sumber interupsi yang lain berasal dan sarana komunikasi data seri dan dari sistem Timer 0 dan Timer 1.
        Port 1, Port 2, UART, Timer 0, Timer 1 dan sarana lainnya merupakan register yang secara fisik merupakan RAM khusus, yang ditempatkan di Special Function Register (SFR).


Dasar kerja program

      Program untuk mengendalikan kerja dari mikrokontroler disimpan di dalam memori program. Program pengendali tersebut merupakan kumpulan dari instruksi kerja mikrokontroler, 1 instruksi MCS51 merupakan kode yang panjangnya bisa satu sampai empat byte.
       Sepanjang mikrokontroler bekerja, instruksi tersebut byte demi byte diambil ke CPU dan selanjutnya dipakai untuk mengatur kerja mikrokontroler. Proses pengambilan instruksi dari memori program dikatakan sebagai ‘fetch cycles’ dan saat-saat CPU melaksanakan instruksi disebuat sebagai ‘execute cycles’.
       Semua mikrokontroler maupun mikroprosesor dilengkapi sebuah register yang berfungsi khsus untuk mengatur ‘fetch cycles’, register tersebut dinamakan sebagai Program Counter. Nilai Program Counter secara otomatis bertambah satu setiap kali selesai mengambil 1 byte isi memori program, dengan demikian isi memori program bisa berurutan diumpankan ke CPU.
        Saat MCS51 di-reset, isi Program Counter di-reset menjadi 0000. Artinya sesaat setelah reset isi dari memori program nomor 0 dan seterusnya akan diambil ke CPU dan diperlakukan sebagai instruksi yang akan mengatur kerja mikrokontroler. Dengan demikian, awal dari program pengendali MCS51 harus ditempatkan di memori nomor 0, setelah reset MCS51 menjalankan program mulai dari memori-program nomor 0000, dengan melakukan proses ‘fetch cycles’ dan ‘execute cycles’ terus menerus tanpa henti.
        Jika sarana interupsi diaktipkan, dan tegangan di kaki INT0 (kaki nomor 6) merubah dari ‘1’ menjadi ‘0’, maka proses menjalankan program di atas akan dihentikan sebentar, mikrokontroler melayani dulu permintaan interupsi, selesai melayani permintaan interupsi CPU akan melanjutkan mengerjakan program utama lagi.
         Untuk melaksanakan hal tersebut, pertama-tama CPU menyimpan nilai Program Counter keStack (Stack merupakan satu bagian kecil dari data memori – RAM), kemudian mengganti isi ProgramCounter dengan 0003. Artinya MCS51 akan melaksanakan program yang ditempatkan di memori program mulai byte ke 3 untuk melayani interupsi yang diterima dari kaki INT0. Adalah tugas programer untuk mengatur agar program yang dipakai untuk melayani interupsi lewat INT0 diletakkan disitu.
        Selesai melayani interupsi, nilai Program Counter yang tadi disimpan ke dalam Stack akan dikembalikan ke Program Counter, dengan demikian CPU bisa melanjutkan pekerjaan di program Utama.
      Selain INT0, AT89Cx051 bisa menerima interupsi dari INT1, dari UART dan dari Timer. Agar permintaan interupsi itu bisa dilayani dengan program yang berlainan, maka masing-masing sumber interupsi itu mempunyai nomor awal program untuk layanan interupsi yang berlainan. Nomor-nomor awal tersebut digambarkan dalam Gambar 2.

 Gambar 2
Peta Memori Program

Pada artikel berikut akan dibahas bagaimana caranya mengimplementasikan dan membuat Converter USB to Serial sendiri dengan microcontroller ATmega8. Pada ATmega8 ini nanti akan diberikan source code firmwarenya Free dan bisa di download di bagian bawah.
Karena pada ATmega8 tidak tersedia fasilitas untuk komunikasi dengan USB, maka mau tidak mau protokol komunikasi data dengan USB harus dibuat sendiri pada firmware tersebut.  Pada firmware yang bisa didownload sudah ada code untuk menghandle protokol usb, sehingga bisa langsung digunakan, tetapi jika anda ingin menambahkan fasilitas lain, anda bisa meng-edit firmware tersebut. Firmware yang disediakan ditulis dalam bahasa assembler yang bisa di kerjakan dan di compile dengan AVR Studio 4. Selain code Assemblernya disertakan juga code Hexa-nya hasil kompilasi dari AVR Studio 4 yang bisa langsung di masukkan di IC-nya.
Berikut ini adalah gambar schematic rangkaian USB to Serial converter dengan ATmega8.
Configurasi Port serialnya
Line data USB yaitu D+ dan D- dihubungkan dengan PB0 dan PB1 pada ATmega8, koneksi ini tidak boleh dirubah karena pada pin ini bisa dilakukan transfer data dengan kecepatan tinggi. Agar terjadi suatu koneksi dan pen-signal-an yang bagus antara USB dan devais ini, maka ATmega8 akan diperkerjakan pada kecepatan data Low Speed yaitu dengan cara mem-pull-up resistor 1k5 Ohm pada line data D-. Untuk komponen yang lain hanya digunakan sebagai pelengkap agar system dapat beropersai dengan bagus, misalnya Xtall digunakan sebagai clock dan capacitor digunakan sebagai filter power supply.
Jika pada rangkaian ini anda menginginkan USB to RS-232 converter maka anda perlu menambahkan IC MAX 232 sebagai converter dari Level TTL ke level RS232. Jika hanya ingin digunakan untuk mengontrol LED anda bisa langsung hubungkan ke PIN I/O langsung yang di seri dengan resistor sebelumnya.
Untuk implementasi firmwarenya sebagai penerima dan coding dari USB protocolnya, akan menerima semua paket data dari USB dan kemudian disimpan di dalam internal buffer. Dimulai dari penerimaan pertama yang diperoleh dari external interrupt (INT0) adalah data untuk “sync pattern”, selama proses penerimaan hanya paket yang terakhir yang di check yaitu signal EOP (End of Packet). Setelah proses penerimaan berhasil, berikutnya firmware akan mong-coding sejumlah paket data yang diterimanya dan kemudian menganalisanya.
Firmware secara umum dibagi menjadi beberapa bagian blok utama, yaitu :
  • Interrupt Routine
  • Decoding Routine (Termasuk NRZI Encoding, BitStuffing Removal/Addition).
  • USB Reception
  • USB Transmission
  • Requested Action Decoding
  • Performing Requested Custom Actions
User dapat menambah function function tertentu kedalam firmware, seperti function untuk membuat “Customer-Specific”, function untuk “Direct Pin Control” dan lain sebagainya. Untuk firmware lengkapnya bisa anda download di bagian bawah. 
Untuk ATmega8 yang akan dipakai berikut support untuk 800 byte FIFO buffer, dengan baudrate 300 sampai 115200 baudrate, databit (5,6,7,8), stopbit (1,2), dan parity-nya (none, odd, even,  mark, space). 
Dengan menggunakan ATmega8 ini ada beberapa kemungkinan fitur yang bisa ditambahkan misalnya :
  • USB read/write ke dalam internal memori EEPROM yang berukuran 512 byte untuk menyimpan data misalnya data kalibrasi atau data kode produk.
  • Kemungkinan untuk memanfaatkan PWM dan ADC (Analog to Digital Converter) yang ada pada ATmega8.
  • Dengan space memori program yang masih besar, user bisa menambahkan fasilitas lain misalnya untuk USB to I2C converter atau USB to Serial PS2 dan converter – converter yang lain.
  • User bisa membuat / menambahkan semacam bootloader kedalam ATmega8, sehingga apabila ingin dilakukan Upgrade Firmware cukup dilakukannya lewat USB.
Pada contoh artikel dibawah ini digunakan Delphi sebagai program antarmuka di komputernya. Untuk source code dan executable Delphi ini bisa di download dibagian bawah. Bentuk program delphi executablenya seperti pada gambar dibawah ini :
Download section:
  • Program Interface dengan delphi download disini
  • Driver dan File DLL (Dynamic Link Library) download disini
  • Source code AVR download disini

          
Mikrokontroler ATMega8 merupakan suatu mikrokontroller keluarga AVR yang memiliki performa yang tinggi namun memiliki konsumsi daya listrik yang relatif rendah.  Di dalam mikrokontroler ATMega8 telah terdapat ADC internal yang memiliki resolusi 10 bit, sehingga kita tidak perlu menambahkan ADC eksternal ke dalam rangkaian. ADC internal berfungsi untuk mengubah input tegangan menjadi bilangan digital.  Untuk mengaktifkan ADC internal, pin AREF harus diberi tegangan referensi sebesar 3,3 volt atau 5 volt.
         
Ketika Pin AREF diberi tegangan masukan 3,3 volt bertujuan agar resolusi ADC menjadi lebih tinggi dibandingkan apabila diberi tegangan referensi sebesar 5 volt. ADC internal yang diberi tegangan referensi dapat mendeteksi peruban tegangan minimum sebesar:


          Dari rumus di atas dapat kita lihat bahwa, PIN AREF yang diberi tegangan referensi 3,3 volt memiliki senstifitas yang lebih tinggi dibandingkan dengan yang diberi input tegangan referensi sebesar 5 volt, yaitu dapat mengkonversi tegangan masukan minimum 3,2 mV.
         Untuk kabel downloader STK200+/300 menggunakan port parallel(DB25), sebagai transfer datanya. Software yang digunakan untuk mengisi program IC mikrokontroller keluarga AVR, saya menggunakan software Codevision AVR yang menggunakan bahasa C dalam pemrogamannya, yang dapat didownload di link berikut:
Untuk mempermudah pembuatan PCB saya sudah menyediakan  file PCB ATMega8 yang dibuat dengan software protel, yang dapat didownload di link berikut:

Transistor Q1 is connected to TxD, and the goal is to borrow a negative voltage connection for Q1. Conditions make this converter to work only half-duplex, so that a negative voltage is always present when transmitting data from TTL level to RS232 level.

Part :
R1 = 1k
R2 = 4K7
R3 = 10K
R4 = 10K
R5 = 1K
D1 = 1N4148
Q1 = BC557
Q2 = BC547
P1 = Port DB9

When communicating with various micro processors one needs to convert the RS232 levels down to lower levels, typically 3.3 or 5.0 Volts.
Here is a cheap and simple way to do that.
Serial RS-232 (V.24) communication works with voltages -15V to +15V for  high and low. On the other hand, TTL  logic operates between 0V and +5V . Modern low power consumption logic operates in the range of 0V and +3.3V or even lower.
RS-232TTLLogic
-15V …  -3V+2V … +5VHigh
+3V … +15V0V … +0.8VLow


Thus the RS-232 signal levels are far too high TTL electronics, and the negative RS-232 voltage for high can’t be handled at all by computer logic. To receive serial data from an RS-232 interface the voltage has to be reduced.  Also the low and high voltage level has to be inverted.
This level converter uses a Max232 and fivecapacitors. The max232 is quite cheap (less than 5 dollars) or if youre lucky you can get a free sample from Maxim.
The MAX232 from Maxim was the first IC which in one package contains the necessary drivers and receivers to adapt the RS-232 signal voltage levels to TTL logic. It became popular, because it just needs one voltage (+5V or +3.3V) and generates the necessary RS-232 voltage levels.
The requred parts:
  • 1 x female serial port connector
  • 1 x max 232
  • 4 x 1uF capacitor
  • 1 x 10uF capacitor
  • Soldering iron, wires, breadboard etc.

Schematic

 




Here is a simple PIC16F84A alarm clock. 
This clock counts seconds, minutes, hours and day of the week.
Time is displayed on 4 seven segment LED displays, and is adjustable with three buttons at start time (up, down, enter).
You can program the day of the week, hour, minute and duration of the alarms.
The number of alarms are limited by ROM space only.
The alarm is on the RA4 open collector output of the PIC, and is repeated on a decimal point of the display.

Download source code

For once, the program is in BASIC (mikroBasic) and I hope it will make a good start for beginners.


'******************************************************************************
' PIC16F84A ALARM CLOCK
'******************************************************************************
'
' feel free to use this code at your own risks
'
' target : PIC16F84A, 16 Mhz crystal
' HS clock, no watchdog.
'
' Author : Bruno Gavand, September 2007
'
'
'******************************************************************************

program alarmClock

'
' if you are using COMMON CATHODE LED display, uncomment this definition.
' if you are using COMMON ANODE LED display, comment this definition.
'
'#define CATHODE_COMMUNE

symbol LUNDI = 0 ' monday
symbol MARDI = 1 ' thuesday
symbol MERCREDI = 2 ' wednesday
symbol JEUDI = 3 ' thursday
symbol VENDREDI = 4 ' friday
symbol SAMEDI = 5 ' saturday
symbol DIMANCHE = 6 ' sunday
symbol LMMJV = 7 ' from monday to friday included

'
' alarm definitions, to be changed on your needs
'
symbol NBALARM = 16 ' number of programmed alarms

const alarmTable as byte[NBALARM * 4] = (
' JOUR HEURE MINUTE DUREE (secondes, 59 maxi)
' DAY HOUR MINUTE DURATION (in seconds, max is 59)
LUNDI, 8, 30, 10,
LUNDI, 12, 30, 10,
LUNDI, 14, 00, 10,
LUNDI, 16, 30, 10,
MARDI, 8, 30, 10,
MARDI, 12, 30, 10,
MARDI, 14, 00, 10,
MARDI, 16, 30, 10,
JEUDI, 8, 30, 10,
JEUDI, 12, 30, 10,
JEUDI, 14, 00, 10,
JEUDI, 16, 30, 10,
VENDREDI, 8, 30, 10,
VENDREDI, 12, 30, 10,
VENDREDI, 14, 00, 10,
VENDREDI, 16, 30, 10
)

dim maxcount as word ' number of TMR0 overflow per second
dim scaler as word ' RTC scaler
dim jj as byte ' day of week, 0 is monday
dim hh as byte ' hour
dim mn as byte ' min
dim ss as byte ' sec
dim digiled as byte[4] ' 4 x 7 segment table
dim digit as byte ' number of current digit to be displayed
dim dp as byte ' decimal point
dim key as byte ' key code
dim alarm as byte ' alarm flag

'
' the ISR works as real time clock
'
sub procedure interrupt
dim i as byte

'
' count time
'
scaler = scaler + 1
if scaler > maxcount
then
scaler = 0

inc(ss)
if ss = 60
then
ss = 0
inc(mn)
if mn = 60
then
mn = 0
inc(hh)
if hh = 24
then
hh = 0
inc(jj)
if jj = 8
then
jj = 1
end if
end if
end if
end if
end if

'
' LED display
'
#ifdef CATHODE_COMMUNE
PORTA = PORTA and $f0
TRISA = $0f
key = PORTA
TRISA = 0
PORTB = 0
#else
PORTA = PORTA or $0f
TRISA = $0f
key = PORTA
key = not(key)
TRISA = 0
PORTB = $ff
#endif
key = key and $07

digit = digit + 1

if digit > 3
then
digit = 0
i = $01
else
i = $01 <<>
end if

#ifdef CATHODE_COMMUNE
PORTB = digiled[digit]
PORTA = PORTA or i
#else
PORTB = digiled[digit]
PORTB = not(PORTB)
PORTA = PORTA and not(i)
#endif

INTCON.T0IF = 0
end sub

'
' converts digit to 7 segment
'
sub function intTo7seg(dim n as byte) as byte
select case n
case 0 result = $3F
case 1 result = $06
case 2 result = $5B
case 3 result = $4F
case 4 result = $66
case 5 result = $6D
case 6 result = $7D
case 7 result = $07
case 8 result = $7F
case 9 result = $6F
end select
end sub

'
' select a value with keys
' value is pointed to by v, display char s as header, maximum value is max
'
sub procedure setValue(dim v as ^byte, dim s as byte, dim max as byte)
digiled[0] = s
digiled[1] = 0

while 1
if key.0
then
inc(v^)
if(v^ > max)
then
v^ = 0
end if
end if

if key.1
then
if(v^ = 0)
then
v^ = max
else
dec(v^)
end if
end if

if key.2
then
Delay_ms(50)
while key.2
wend
Delay_ms(50)
scaler = 0
ss = 0
return
end if

digiled[2] = intTo7seg(v^ / 10)
digiled[3] = intTo7seg(v^ mod 10)

delay_ms(300)
wend
end sub

'
' program entry
'
main:
dim i as byte

'
' init variables
'
dp = 0

hh = 0
mn = 0
ss = 0
jj = 0

maxcount = 15625

'
' init I/O
'
PORTA = 010000
TRISA = 000000

PORTB = 0
TRISB = $00

'
' init interrupts
'
INTCON = %10100000
OPTION_REG = %11011000

Delay_ms(50)

'
' clock adjustment
'
setValue(@hh, 116, 23)
setValue(@mn, 55, 59)
setValue(@jj, 14, 6)

'
' forever loop
'
while true
if key
then
'
' display day and seconds (what for ? don't remember !)
'
digiled[0] = intTo7seg(jj)
digiled[1] = 0
digiled[2] = intTo7seg(ss / 10)
digiled[3] = intTo7seg(ss mod 10)
else
'
' display hours and minutes
'
digiled[0] = 0
digiled[1] = intTo7seg(hh)
else
digiled[0] = intTo7seg(hh / 10)
digiled[1] = intTo7seg(hh mod 10)
end if
digiled[2] = intTo7seg(mn / 10)
digiled[3] = intTo7seg(mn mod 10)
end if

'
' blinks semicolon (or decimal point)
'
if scaler > maxcount / 2
then
dp.1 = 1
else
dp.1 = 0
end if

'
' set decimal points
'
digiled[0].7 = dp.0
digiled[1].7 = dp.1
digiled[2].7 = dp.2
digiled[3].7 = dp.3

'
' check for alarm condition
'
alarm = 0
for i = 0 to (NBALARM - 1) * 4
if ((alarmTable[i] = jj) or ((alarmTable[i] = LMMJV) and (jj <>
and (alarmTable[i + 1] = hh)
and (alarmTable[i + 2] = mn)
and (alarmTable[i + 3] > ss)
then
inc(alarm)
end if
next i

if alarm
then
'
' set alarm
'
dp.3 = 1
PORTA.4 = 0
else
'
' clear alarm
'
dp.3 = 0
PORTA.4 = 1
end if
wend
end