发新话题
打印

[电子信息与技术] 张老师学习一下雷锋吧~~~~

张老师学习一下雷锋吧~~~~

张老师:
    你可以我们都熟悉的高手,过去一直用汇编语言编程,现在我们在学习51,你有没有一些积累的汇编源程序,共享一下,让我们看看吧。现在用汇编编程的书很少,给我发一些,让我们开阔一下思路。
     

         学习雷锋好榜样~~~~~~~忠于革命忠于党!!!!!!~~~~~~

TOP

回复 #1 大头 的帖子

你先学习一下雷锋,告诉我怎么发吧,这方面我可是新手。再者我可不是编程高手,高手还没出场呢,以前是编过程序,都比较乱,发上来大家可以找编得不好的地方。

TOP

好~~~~~~

\^o^/

太好了,张老师,你可以直接发到论坛上!!!!!!如果可以的话,能不能先给俺发到邮箱里阿!!!!感激不尽~~~~~~~~
   偶得邮箱是:sunleilijinfang@126.com

TOP

源程序都比较长,需要解释,如果不解释那只是一片英文字符,可以到一些论坛上看一些学习用的资料,Keil c里面一些模板文件比较正规。下面试发一个看看,N年以前的,记米表,记录织布工每班产量,记产发工资,四班,每班可总计分计,组成如下:89c51,x20456,74ls164(看门狗),74hc04,六位LED,五个按键,共分三屏显示,第一屏产量,第二屏参数,第三屏设置(需密码),任何操作不影响计数,掉电自动保存,记大数时有个BUG,忘记是否改过了。需要说明的是我编的不是个好程序,仅作参考,我的程序可以说是调出来的而不是编出来的。(太长只好分段发)

;$NOMOD51                 ; disable predefined 8051 registers
;$INCLUDE (reg52.inc) ; include CPU definition file (for example, 8052)
;NAME                 jsq
;

;EEPROM low 256 bytes
;0--0efh(239) :1-3 班产值统计

;EEPROM high first 128bytes
;0--4fh(79)   :3 班产值统计
;50h-57h(87):1-4 group last products 1-4 班上日产值
;EEPROM high last 128bytes
xc_coun equ        81h        ;81--82h:current counte number                ;当前计数值
xc_grp        equ        83h        ;83h  :   current group                        ;当前班
xc_rslt equ        84h        ;84--85h:current resulte                ;当前班现产值
xlth_pg equ        86h        ;86h        :cloth lenth every trigle        ;每齿布长
xlth_pr equ        87h        ;87--89h:cloth lenth every routing        ;每周布长
xc_c_l        equ        8ah        ;8a--8bh:current cut lenth                ;用于裁减的布长
xtrnpr        equ        8ch        ;8ch         :trigle number every routing        ;齿轮齿数
xset_c        equ        8dh        ;8d--8eh:seted cut lenth                ;设定裁减的布长
xdiam        equ        8fh        ;8f--90h:diameter                        ;滚轮直径
xtotal        equ        91h        ;91--93h:total resulte                        ;累计总产量
xpass        equ        94h        ;94--95h:pass word                        ;密码
xc_grpcut  equ  96h        ;96--97h:                                ;裁减时当前班的现布长
xtl1        equ        98h        ;tl1


;const number
DTIM        EQU        20
DTI1        EQU        100
flasht        equ        200        ;time_l+flasht overflow
waitime        equ        245        ;time_h+waitime overflow
max_poll equ        100
cut_prom equ        251
pa_lth        equ        14        ;para max(read)lenth in x25045
stic_p        equ        50h        ;stic para begin addr in x25045
chr_p        equ        19h
chr_?        equ        58h
chr_bar equ        0f7h
chr_c        equ        8dh

;key define
f_key        equ        10h
e_key        equ        4
ri_key        equ        2
dn_key        equ        1
up_key        equ        8
fd_key        equ        11h
fu_key        equ        18h
fr_key        equ        12h
fe_key        equ        14h

;I/O ports
SCK        EQU        P3.0
SDI        EQU        P1.7
SO        EQU        P1.6
CS        EQU        P1.5
wod        equ        p1.5
cut_rly equ        p3.1
pow_on        equ        p3.6
pow_dn        equ        p3.2        ;int0
pd_pro        equ        p3.7

;p2: led bits select
;p0: led number
;p1.0--p1.4: key input
;p1.5--p1.6: date indicate
;p3.3:counter gate(T1)
;p3.5:counter input(T1)

;command
WREN        EQU        00000110B
WRDI        EQU        00000100B
RDSR        EQU        00000101B
WRSR        EQU        00000001B
cwr        EQU        00001010B
crd        EQU        00001011B
;state registe
d60n   EQU        00010000B        ;600ms,no protect
;------------------------------------

var        SEGMENT DATA                ; segment for DATA RAM.
        RSEG        var                ; switch to this data segment
cont:        DS        1                ; outbyte count/?
key_val:
        ds        1                ;used in read key subruoting
key_dal:
        ds        1                ;
