This code helps to control HW-069 module, based on TM1637 chip, with 8051 type MCU. Chip supports 6 digits and also can scan keyboard, but this code uses only four digits and has no key reading procedure as HW-069 module has only 4-digit LED display onboard.
;=======================================================================
; HW-069 module with TM1637 support. No key reading implemented.
; Procedures to fill or clear display use only first 4 addresses.
;-----------------------------------------------------------------------
TM16_DIO equ P1.0
TM16_CLK equ P1.1
;-----------------------------------------------------------------------
TM16_CMDDATA = 01000000b
TM16_FIXADDR = TM16_CMDDATA or 00000100b
TM16_AUTOINC = TM16_CMDDATA
TM16_READKEY = TM16_CMDDATA or 00000010b
TM16_CMDADDR = 11000000b
TM16_CMDCTRL = 10000000b
TM16_PWMASK = 00000111b
TM16_DISPON = TM16_CMDCTRL or 00001000b
TM16_DISPOFF = TM16_CMDCTRL
;-----------------------------------------------------------------------
LED_H = 10000000b
LED_G = 01000000b
LED_F = 00100000b
LED_E = 00010000b
LED_D = 00001000b
LED_C = 00000100b
LED_B = 00000010b
LED_A = 00000001b
DIG_0 = LED_A or LED_B or LED_C or LED_D or LED_E or LED_F
DIG_1 = LED_B or LED_C
DIG_2 = LED_A or LED_B or LED_D or LED_E or LED_G
DIG_3 = LED_A or LED_B or LED_C or LED_D or LED_G
DIG_4 = LED_B or LED_C or LED_F or LED_G
DIG_5 = LED_A or LED_C or LED_D or LED_F or LED_G
DIG_6 = LED_A or LED_C or LED_D or LED_E or LED_F or LED_G
DIG_7 = LED_A or LED_B or LED_C
DIG_8 = LED_A or LED_B or LED_C or LED_D or LED_E or LED_F or LED_G
DIG_9 = LED_A or LED_B or LED_C or LED_D or LED_F or LED_G
DIG_A = LED_A or LED_B or LED_C or LED_E or LED_F or LED_G
DIG_B = LED_C or LED_D or LED_E or LED_F or LED_G
DIG_C = LED_A or LED_D or LED_E or LED_F
DIG_D = LED_B or LED_C or LED_D or LED_E or LED_G
DIG_E = LED_A or LED_D or LED_E or LED_F or LED_G
DIG_F = LED_A or LED_E or LED_F or LED_G
DIG_M = LED_G ; MINUS
DIG_H = LED_B or LED_C or LED_E or LED_F or LED_G
DIG_L = LED_D or LED_E or LED_F
DIG_DOT = LED_H
;-----------------------------------------------------------------------
tm16_char: ; set char directly. A - addr, B - data.
; call tm16_fixaddr before use: once and after tm16_fill
; or tm16_clear execution
;-----------------------------------------------------------------------
call tm16_addr
mov A,B
call tm16_put
call tm16_get_ack
call tm16_stop
ret
;-----------------------------------------------------------------------
tm16_clear: ; blank display. sets address autoincrement mode!
;-----------------------------------------------------------------------
call tm16_autoinc
mov A,#0
call tm16_addr
call tm16_put
call tm16_get_ack
call tm16_put
call tm16_get_ack
call tm16_put
call tm16_get_ack
call tm16_put
call tm16_get_ack
call tm16_stop
ret
;-----------------------------------------------------------------------
tm16_fill: ; fill display from memory. sets address autoincrement mode!
;-----------------------------------------------------------------------
call tm16_autoinc
mov A,#0
call tm16_addr
mov A,DISP
call tm16_put
call tm16_get_ack
mov A,DISP+1
call tm16_put
call tm16_get_ack
mov A,DISP+2
call tm16_put
call tm16_get_ack
mov A,DISP+3
call tm16_put
call tm16_get_ack
call tm16_stop
ret
;-----------------------------------------------------------------------
tm16_addr: ; send address
;-----------------------------------------------------------------------
orl A,#TM16_CMDADDR
call tm16_start
call tm16_put
call tm16_get_ack
ret
;-----------------------------------------------------------------------
tm16_autoinc: ; set auto address increment mode
;-----------------------------------------------------------------------
mov A,#TM16_AUTOINC
jmp tm16_cmd
;-----------------------------------------------------------------------
tm16_fixaddr: ; set fixed address mode
;-----------------------------------------------------------------------
mov A,#TM16_FIXADDR
jmp tm16_cmd
;-----------------------------------------------------------------------
tm16_off: ; turn display off
;-----------------------------------------------------------------------
mov A,#TM16_DISPOFF
jmp tm16_cmd
;-----------------------------------------------------------------------
tm16_on: ; turn display on, A: brightness value 0..7
;-----------------------------------------------------------------------
anl A,#TM16_PWMASK
orl A,#TM16_DISPON
tm16_cmd:
call tm16_start
call tm16_put
call tm16_get_ack
jmp tm16_stop
;-----------------------------------------------------------------------
tm16_start:
setb TM16_CLK
call tm16_delay
setb TM16_DIO
call tm16_delay
clr TM16_DIO
call tm16_delay
clr TM16_CLK
call tm16_delay
ret
;-----------------------------------------------------------------------
tm16_put:
push B
mov B,#8
.loop:
rrc A
mov TM16_DIO,C
call tm16_delay
setb TM16_CLK
call tm16_delay
clr TM16_CLK
call tm16_delay
djnz B,.loop
pop B
ret
;-----------------------------------------------------------------------
tm16_get_ack:
setb TM16_DIO
setb TM16_CLK
call tm16_delay
mov C,TM16_DIO
clr TM16_CLK
call tm16_delay
ret
;-----------------------------------------------------------------------
tm16_stop:
clr TM16_DIO
setb TM16_CLK
call tm16_delay
setb TM16_DIO
call tm16_delay
ret
;-----------------------------------------------------------------------
tm16_delay:
; nop ; 5 us
; nop ;
; nop ; 4 us
; nop ;
; nop ; 3 us
; nop ;
ret ; 2 us (1 us + 1 us call) @ 24MHz
;=======================================================================
Usage example:
;=======================================================================
start:
;-----------------------------------------------------------------------
call tm16_clear
;-----------------------------------------------------------------------
mov A,#0
call tm16_on
;-----------------------------------------------------------------------
call tm16_fixaddr
;-----------------------------------------------------------------------
mov A,#0
mov B,#DIG_1
call tm16_char
;-----------------------------------------------------------------------
mov A,#1
mov B,#DIG_2 or DIG_DOT
call tm16_char
;-----------------------------------------------------------------------
mov A,#2
mov B,#DIG_3
call tm16_char
;-----------------------------------------------------------------------
mov A,#3
mov B,#DIG_4
call tm16_char
;-----------------------------------------------------------------------
; tm16_fill example
;-----------------------------------------------------------------------
; mov DISP+0,#DIG_D
; mov DISP+1,#DIG_A
; mov DISP+2,#DIG_C
; mov DISP+3,#DIG_B
; call tm16_fill
;-----------------------------------------------------------------------
mainloop:
jmp mainloop
;-----------------------------------------------------------------------