D-work
Linux is like a wigwam. No windows. No gates. Just an Apache inside.
Na uren en uren zoeken heb ik hoofdpijn gekregen door een niet werkende schakeling.
Ik probeer deze schakeling te maken maar dan met een 16F877A.
Maar de tijd blijft gewoon op 00:00:00 staan, ik kan deze wijzigen maar als er terug naar het hoofdscherm wordt gegaan staat alles terug op 00:00:00.
Device 16F877A
Declare XTAL 4
Declare LCD_TYPE 0
Declare LCD_INTERFACE 4
Declare LCD_LINES 4
Declare LCD_DTPIN PORTB.0
Declare LCD_RSPIN PORTC.1
Declare LCD_ENPIN PORTC.0
'trisa=0
'RTC
ALL_DIGITAL=true ' Alle porten digitaal
TRISB=%11110000 'make make MSB of portb outputs for LCD data lines(others as inputs)
TRISC=%11111100 'make pins used for RS and EN outputs
'Relais
Symbol Power = PORTD.0 : TRISD.0 = 0
Symbol Startpuls = PORTD.1 : TRISD.1 = 0
'Knoppen
Symbol Knop_U = PORTA.0 : TRISA.0 = 1
Symbol Knop_R = PORTA.1 : TRISA.1 = 1
Symbol Knop_E = PORTA.2 : TRISA.2 = 1
Symbol Knop_L = PORTA.3 : TRISA.3 = 1
Symbol Knop_D = PORTA.4 : TRISA.4 = 1
'Real time clock
Symbol Reg_Seconden = $00
Symbol Reg_Minuten = $01
Symbol Reg_Uren = $02
Symbol Reg_Dag = $03
Symbol Reg_Datum = $04
Symbol Reg_Maand = $05
Symbol Reg_Jaar = $06
Symbol Reg_Min_on = $08
Symbol Reg_Uren_on = $09
Symbol Reg_Min_off = $10
Symbol Reg_Uren_off = $11
Symbol Lezen = %11010001
Symbol Schrijven = %11010000
Symbol SDA = PORTD.3
Symbol SLC = PORTC.4
'declare scl_pin portc.4
'declare SDA_pin portd.3
Dim Seconden As Byte
Dim Minuten As Byte
Dim Uren As Byte
Dim Datum As Byte
Dim Maand As Byte
Dim Jaar As Byte
Dim Min_On As Byte
Dim Uur_On As Byte
Dim Min_Off As Byte
Dim Uur_Off As Byte
Dim bcd_in As Byte
Dim bcd_uit As Byte
'Statusbits
Dim Power_status As Bit
'Menu
Dim Menu_Item As Byte
'Afsluiten
Dim Uitschakeltijd As Byte
'Timer
Dim Timer_OnOff As Bit
Dim temp As Byte
'Tijd instellen
Dim Tijd[6] As Byte
Dim Max_Val As Byte
Dim Temp_Tijd As Byte
'****************************************************************
Clear
Cls
DelayMS 500
'1234567890123456
Print At 1,2, "Verwarming CTRL V1"
Print At 2,2, ""
DelayMS 1000
'****************************************************************
Main:
Cls
DelayMS 200
While 1 = 1
I2CIN SDA, SLC, Lezen, Reg_Uren, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Minuten, [Minuten]
I2CIN SDA, SLC, Lezen, Reg_Seconden, [Seconden]
bcd_in = Uren
GoSub bcd_to_bin
Uren = bcd_uit
bcd_in = Minuten
GoSub bcd_to_bin
Minuten = bcd_uit
bcd_in = Seconden
GoSub bcd_to_bin
Seconden = bcd_uit
Print At 1,1, DEC2 Uren, ":", DEC2 Minuten, ":", DEC2 Seconden
GoSub Tijd_Controleren
If Power_status = 1 Then
Print At 1,10, "CV: AAN "
Else
Print At 1,10, "CV: AF "
EndIf
I2CIN SDA, SLC, Lezen, Reg_Jaar, [Jaar]
I2CIN SDA, SLC, Lezen, Reg_Maand, [Maand]
I2CIN SDA, SLC, Lezen, Reg_Datum, [Datum]
bcd_in = Jaar
GoSub bcd_to_bin
Jaar = bcd_uit
bcd_in = Maand
GoSub bcd_to_bin
Maand = bcd_uit
bcd_in = Datum
GoSub bcd_to_bin
Datum = bcd_uit
Print At 2,1, DEC2 Datum, "/", DEC2 Maand, "/", DEC2 Jaar
Print At 2,10, "-MENU-"
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
GoTo Menu
EndIf
DelayMS 200
Wend
GoTo Main
'****************************************************************
Menu:
Cls
DelayMS 200
Print At 1,1, "MENU: ->"
Menu_Item = 0
While 1 = 1
Select Menu_Item
Case 0
If Power_status = 0 Then
Print At 1,10, "START CV "
Else
Print At 1,10, "STOP CV "
EndIf
If Timer_OnOff = 0 Then
Print At 2,10, "TIMER AAN "
Else
Print At 2,10, "TIMER AF "
EndIf
Case 1
If Timer_OnOff = 0 Then
Print At 1,10, "TIMER "
Else
Print At 1,10, "TIMER AF "
EndIf
Print At 2,10, "INST. KLOK "
Case 2
Print At 1,10, "INST. KLOK "
Print At 2,10, "INST. TIMER "
Case 3
Print At 1,10, "INST. TIMER "
Print At 2,10, "TERUG "
Case 4
Print At 1,10, "TERUG "
If Power_status = 0 Then
Print At 2,10, "START CV "
Else
Print At 2,10, "STOP CV "
EndIf
EndSelect
'Bladeren in menu:
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Menu_Item < 4 Then
Inc Menu_Item
Else
Menu_Item = 0
EndIf
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
Else
Menu_Item = 4
EndIf
EndIf
'Menu item enteren
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Select Menu_Item
Case 0
'Pc opstarten/afsluiten overwrite
GoTo Pc_boot
Case 1
'Timer opzetten voor vanavond downloaden
GoTo tmr_op
Case 2
'Tijd op de klok aanpassen
GoTo Pas_Tijd_Aan
Case 3
'Tijd "aan" tijd van de pc aanpassen
GoTo Aan_Tijd
Case 4
'Terug naar het begin scherm
GoTo Main
EndSelect
EndIf
Wend
GoTo Main
'****************************************************************
Pc_boot:
Cls
DelayMS 200
If Power_status = 0 Then
'Inschakelen
'1234567890123456
Print At 1,1, "START... "
GoSub Pc_aan 'Spanning opzetten
DelayMS 1500 'Wachten tot voeding opgestart is
GoSub Puls_uit 'Puls voor pc te doen booten
Else
'Uitschakelen
'1234567890123456
Print At 1,1, "STOP... "
Print At 2, 1, Rep "-"\16
GoSub Puls_uit 'Pc een puls geven om te doen afsluiten
'Nu moet er 160 sec gewacht worden voordat de spanning wordt uitgeschakeld
'Uitschakeltijd uitrekenen:
For Uitschakeltijd = 0 To 160
Print At 2,1, Rep 255\ (Uitschakeltijd / 10 ) + 1
'Print At 1,1, dec3 16* (100/Uitschakeltijd)
DelayMS 1000
Next
GoSub Pc_uit 'Spanning uitzetten
EndIf
GoTo Main
'****************************************************************
tmr_op:
Cls
DelayMS 200
If Timer_OnOff = 0 Then
Print At 1, 5, "TIMER AAN "
Timer_OnOff = 1
DelayMS 1000
Else
Print At 1, 5, "TIMER AF "
Timer_OnOff = 0
DelayMS 1000
EndIf
GoTo Main
'****************************************************************
Pas_Tijd_Aan:
'Tijd RTC aanpassen
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Uren, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Minuten, [Minuten]
I2CIN SDA, SLC, Lezen, Reg_Seconden, [Seconden]
Tijd[0] = Uren >> 4
Tijd[1] = Uren & %00001111
Tijd[2] = Minuten >> 4
Tijd[3] = Minuten & %00001111
Tijd[4] = Seconden >> 4
Tijd[5] = Seconden & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "TIJD: ", Dec Tijd[0], Dec Tijd[1], ":", Dec Tijd[2], Dec Tijd[3], ":", Dec Tijd[4], Dec Tijd[5]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 2
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 2 Then
Max_Val = 3
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
'Seconden
Case 4
'tijd[4] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 5
'tijd[5] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 5 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,4, "TIJD OPSLAAN "
'Tijd wegschrijven
Uren = Tijd[0] << 4
Uren = Uren + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Uren, [Uren]
Minuten = Tijd[2] << 4
Minuten = Minuten + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Minuten, [Minuten]
Seconden = Tijd[4] << 4
Seconden = Seconden + Tijd[5]
I2COUT SDA, SLC, Schrijven ,Reg_Seconden, [Seconden]
DelayMS 1000
'Datum RTC aanpassen
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Datum, [Datum]
I2CIN SDA, SLC, Lezen, Reg_Maand, [Maand]
I2CIN SDA, SLC, Lezen, Reg_Jaar, [Jaar]
Tijd[0] = Datum >> 4
Tijd[1] = Datum & %00001111
Tijd[2] = Maand >> 4
Tijd[3] = Maand & %00001111
Tijd[4] = Jaar >> 4
Tijd[5] = Jaar & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "DATUM: ", Dec Tijd[0], Dec Tijd[1], "/", Dec Tijd[2], Dec Tijd[3], "/", Dec Tijd[4], Dec Tijd[5]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 3
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 3 Then
Max_Val = 1
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 1
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 1 Then
Max_Val = 2
Else
Max_Val = 9
EndIf
'Seconden
Case 4
'tijd[4] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
Case 5
'tijd[5] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 5 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,4, "DATUM OPSLAAN "
'Tijd wegschrijven
Datum = Tijd[0] << 4
Datum = Datum + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Datum, [Datum]
Maand = Tijd[2] << 4
Maand = Maand + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Maand, [Maand]
Jaar = Tijd[4] << 4
Jaar = Jaar + Tijd[5]
I2COUT SDA, SLC, Schrijven ,Reg_Jaar, [Jaar]
DelayMS 1000
Cls
GoTo Main
'****************************************************************
Aan_Tijd:
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Uren_on, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Min_on, [Minuten]
Tijd[0] = Uren >> 4
Tijd[1] = Uren & %00001111
Tijd[2] = Minuten >> 4
Tijd[3] = Minuten & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "AAN: ", Dec Tijd[0], Dec Tijd[1], ":", Dec Tijd[2], Dec Tijd[3]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 2
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 2 Then
Max_Val = 3
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 3 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,2, "OPSLAAN START TIJD "
'Tijd wegschrijven
Uren = Tijd[0] << 4
Uren = Uren + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Uren_on, [Uren]
Minuten = Tijd[2] << 4
Minuten = Minuten + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Min_on, [Minuten]
DelayMS 1000
'Uit tijd
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Uren_off, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Min_off, [Minuten]
Tijd[0] = Uren >> 4
Tijd[1] = Uren & %00001111
Tijd[2] = Minuten >> 4
Tijd[3] = Minuten & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "AF: ", Dec Tijd[0], Dec Tijd[1], ":", Dec Tijd[2], Dec Tijd[3]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 2
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 2 Then
Max_Val = 3
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 3 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,2, "OPSLAAN EIND TIJD "
'Tijd wegschrijven
Uren = Tijd[0] << 4
Uren = Uren + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Uren_off, [Uren]
Minuten = Tijd[2] << 4
Minuten = Minuten + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Min_off, [Minuten]
DelayMS 1000
GoTo Main
'****************************************************************
Subroutines:
'************************************************************
Puls_uit:
High Startpuls
DelayMS 1000
Low Startpuls
Return
'************************************************************
Pc_aan:
High Power
Power_status = 1
Return
'************************************************************
Pc_uit:
Low Power
Power_status = 0
Return
'************************************************************
bcd_to_bin:
bcd_uit = bcd_in >> 4
bcd_uit = bcd_uit * 10
bcd_in = bcd_in & %00001111
bcd_uit = bcd_uit + bcd_in
Return
'************************************************************
Tijd_Controleren:
If Timer_OnOff = 1 Then
I2CIN SDA, SLC, Lezen, Reg_Min_on, [Min_On]
I2CIN SDA, SLC, Lezen, Reg_Uren_on, [Uur_On]
temp = Uur_On & %11110000
temp = temp >> 4
temp = temp * 10
Uur_On = Uur_On & %00001111
Uur_On = Uur_On + temp
temp = Min_On & %11110000
temp = temp >> 4
temp = temp * 10
Min_On = Min_On & %00001111
Min_On = Min_On + temp
If Minuten = Min_On And Uren = Uur_On And Seconden = 0 Then
Cls
DelayMS 200
'Inschakelen
'1234567890123456
Print At 1,1, "STARTEN "
GoSub Pc_aan 'Spanning opzetten
DelayMS 1500 'Wachten tot voeding opgestart is
GoSub Puls_uit 'Puls voor pc te doen booten
Timer_OnOff = 0
Cls
EndIf
EndIf
If Power_status = 1 Then
I2CIN SDA, SLC, Lezen, Reg_Min_off, [Min_Off]
I2CIN SDA, SLC, Lezen, Reg_Uren_off, [Uur_Off]
temp = Uur_Off & %11110000
temp = temp >> 4
temp = temp * 10
Uur_Off = Uur_Off & %00001111
Uur_Off = Uur_Off + temp
temp = Min_Off & %11110000
temp = temp >> 4
temp = temp * 10
Min_Off = Min_Off & %00001111
Min_Off = Min_Off + temp
If Minuten = Min_Off And Uren = Uur_Off And Seconden = 0 Then
'Uitschakelen
'1234567890123456
Print At 1,1, "STOPPEN "
Print At 2, 1, Rep "-"\16
GoSub Puls_uit 'Pc een puls geven om te doen afsluiten
'Nu moet er 160 sec gewacht worden voordat de spanning wordt uitgeschakeld
'Uitschakeltijd uitrekenen:
For Uitschakeltijd = 0 To 160
Print At 2,1, Rep 255\ (Uitschakeltijd / 10 ) + 1
'Print At 1,1, dec3 16* (100/Uitschakeltijd)
DelayMS 1000
Next
GoSub Pc_uit 'Spanning uitzetten
Cls
EndIf
EndIf
Return
'****************************************************************
End
Red-E
Gr. Red-E || There are only 10 types of people in the world. Those who understand binary, and those who don't ||
Kan me vergissen, maar als mijn ogen mij niet bedriegen mis ik twee pull-up weerstanden in het schema, en wel aan de I2C bus (SCL & SDA lijnen)
en de code is een kopie van het orgineel??
(nog al veel en geen tijd om alles door te spitten a.t.m.)
D-work
Linux is like a wigwam. No windows. No gates. Just an Apache inside.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Maak eerst code en commentaar kloppend, dat werkt wat makkelijker. Dit klopt in ieder geval niet:
TRISB=%11110000 'make make MSB of portb outputs for LCD data lines(others as inputs)sjors007
...
Zorgt eerst voor een klein programma, hierin is niet de fout te vinden!
wat je ook moet doen is ervoor zorgen dat je kristal aanstaat.
bij mij stond deze ook uit heb uren lopen zoeken!
BusOut %11010000, $00, [%00000000] ;DS1307 aanzettenzo zet je de Kristal aan.
D-work
Linux is like a wigwam. No windows. No gates. Just an Apache inside.
Ik voel me stom, maar ik het het gevonden.
Blijkbaar was er een brugje van het breadboard niet doorverbonden.
Red-E
Gr. Red-E || There are only 10 types of people in the world. Those who understand binary, and those who don't ||