all_pa:
c_coun:                         ;current counte number
cn_s_h: ds        1                ;the high byte soft counter
cn_s_l: ds        1                ;the low byte soft counter        ;当前计数值
c_grp:        ds        1                ;current group                  ;当前班
c_rslt: ds        2                ;current resulte                ;当前班现产值
lth_pg: ds        1                ;cloth lenth every trigle       ;每齿布长
lth_pr: ds        3                ;cloth lenth every routing      ;每周布长
c_c_l:        ds        2                ;current cut lenth              ;用于裁减的布长
trnpr:        ds        1                ;trigle number every routing    ;齿轮齿数
set_ch: ds        1                ;seted cut lenth                ;设定裁减的布长
set_cl: ds        1                ;seted cut lenth
total:        ds        3                ;total resulte                  ;累计总产量
cbrslt: ds        3                ;current resulte BCD code       ;用于显示的BCD码
cour_h: ds        1                ;course horigen position
cour_l: ds        1                ;course level position
time_h: ds        1
time_l: ds        1
cn_otl: ds        1
dicamp: ds        1
flashc: ds        1
diatmp: ds        2                ;滚轮直径
ledtmp: ds        1
cntmp:        ds        1
btmp:        ds        1
c_grpcut:                        ;裁减时当前班的现布长
        ds        2
c_tglt:        ds        1
cutmp:        ds        1

DSEG        AT        0ah
led_pa: ds        1
led_tx: ds        5


flag        SEGMENT BIT                ; segment for BIT RAM.
        RSEG        flag                ; switch to this bit segment
bkey_f: DBIT        1                ; KEY PESSED FIRST
bkey_s: DBIT        1                ; KEY PRESSED CONTINUE
bkey_p: dbit        1                ;
btime_out:
        dbit        1
brouting:
        dbit        1
bcut:        dbit        1
bflash: dbit        1
bpm_chn:
        dbit        1
bscr3:        dbit        1
bda_chn:
        dbit        1
thisda:        dbit        1

?STACK        SEGMENT IDATA                ; ?STACK goes into IDATA RAM.
        RSEG        ?STACK                ; switch to ?STACK segment.
        DS        16                ; reserve your stack space

        CSEG        AT        0        ; absolute Segment at Address 0
        LJMP        start                ; reset location (jump to start)

        CSEG        AT         03H        ; 03H is address for int0 interrupt
        LJMP        int0p

        CSEG        AT         0BH        ; 0BH is address for Timer 0 interrupt
        LJMP        timer0int

        CSEG        AT         1BH        ; 1BH is address for Timer 1 interrupt
        LJMP        timer1int

t0int        SEGMENT CODE                ; segment for interrupt function
        RSEG        t0int                ; switch to this code segment
        USING        1                ; register bank for interrupt routine

timer0int:
        PUSH        PSW
        MOV        PSW,#08H        ; register bank 1
        PUSH        ACC
;!!!! ATTENTION:6144us should not be changed WITH
        mov        th0,#0f0h
        cpl        p3.4
        SETB        btime_out
        INC        time_l
        mov        a,time_l
        jnz        t002
        inc        time_h
t002:        INC        r0
        CJNE        r0,#10h,T001
        MOV        r0,#0aH
        mov        r1,#7fh
T001:        mov        a,r1
        rl        a
        mov        r1,a
        MOV        A,@R0
        mov        P2,#0ffh
        MOV        P0,A
        MOV        P2,r1
        cpl        p3.4
        POP        ACC
        POP        PSW
        RETI


t1int        SEGMENT CODE                ; segment for interrupt function
        RSEG        t1int                ; switch to this code segment

timer1int:
        push        psw
        push        acc
        setb        brouting
        inc        cn_s_l
        mov        a,cn_s_l
        jnz        t101
        inc        cn_s_h
t101:        pop        acc
        pop        psw
        reti

i0int        SEGMENT CODE                ; segment for interrupt function
        RSEG        i0int                ; switch to this code segment
        USING        2                ; register bank for interrupt routine

int0p:        push        psw
        mov        psw,#10h
        push        acc
        setb        cut_rly
        mov        p0,#0ffh
        mov        p2,#0ffh
        lcall        wren_cmd
        mov        a,c_coun
        mov        r2,#xc_coun
        lcall        writebyte
        lcall        wren_cmd
        mov        a,c_coun+1
        mov        r2,#xc_coun+1
        lcall        writebyte
        lcall        wren_cmd
        mov        a,tl1
        mov        r2,#xtl1
        lcall        writebyte
        lcall        wren_cmd
        mov        a,c_rslt
        mov        r2,#xc_rslt
        lcall        writebyte
        lcall        wren_cmd
        mov        a,c_rslt+1
        mov        r2,#xc_rslt+1
        lcall        writebyte

        lcall        wren_cmd
        mov        a,total
        mov        r2,#xtotal
        lcall        writebyte
        lcall        wren_cmd
        mov        a,total+1
        mov        r2,#xtotal+1
        lcall        writebyte
        lcall        wren_cmd
        mov        a,total+2
        mov        r2,#xtotal+2
        lcall        writebyte
        setb        cs
        clr        cs
        pop        acc
        pop        psw
        orl        pcon,#6
        reti

PROG        SEGMENT CODE
        RSEG        prog                ; switch to this code segment
        USING        0                ; state register_bank used
                                ; for the following program code.
;read key no key pressed:a=0
TKEYB:
        CPL        wod
        MOV        A,P1                ;READ KEY
        CPL        A
        ANL        A,#1fH
        ret
;read key pram
;no key pressed:a=0,key active a=key value
;AREA 0:
; key_dal: KEY PRESSED CONTINUE TIME
; key_val: KEY VALUE
; bkey_p=1: KPRO LCALLED WHEN bkey_f=1.AND.bkey_s=0
; bkey_s=1: KEY PRESSED CONTINUE
; bkey_f=1: KEY PRESSED FIRST
KEYB:
        CPL        wod
        MOV        A,P1                ;READ KEY
        CPL        A
        ANL        A,#1fH
        JNZ        KEYP
        CLR        bkey_f               ;NO KEY PRESSED
        CLR        bkey_s
        RET                        ;RETURN
KEYP:        JB        bkey_f,KEY1          ;key pressed
        MOV        key_val,A               ;FIRST PRESSED
        SETB        bkey_f
        CLR        bkey_p
        MOV        key_dal,time_l
        clr        a
        RET                        ;RETURN
KEY1:        CJNE        A,key_val,KEY4        ;OTHER KEY PRESSED?
        JB        bkey_s,KEY2          ;NO
        MOV        A,time_l               ;KEY PRESSED CONTINUE FISTER TIME
        CLR        C
        SUBB        A,key_dal
        ADD        A,#DTI1        ;DELAY 1.6S
        JNC        KEY5
        SETB        bkey_s
        MOV        key_dal,time_l
        CLR        bkey_p
KEY5:        JB        bkey_p,KEY7
        SETB        bkey_p
        mov        a,key_val
        ret
KEY7:        clr        a
        RET                        ;RETURN
KEY4:        MOV        key_val,A               ;YES OTHER KEY PRESSED
        SETB        bkey_f
        CLR        bkey_s
        CLR        bkey_p
        MOV        key_dal,time_l
        clr        a
        RET                ;RETURN
KEY2:        MOV        A,time_l                ;KEY PRESSED CONTINUE
        CLR        C
        SUBB        A,key_dal
        ADD        A,#DTIM
        JNC        KEY6
        MOV        key_dal,time_l
        mov        a,key_val
        ret
KEY6:        clr        a
        RET                        ;RETURN
;-----------------------------------
;2BETY(4BCD) TO HEX
;ENTER          @R0 BCD high BETY,@R1 HEX high BETY
;EXIT          @R1 HEX HIGH BETY
SBTH:        MOV        A,@R0
        LCALL        SBT1
        push        acc
        inc        R0
        inc        R1
        MOV        A,@R0
        LCALL        SBT1
        pop        acc
        MOV        B,#100
        MUL        AB
        ADD        A,@R1
        MOV        @R1,A
        DEC        R1
        MOV        A,B
        ADDC        A,#0
        MOV        @R1,A
        RET
SBT1:        ANL        A,#0F0H
        SWAP        A
        MOV        B,#10
        MUL        AB
        MOV        @R1,A
        MOV        A,@R0
        ANL        A,#0FH
        ADD        A,@R1
        MOV        @R1,A
        RET
;--------------------------
;HEX TO BCD
;the intager number(x) is arranged in interal ram as flow
;x addr is adx then high byte in (adx),low byte in (adx+1)
;ENTER @R0 HEX high BYTE(2B),@R1 BCD high BYTE(3B)
;EXIT  @R1 BCD high byte(3B)
;
SHtB:        clr        a
        MOV        @R1,a
        inc        r1
        mov        @r1,a
        inc        r1
        mov        @r1,a
        mov        a,@r0
        jnb        acc.7,sht01
        mov        r5,#3h
        mov        r6,#27h
        mov        r7,#68h
        lcall        bcdadd
sht01:        jnb        acc.6,sht02
        mov        r5,#1h
        mov        r6,#63h
        mov        r7,#84h
        lcall        bcdadd
sht02:        jnb        acc.5,sht03
        mov        r5,#0
        mov        r6,#81h
        mov        r7,#92h
        lcall        bcdadd
sht03:        jnb        acc.4,sht04
        mov        r5,#0
        mov        r6,#40h
        mov        r7,#96h
        lcall        bcdadd
sht04:        jnb        acc.3,sht05
        mov        r5,#0
        mov        r6,#20h
        mov        r7,#48h
        lcall        bcdadd
sht05:        jnb        acc.2,sht06
        mov        r5,#0
        mov        r6,#10h
        mov        r7,#24h
        lcall        bcdadd
sht06:        jnb        acc.1,sht07
        mov        r5,#0
        mov        r6,#5h
        mov        r7,#12h
        lcall        bcdadd
sht07:        jnb        acc.0,sht08
        mov        r5,#0h
        mov        r6,#2h
        mov        r7,#56h
        lcall        bcdadd
sht08:        inc        r0
        mov        a,@r0
        mov        b,#100
        div        ab
        mov        r5,#0
        mov        r6,a
        mov        a,b
        mov        b,#10
        div        ab
        swap        a
        orl        a,b
        mov        r7,a
        lcall        bcdadd
        dec        r1
        dec        r1
        ret
bcdadd:        push        acc
        mov        a,@r1
        add        a,r7
        da        a
        mov        @r1,a
        dec        r1
        mov        a,@r1
        addc        a,r6
        da        a
        mov        @r1,a
        dec        r1
        mov        a,@r1
        addc        a,r5
        da        a
        mov        @r1,a
        inc        r1
        inc        r1
        pop        acc
        RET
;---------------------------

[ 本帖最后由 老张 于 2006-4-30 13:19 编辑 ]

TOP

FLOATING TO HEX
;ENTER: @R0: high BYTE(2B)
;EXIT:        @R0: high BYTE(2B)
;!!!!!!!! THE NUMBER SHOULD BE NORMALIZED
SFTH:        inc        r0
        inc        r0
        MOV        A,@R0
        CPL        A
        INC        A
        dec        R0
        dec        r0
        ADD        A,#16
        JZ        SFT4
        jnc        sft5
        MOV        b,A
SFT3:        MOV        A,@R0
        CLR        C
        RRC        A
        MOV        @R0,A
        INC        R0
        MOV        A,@R0
        RRC        A
        MOV        @R0,A
        dec        r0
        DJNZ        b,SFT3
        CLR        A
sft4:        RET
SFT5:        inc        a
        jnz        sft7
        mov        a,@r0
        jnz        sft8
        inc        r0
        mov        a,@r0
        jz        sft6
        dec        r0
sft8:
        mov        b,#10
        mov        a,@r0
        div        ab
        mov        @r0,a
        inc        r0
        mov        a,@r0
        anl        a,#0f0h
        orl        a,b
        swap        a
        mov        b,#10
        div        ab
        swap        a
        xch        a,@r0
        anl        a,#0fh
        swap        a
        orl        a,b
        swap        a
        mov        b,#10
        div        ab
        orl        a,@r0
        mov        @r0,a

        clr        c
        mov        a,@r0
        rlc        a
        mov        @r0,a
        dec        r0
        mov        a,@r0
        rlc        a
        mov        @r0,a
        inc        r0
        mov        a,@r0
        add        a,total+2
        mov        total+2,a
        dec        r0
        mov        a,@r0
        addc        a,total+1
        mov        total+1,a
        clr        a
        addc        a,total
        mov        total,a

        mov        cn_s_h,#0
        mov        cn_s_l,#0

sft7:        clr        A
        MOV        @R0,A
        inc        R0
        MOV        @R0,a

sft6:        dec        r0
        RET
;-----------------------------------
;FLOATING MULTIPLICATION RESULT 2B
;the float number(x) is arranged in interal ram as flow
;x addr is adx then
;high byte in (adx),low byte in (adx+1),power byte in (adx+2)
;ENTER: @R0 2ND MULTIPLIER POWER BYTE
;        R5--R7 stored one 1st MULTIPLIER (use scop to copy)
;EXIT:        PRODUCT POWER STORED IN R5--R7(2 BETY R5:POWER BYTE,R6:HIGH BYTE)
;
SFM2:        inc        R0
        LCALL        SM2U
        INC        R0
        INC        R0
        MOV        A,@R0
        ADD        A,R7
        MOV        R7,A
        RET
;-----------------------------------
;2 BETY MULTIPLICATION (R7R6*R5R4)
;R6R5*@R1+-=(R6z+zR5)*(@R1+z*z@R1-)
;          =(R6@R1+zz)+(zR6@R1-z)+(zR5@R1+z)+(zzR5@R1-)
;ENTER: @R0 1ST MULTIPLIER LOW BETY, @R1 2ND MULTIPLIER
;use area 1 as work area;R5--R7 stored one 1st MULTIPLIER (use scop to copy)
;EXIT: PRODUCT STORED IN R3--R7(R7:POWER BYTE,R3:HIGH BYTE R7:0FH)
SM2U:        MOV        A,R6
        MOV        B,@R0
        MUL        AB
        MOV        R4,A  ;4
        MOV        R3,B  ;3
        MOV        A,R6
        DEC        R0
        MOV        B,@R0
        MUL        AB
        ADD        A,R3  ;3 +
        MOV        R3,A
        MOV        A,B
        ADDC        A,#00H        ;2
        MOV        R2,A        ;2
        MOV        A,R4
        MOV        R6,A        ;4   OK
        MOV        R4,#0        ;1
        JNC        SM21
        INC        R4
SM21:        MOV        A,R5
        INC        R0
        MOV        B,@R0
        MUL        AB
        ADD        A,R3        ;3 + OK
        MOV        R3,A
        MOV        A,R2
        ADDC        A,B
        MOV        R2,A        ;2+
        JNC        SM22
        INC        R4        ;1
SM22:        MOV        A,R5
        DEC        R0
        MOV        B,@R0
        MUL        AB
        ADD        A,R2        ;2 + OK
        XCH        A,R4
        ADDC        A,B    ; 1
        XCH        A,R3
        MOV        R5,A
        RET
;-----------------------------------

;FLOATING NUMBER NORMALIZATION
;ENTER:@R0:high BETY
;EXIT: @R0:high BETY
SBAG:        MOV        b,#16
        MOV        A,@R0
SBA1:        JB        ACC.7,SBA2
        CLR        C
        INC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        DEC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        DJNZ        b,SBA1
SBA2:        MOV        A,b
        ADD        A,#0F0H
        INC        R0
        INC        R0
        ADD        A,@R0
        MOV        @R0,A
        dec        r0
        dec        r0
        RET
;----------------------
;BINERY NUMBER TO FLOATING
;ENTER: @R0:high  BETY
;EXIT:        @R0:high BETY
SBTF:        INC        R0
        inc        r0
        MOV        @R0,#16
        dec        r0
        dec        r0
        LCALL        SBAG
        RET
;FLOATING NUMBER NORMALIZATION 4BETY
;ENTER:@R0:VALID NUMBER HIGH BYTE
;EXIT: @R0:high BETY
SBEG:        MOV        A,@R0
        MOV        b,#32
SBE1:        JB        ACC.7,SBE2
        CLR        C
        INC        R0
        INC        R0
        INC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        DEC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        DEC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        DEC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        DJNZ        b,SBE1
SBE2:        mov        a,r0
        add        a,#4
        mov        r0,a
        MOV        A,b
        ADD        A,#0E0H

        ADD        A,@R0
        MOV        @R0,A
        dec        R0
        dec        R0
        dec        R0
        dec        R0
        RET
;---------------------
;4 BETY TO 2BETY
;ENTER @R0 high BETY
;EXIT  @R0 high BETY
SBFG:        inc        r0
        inc        r0
        MOV        A,@R0
        JNB        ACC.7,SBF1
        DEC        R0
        MOV        A,@R0
        ADD        A,#1
        MOV        @R0,A
        DEC        R0
        MOV        A,@R0
        ADDC        A,#0
        JNC        SBF2
        RRC        A
        MOV        @R0,A
        INC        R0
        MOV        A,@R0
        RRC        A
        MOV        @R0,A
        INC        R0
        INC        R0
        INC        @R0
        MOV        A,R0
        ADD        A,#0FCH ;r0-4
        MOV        R0,A
        MOV        A,@R0
        SJMP        SBF2
SBF1:        DEC        R0
        DEC        R0
        MOV        A,@R0
SBF2:        INC        R0
        INC        R0
        MOV        @R0,A
        DEC        R0
        MOV        A,@R0
        INC        R0
        INC        R0
        MOV        @R0,A
        dec        R0
        RET
        ;HEX NUMBER DIVISION 2B/1B
;1ST DIVISOR/2ND DIVISOR
;ENTER:THE FIRST DIVISOR POWER 2B IN R4,R5
;      (@R0) 2ND DIVISOR POWER
;EXIT: QUOTIENT  STORED IN R6--R7(R6:HIGH BYTE)
;

SHDI:        MOV        A,@R0
        mov        b,#8
shdi7:        jb        acc.7,shdi6
        rl        a
        djnz        b,shdi7
shdi6:        cpl        a
        inc        a
        mov        r3,a
        mov        r7,#16
shdi8:        clr        c
        mov        a,r5
        rlc        a
        mov        r5,a
        mov        a,r4
        rlc        a
        mov        r4,a
        jb        acc.7,shdi9
        djnz        r7,shdi8
shdi9:        mov        a,r7
        clr        c
        subb        a,b
        mov        b,a
        mov        r7,#0
        mov        r6,#0
        mov        a,r4
        CLR        C
SHDI3:        JNC        SHDI5
        add        A,R3
        MOV        R4,A
        SETB        C
        SJMP        SHDI4
SHDI5:        ADD        A,R3
        JNC        SHDI4
        MOV        R4,A
;
SHDI4:        mov        a,r7
        rlc        a
        mov        r7,a
        MOV        A,R6
        RLC        A
        MOV        R6,A
        clr        c
        MOV        A,R5
        RLC        A
        MOV        R5,A
        mov        a,r4
        rlc        a
        mov        r4,a
        DJNZ        b,SHDI3

        RET
;==================================
; WRITE A BYTE FROM ACC TO 25045
outb:        MOV        CONT,#8
outb1:        CLR        SCK
        RLC        A
        MOV        SDI,C
        SETB        SCK
        DJNZ        CONT,outb1
        clr        sdi
        RET
; READ A BYTE FROM 25045 TO ACC
inbyt:        MOV        CONT,#8
ibytr:        SETB        SCK
        CLR        SCK
        MOV        C,SO
        RLC        A
        DJNZ        CONT,ibytr
        RET
wren_cmd:
        clr        sck
        CLR        CS
        MOV        A,#WREN
        LCALL        outb
        clr        sck
        SETB        CS
        ret
wrdi_cmd:
        clr        sck
        CLR        CS
        MOV        A,#WRDI
        LCALL        outb
        clr        sck
        SETB        CS
        ret
;READ STATE REGIST
READSR: clr        sck
        CLR        CS
        MOV        A,#RDSR
        LCALL        outb
        LCALL        inbyt
        clr        sck
        SETB        CS
        RET
;WRITE STATE REGIST
WRITESR:clr        sck
        CLR        CS
        MOV        A,#WRSR
        LCALL        outb
        MOV        A,#d60n
        LCALL        outb
        clr        sck
        SETB        CS
        lcall        wip_poll
        RET
WATCHDOG:
        CLR        CS
        SETB        CS
        RET
WRITEBYTE:     ;R2:ADDR,ACC:DATA
        push        acc
        clr        sck
        CLR        CS
        MOV        A,#cwr
;        mov        acc.3,c
        LCALL        outb
        MOV        A,R2
        LCALL        outb
        POP        ACC
        LCALL        outb
        clr        sck
        SETB        CS
        lcall        wip_poll
        RET

READBYTE:      ;R2:ADDR,ACC:DATA
        clr        sck
        CLR        CS
        MOV        A,#crd
;        mov        acc.3,c
        LCALL        outb
        MOV        A,R2
        LCALL        outb
        LCALL        inbyt
        clr        sck
        SETB        CS
        RET
rpage:
;r2:page begin addr ,r0:RAM addr,r3:bytes c:A8
        clr        sck
        CLR        CS
        MOV        A,#crd
;        mov        acc.3,c
        LCALL        outb
        MOV        A,R2
        LCALL        outb
rpage1: LCALL        inbyt
        mov        @r0,a
        inc        r0
        djnz        r3,rpage1
        clr        sck
        SETB        CS
        ret

wip_poll:
        mov        b,#max_poll
wip_poll1:
        lcall        readsr
        jnb        acc.0,wip_poll2
        djnz        b,wip_poll1
wip_poll2:
        ret
;

en_pas: mov        r2,#xpass
        mov        r0,#6
        mov        r3,#2
        setb        c
        lcall        rpage
        mov        led_pa,#chr_p
        mov        r0,#led_tx
        mov        @r0,#0ffh
        inc        r0
        mov        r2,#4
en_p18: mov        @r0,#7fh        ;-
        inc        r0
        djnz        r2,en_p18
        mov        cour_l,#2
        mov        flashc,time_l
        mov        cntmp,#5
        mov        r4,#0
        mov        r5,#0

en_p07: jnb        btime_out,$
        clr        btime_out
        lcall        keyb
        jnz        en_p07
en_p0a: lcall        en_p00
        cjne        a,#fd_key,en_p0b
        ret
en_p0b:        lcall        compas
        jnz        en_p03
        ret
en_p03: mov        r4,#0
        mov        r5,#0
        djnz        cntmp,en_p0a
        mov        a,#0ffh
        ret

en_p00: mov        btmp,time_h
en_p08: mov        a,time_h
        clr        c
        subb        a,btmp
        add        a,#220
        jnc        en_p09
        mov        a,#0ffh
        ret
en_p09:
;        lcall        prosse
        jnb        btime_out,en_p01
        clr        btime_out
        lcall        keyb
        jz        en_p01
        cjne        a,#ri_key,en_p02
        MOV        A,cour_l
        ADD        A,#led_pa
        MOV        R0,A
        MOV        A,@R0
        setb        ACC.0
        MOV        @R0,A
        mov        a,cour_l
        inc        a
        mov        cour_l,a
        cjne        a,#6,en_p01
        mov        cour_l,#2
        ret

en_p01: lcall        flashp
        jnc        en_p08
        MOV        A,cour_l
        ADD        A,#led_pa
        MOV        R0,A
        MOV        A,@R0
        CPL        ACC.0
        MOV        @R0,A
        ljmp        en_p08

en_p02: cjne        a,#up_key,en_p04
        mov        a,cour_l
        clr        c
        rrc        a
        JNC        en_p022
        add        a,#3
        mov        r1,a
        MOV        A,@R1
        ADD        A,#1
        DA        A
        XCHD        A,@R1
        SJMP        en_p021
en_p022:
        add        a,#3
        mov        r1,a
        MOV        A,@R1
        ADD        A,#10H
        DA        A
        MOV        @R1,A
en_p021:
        mov        a,cour_l
        add        a,#led_pa
        mov        r0,a
        mov        @r0,#chr_bar        ;|
        mov        r1,#60
en_p020:
        jnb        btime_out,$
        clr        btime_out
        lcall        watchdog
        djnz        r1,en_p020
        mov        @r0,#7fh
        sjmp        en_p01
en_p04: cjne        a,#e_key,en_p05
        mov        a,cour_l
        cjne        a,#5,en_p041
        ret
en_p041:
        add        a,#led_pa
        mov        r0,a
        mov        @r0,#chr_?
        mov        r1,#60
        sjmp        en_p020
en_p05: cjne        a,#fr_key,en_p06
        mov        r7,#11h
        mov        r6,#11h
        lcall        wren_cmd
        mov        r2,#xpass
        mov        a,r6
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xpass+1
        mov        a,r7
        lcall        writebyte
        mov        cour_l,#2
        mov        r4,#0
        mov        r5,#0
        ljmp        en_p01
en_p06:        cjne        a,#fd_key,en_p01
        ret

compas: mov        a,r4
        cjne        a,06,compas1
        mov        a,r5
        cjne        a,07,compas1
        clr        a
        ret

compas1:
        mov        a,#0ffh
        ret

chn_pas:
        mov        led_pa,#chr_p
        mov        r0,#led_tx
        mov        @r0,#chr_?
        inc        r0
        mov        r2,#4
ch_p08: mov        @r0,#7fh        ;-
        inc        r0
        djnz        r2,ch_p08
        mov        cour_l,#2
        mov        flashc,time_l
        mov        r4,#0
        mov        r5,#0

ch_p07: jnb        btime_out,$
        clr        btime_out
        lcall        keyb
        jnz        ch_p07
        lcall        en_p00
        mov        ledtmp,led_pa
        mov        a,r4
        push        acc
        mov        a,r5
        push        acc
        lcall        yesno
        mov        r6,a
        pop        acc
        mov        r5,a
        pop        acc
        mov        r4,a
        mov        a,r6
        cjne        a,#e_key,ch_p01
        lcall        wren_cmd
        mov        r2,#xpass
        mov        a,r4
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xpass+1
        mov        a,r5
        lcall        writebyte
ch_p01: mov        cour_l,#0
        mov        led_tx,#0ffh
        ret

TOP

yesno:
;        mov        led_pa,ledtmp
        mov        r0,#led_tx
        mov        r1,#3
        mov        r2,#5
yesno0: mov        a,@r0
        mov        @r1,a
        inc        r0
        inc        r1
        djnz        r2,yesno0
        mov        cntmp,time_h

yesnob: lcall        tkeyb
        jnz        yesnob

yesno5:
;        lcall        prosse
        mov        a,time_h
        clr        c
        subb        a,cntmp
        add        a,#waitime
        jnc        yesno6
        mov        r0,#led_tx
        mov        r2,#5
        mov        r1,#3
yesno9: mov        a,@r1
        mov        @r0,a
        inc        r0
        inc        r1
        djnz        r2,yesno9
        mov        a,#0ffh
        ret
yesno6:        lcall        flashp
        jnc        yesno2
        jnb        bflash,yesno3
        mov        r0,#led_tx
        mov        r2,#5
yesno1: mov        @r0,#chr_?
        inc        r0
        djnz        r2,yesno1
        sjmp        yesno2
yesno3: mov        r2,#5
        mov        r0,#led_tx
yesno4: mov        @r0,#0ffh
        inc        r0
        djnz        r2,yesno4

yesno2: jnb        btime_out,yesno5
        clr        btime_out
        lcall        keyb
        jz        yesno5
        push        acc
        mov        r0,#led_tx
        mov        r2,#5
        mov        r1,#3
yesno8: mov        a,@r1
        mov        @r0,a
        inc        r0
        inc        r1
        djnz        r2,yesno8
        pop        acc
        ret

g_crsltm:
        mov        b,#10
        mov        a,r5
        div        ab
        mov        r5,a
        mov        a,r6
        anl        a,#0f0h
        orl        a,b
        swap        a
        mov        b,#10
        div        ab
        swap        a
        xch        a,r6
        anl        a,#0fh
        swap        a
        orl        a,b
        swap        a
        mov        b,#10
        div        ab
        orl        a,r6
        mov        r6,a
        ret

LPAA:        MOV        A,cour_l
        RRC        A
        MOV        A,@R0
        JC        LPA1
        SWAP        A
LPA1:        ANL        A,#0FH
        LCALL        nled
        MOV        R2,A
        MOV        A,cour_l
        ADD        A,#led_pa
        MOV        R0,A
        MOV        A,R2
        MOV        @R0,A
        RET


prosse:
        jnb        brouting,pros01
        clr        brouting
        setb        bda_chn
        mov        cn_otl,tl1
        mov        r5,cn_s_h
        mov        r6,cn_s_l
        mov        r0,#5
        lcall        sbtf
        mov        r0,#lth_pr
        lcall        sfm2
        MOV        r0,#3
        lcall        sbeg
        mov        r0,#3
        lcall        sbfg
        lcall        sfth
        mov        r0,#c_rslt
        mov        a,r5
        mov        @r0,a
        inc        r0
        mov        a,r6
        mov        @r0,a
        dec        r0
        mov        c_tglt,#0
        lcall        chk_lth
        lcall        chk_lt1
        ret
pros01: mov        a,tl1
        cjne        a,cn_otl,pros03
        ret
pros03: jb        brouting,prosse
        mov        cn_otl,a
        add        a,trnpr
        mov        b,lth_pg
        mul        ab
        mov        a,b
;        clr        c
;        rlc        a
        mov        c_tglt,a
        mov        r0,#c_rslt+1
        clr        a
        add        a,@r0
        mov        r6,a
        dec        r0
        mov        a,@r0
        addc        a,#0
        mov        r5,a
        setb        bda_chn
        lcall        chk_lth
        lcall        chk_lt1
        ret
;
chk_lth:
;        lcall        g_crsltm
chk_lt4:
        mov        r0,#c_grpcut+1
        mov        a,r6
        add        a,@r0
        mov        r6,a
        dec        r0
        mov        a,r5
        addc        a,@r0
        mov        r5,a
        clr        c
        mov        r0,#c_c_l+1
        mov        a,r6
        add        a,@r0
        mov        r6,a
        dec        r0
        mov        a,r5
        addc        a,@r0
        mov        r5,a
        ret
chk_lt1:
        cjne        a,set_ch,chk_lt2
        mov        a,r6
        cjne        a,set_cl,chk_lt2
chk_lt2:
        jc        chk_lt3
        setb        bcut
        clr        cut_rly
        mov        cutmp,time_h
        mov        flashc,time_l
        mov        r0,#c_c_l
        mov        @r0,#0
        inc        r0
        mov        @r0,#0
        clr        ie.0
        lcall        wren_cmd
        clr        a
        mov        r2,#xc_c_l
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xc_c_l+1
        clr        a
        lcall        writebyte
        setb        ie.0
        mov        r1,#c_rslt
        mov        a,@r1
        mov        r5,a
        inc        r1
        mov        a,@r1
        mov        r6,a
;        lcall        g_crsltm
        mov        r0,#c_grpcut+1
        mov        a,r6
        cpl        a
        add        a,#1
        mov        @r0,a
        dec        r0
        mov        a,r5
        cpl        a
        addc        a,#0
        mov        @r0,a
        clr        ie.0
        lcall        wren_cmd
        mov        a,@r0
        mov        r2,#xc_grpcut
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xc_grpcut+1
        inc        r0
        mov        a,@r0
        lcall        writebyte
        setb        ie.0
chk_lt3:
        ret

saveval:
        lcall        wren_cmd
        mov        r0,#cbrslt
        inc        r0
        mov        r1,#4
        lcall        sbth
        mov        a,cour_h
        cjne        a,#1,sval0
        mov        r0,#trnpr
        mov        a,r5
        mov        @r0,a
        mov        r2,#xtrnpr
        lcall        writebyte
        mov        a,r5
        cpl        a
        inc        a
        mov        th1,a
        mov        tl1,a
        lcall        wren_cmd
        mov        r2,#xtl1
        mov        a,r5
        lcall        writebyte
        ret
sval0:        cjne        a,#2,sval1
        mov        r3,#0
        mov        a,cbrslt
        anl        a,#7
        jz        sva102
        cjne        a,#6,sva104
sva104:        jnc        sva102
        mov        r2,a
sva101:        mov        a,r5
        add        a,#10h
        mov        r5,a
        mov        a,#27h
        addc        a,r4
        mov        r4,a
        djnz        r2,sva101
sva102:        mov        r0,#set_ch
        mov        a,r4
        mov        @r0,a
        inc        r0
        mov        a,r5
        mov        @r0,a
        dec        r0
        mov        r2,#xset_c
        mov        a,r4
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xset_c+1
        mov        a,r5
        lcall        writebyte
        ret
sval1:        cjne        a,#3,sval2
        mov        r0,#diatmp
        mov        a,r4
        mov        @r0,a
        inc        r0
        mov        a,r5
        mov        @r0,a
        dec        r0
        mov        r2,#xdiam
        mov        a,r4
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xdiam+1
        mov        a,r5
        lcall        writebyte
        ret
sval2:        cjne        a,#4,sval4
        mov        r3,#0
        mov        a,cbrslt
        anl        a,#0fh
        jz        sval31
        mov        r2,a
sva121:        mov        a,r5
        add        a,#10h
        mov        r5,a
        mov        a,#27h
        addc        a,r4
        mov        r4,a
        mov        a,r3
        addc        a,#0
        mov        r3,a
        djnz        r2,sva121
sval31:        mov        r0,#total
        mov        @r0,a
        inc        r0
        mov        a,r4
        mov        @r0,a
        inc        r0
        mov        a,r5
        mov        @r0,a
        mov        a,r3
        mov        r2,#xtotal
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xtotal+1
        mov        a,r4
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xtotal+2
        mov        a,r5
        lcall        writebyte
        ret
sval4:        cjne        a,#5,sval5
        mov        r3,#0
        mov        a,cbrslt
        anl        a,#7
        jz        sva142
        cjne        a,#6,sva144
sva144:        jnc        sva142
        mov        r2,a
sva141:        mov        a,r5
        add        a,#10h
        mov        r5,a
        mov        a,#27h
        addc        a,r4
        mov        r4,a
        djnz        r2,sva141
sva142:
        mov        R0,#c_c_l
        mov        a,r4
        mov        @r0,a
        inc        r0
        mov        a,r5
        mov        @r0,a
        mov        r2,#xc_c_l+1
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xc_c_l
        mov        a,r4
        lcall        writebyte
        mov        r0,#c_rslt+1
        mov        a,@r0
        add        a,c_tglt
        mov        r6,a
        dec        r0
        mov        a,@r0
        addc        a,#0
        mov        r5,a
;        lcall        g_crsltm
        mov        r1,#c_grpcut+1
        mov        a,r6
        cpl        a
        add        a,#1
        mov        @r1,a
        dec        r1
        mov        a,r5
        cpl        a
        addc        a,#0
        mov        @r1,a
        lcall        wren_cmd
        mov        a,@r1
        mov        r2,#xc_grpcut
        lcall        writebyte
        lcall        wren_cmd
        mov        r2,#xc_grpcut+1
        inc        r1
        mov        a,@r1
        lcall        writebyte
sval5:        ret

setval: mov        a,cour_h
        lcall        led_ch
        mov        a,cour_h
        lcall        d_dicam
        mov        a,cour_h
        cjne        a,#6,st_v011        ;total and password
st_v011:
        jc        st_v01
        jnb        bscr3,st_v09
        mov        led_pa,#chr_p
        mov        r0,#led_tx
        mov        @r0,#0ffh
        inc        r0
        mov        r2,#4
st_v06: mov        @r0,#7fh        ;-
        inc        r0
        djnz        r2,st_v06
        ret
st_v09:
        clr        c
        subb        a,#6
        rl        a
        add        a,#stic_p
        mov        r2,a
        clr        c
        mov        r0,#5
        mov        r3,#2
        lcall        rpage
        mov        a,r5
        mov        r3,a
        mov        a,r6
        mov        r4,a
        mov        r0,#3
        mov        r1,#cbrslt
        lcall        shtb
        mov        r0,#cbrslt
        lcall        s_led_d
        ret

st_v01: cjne        a,#1,st_v02        ;n
        mov        r0,#cbrslt
        mov        @r0,#0
        inc        r0
        mov        a,trnpr
        mov        b,#100
        div        ab
        mov        @r0,a
        mov        a,b
        mov        b,#10
        div        ab
        swap        a
        orl        a,b
        inc        r0
        mov        @r0,a
        mov        r0,#cbrslt
        lcall        s_led_d
        ret
st_v02: cjne        a,#3,st_v03        ;d
        mov        r0,#diatmp
        mov        r1,#cbrslt
        lcall        shtb
        mov        r0,#cbrslt
        mov        a,@r0
        jz        setv1
        mov        @r0,#0
        inc        r0
        mov        @r0,#99h
        inc        r0
        mov        @r0,#99h
        mov        r0,#cbrslt
setv1: