📄 samsung.asm
字号:
ORG 0000H
JSAT: AJMP MAIN
ORG 000BH
AJMP L_TO_INT
ORG 0023H
AJMP L_COM_INT
L_TO_INT: LJMP TO_INT
L_COM_INT: LJMP COM_INT
ORG 30H
MAIN: MOV SP,#1FH
;--------------------------------设置 计时器器 T1--------------------------
TIME_SET: ANL TMOD,#00H ;时间计时器T1
ORL TMOD,#21H ;T1 设置为方式‘3’
MOV TH1,#0FFH
MOV TL0,#001H
MOV TH0,#000H
MOV 087H,#080H ;设置串口波特率
;--------------------------定时器T0计算器----------------------------------
SAT_DDD: SETB EA ;开所有中断
SETB ET0 ;允许T0中断
CLR PT0 ;置T0中断‘低优先’
SETB PS ;置串口中断为‘优先’
CLR ES ;关串口中断
SETB TR1 ;T1打开计时
CLR TI ;串口发送关
CLR F0 ;标置位 清 0
MOV SCON,#050H ;串口接收方式设置
;--------------------------------显示器复位部分-------------------
CLR INT1 ;置显示器
CLR T1
CLR T0
MOV P1,#00H
MOV R2,#03H
MOV P1,#38H
INIT1: SETB INT1 ;E=1
CLR INT1 ;E=0 产生一个正跳变的使能有效信号
DJNZ R2,INIT1
init2: MOV R2,#38H ;显示初始化
LCALL WI
MOV R2,#01H ;1
LCALL WI
MOV R2,#06H ;2
LCALL WI
MOV R2,#0CH ;3
LCALL WI
MOV R2,#0C0H ;在第二行显示邮件
MOV DPTR,#xianhua
MOV R3,#0FH
LCALL WI
LCALL WDD
; 在第一行显示移动文字
sat_b: MOV DPTR,#xianhua+10H
MOV R1,DPL
SAT_SEND: CLR F0
SETB TR0 ;T0打开计时
NEXT_SEND: JNB F0,NEXT_SEND ;等待计时器计算 '完'
LCALL DELAY
MOV R2,#80H ;光标定位
MOV R3,#10H ;显示多少个字符
LCALL WI
LCALL WDD
INC R1
MOV DPL,R1
CJNE R1,#32H,SAT_SEND ;显示一行字串的长度32
;-------------手机号码输入部分清空------0000000000-------------
MOV R0,#30H ;清空写入串号
MOV R1,#2EH
MOV R2,#10
write_no: LCALL A_MOV_DATA ;清空
;----------------------菜单选择------------------
SEL_SAT: ajmp disp
;-----------------测试部分---------------------
DATA_TO_DM: LCALL TO_DM
DISP: MOV R2,#080H ;在第一行显示 "SOFT"
MOV DPTR,#SOFT
MOV R3,#0FH
LCALL WI
LCALL WDD
MOV R2,#0C0H ;在第二行显示 "ESN"
MOV DPTR,#ESN
MOV R3,#0FH
LCALL WI
LCALL WDD
GET_INFO: ACALL CLS_DATA ;清空接收数据子程序
MOV R0,#040H ;发送读手机型号命令 '00'
mov DPTR,#READ_INFO
LCALL COM_TX
Lcall delay
CLR ES
MOV R0,#07CH
CJNE @R0,#07EH,DISP_1 ;检证数据接收是否正确
nv_ver2: MOV R0,#73H ;保存版本信息到 1F 单元住宅
MOV A,@R0
MOV R0,#1FH
MOV @R0,A
AJMP ver_chack
DISP_1: MOV R0,#07DH
CJNE @R0,#07EH,DISP_2 ;检证数据接收是否正确
nv_ver: MOV R0,#74H ;保存版本信息到 1F 单元住宅
MOV A,@R0
MOV R0,#1FH
MOV @R0,A
AJMP ver_chack
DISP_2: MOV R0,#07BH ;增加X系列
CJNE @R0,#07EH,DATA_TO_DM
ver_chack: MOV R0,#6BH ;检查是否A2000
CJNE @R0,#33H,NO_2
INC R0
CJNE @R0,#35H,NO_2
INC R0
CJNE @R0,#30H,NO_2
INC R0
CJNE @R0,#30H,NO_2
MOV 16H,#01H
AJMP D_VER_Y
DISP_A: AJMP DISP
NO_2: MOV 16H,#00
D_VER_Y: MOV R2,#087H ;正确显示手机版本
MOV R0,#068H
MOV R3,#08H
LCALL WI
LCALL WDD_RAM
GET_ESN: ACALL CLS_DATA ;获得手机 ESN 命令
MOV R0,#040H
MOV DPTR,#READ_ESN
LCALL COM_TX
LCALL DELAY
CLR ES
MOV R0,#049H ;X系列
CJNE @R0,#07EH,NV_N
MOV R1,#044H ;串号的所在地址
AJMP NV_GESV
NV_N: MOV R0,#04EH ;旧版本
CJNE @R0,#07EH,DISP_A
NV_GESN: MOV R1,#045H ;串号的所在地址
NV_GESV: LCALL HEX_ASC
MOV R2,#0C7H
MOV R0,#90H
MOV R3,#08H
LCALL WI
LCALL WDD_RAM
LCALL KEY
CJNE A,#0FDH,NEX_OK
AJMP SEL_SAT
GET_INFO_A: AJMP GET_INFO
NEX_OK: CJNE A,#0FEH,GET_INFO_A
; --------------输入串号处理-----------------------
MOV A,1DH
CJNE A,#02H,NEXT_S
AJMP ESN_W_S
NEXT_S: CJNE A,#01H,S_ESN_D ;是手机复位吗?
;------------------------手机复位-------------
; LCALL OPEN_DM_SAT
MOV R2,#080H ;在第一行显示 "SOFT"
MOV DPTR,#d_mob_re
MOV R3,#0FH
LCALL WI
LCALL WDD
MOV R2,#0C0H ;在第二行显示 "ESN"
MOV DPTR,#d_mob_yes
MOV R3,#0FH
LCALL WI
LCALL WDD
wait_re_key: LCALL KEY
CJNE A,#0FDH,NEX_OK_re
AJMP DISP
nex_ok_re: cjne a,#0feh,wait_re_key
ESN_RE_SAT: MOV 1EH,#0AH ;;不正常时重复上送10次
S_5_RE: DJNZ 1EH,ESN_RE_W
AJMP DISP
ESN_RE_W: ACALL CLS_DATA
MOV R0,#040H
MOV DPTR,#ESN_RE
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#69H
CJNE @R0,#07EH,S_5_RE ;接收是否正确
AJMP MOB_RE ;到手机重启
S_ESN_D: MOV 1CH,#7H ;光标初始化定位(ESN 的左边第一个 )
MOV R2,#080H ;在第一行显示 "WESN"
MOV DPTR,#W_ESN
MOV R3,#0FH
LCALL WI
LCALL WDD
DISP_W_E: MOV R1,#01BH ;串号的所在地址
LCALL HEX_ASC
MOV R2,#087H ;定位显示器
MOV R0,#90H ;显示字符RAM的偏移量
MOV R3,#08H ;要显示字符的长度
LCALL WI
LCALL WDD_RAM
LCALL GUANG ;光标的显示
LCALL WI
MOV R2,#0DH ;置光标闪烁
LCALL WI
ESN_KEY: LCALL KEY
CJNE A,#0DFH,ESN_KEY_NE
LCALL ESN_INC ;上键
AJMP DISP_W_E
ESN_KEY_NE: CJNE A,#0FBH,ESN_KEY_L
LCALL ESN_DEC ;下键
AJMP DISP_W_E
ESN_KEY_L: CJNE A,#0EFH,ESN_KEY_R
MOV A,1CH ;右键
CJNE A,#07H,R_I
AJMP DISP_W_E
R_I: INC A
MOV 1CH,A
AJMP DISP_W_E
ESN_KEY_R: CJNE A,#0F7H,ESN_KEY_OK ;左键
MOV A,1CH
CJNE A,#00H,L_I
AJMP DISP_W_E
L_I: DEC A
MOV 1CH,A
AJMP DISP_W_E
ESN_KEY_OK: CJNE A,#0FEH,ESN_KEY_CLS
MOV R2,#0CH
LCALL WI
AJMP ESN_W_S ;OK键 到输入号码程序
ESN_KEY_CLS: CJNE A,#0FDH,ESN_KEY
MOV R2,#0CH
LCALL WI
AJMP DISP
;----------------------输入号码程序------------------
S_NO_D: MOV 1CH,#0H ;光标初始化定位(输入电话号码的左边第一个 )
MOV R2,#0C0H ;在第一行显示 "NO. :???????????"
MOV DPTR,#TEL_NO
MOV R3,#0FH
LCALL WI
LCALL WDD
DISP_W_D: MOV R2,#0C5H ;定位显示器
MOV R0,#2EH ;显示字符RAM的偏移量
MOV R3,#0AH ;要显示字符的长度
LCALL WI
LCALL WDD_RAM
LCALL GUANG_D ;光标的显示
LCALL WI
MOV R2,#0EH ;置光标闪烁
LCALL WI
NO_KEY: LCALL KEY
CJNE A,#0DFH,NO_KEY_NE
LCALL NO_INC ;上键
AJMP DISP_W_D
NO_KEY_NE: CJNE A,#0FBH,NO_KEY_L
LCALL NO_DEC ;下键
AJMP DISP_W_D
NO_KEY_L: CJNE A,#0F7H,NO_KEY_R
MOV A,1CH ;右键
CJNE A,#09H,R_I_D
AJMP DISP_W_D
R_I_D: INC A
MOV 1CH,A
AJMP DISP_W_D
NO_KEY_R: CJNE A,#0EFH,NO_KEY_OK ;左键
MOV A,1CH
CJNE A,#00H,L_I_D
AJMP DISP_W_D
L_I_D: DEC A
MOV 1CH,A
AJMP DISP_W_D
NO_KEY_OK: CJNE A,#0FEH,NO_KEY_CLS
MOV R2,#0CH
LCALL WI
AJMP ESN_W_S ;OK键 到输入号码程序
NO_KEY_CLS: CJNE A,#0FDH,NO_KEY
MOV R2,#0CH
LCALL WI
AJMP DISP
AJMP ESN_W_S ;OK键
sat_a: AJMP GET_INFO
;------------------------手机处理部分---------------------
ESN_W_S: ;LCALL OPEN_DM_SAT ;手机转DM
MOV DPTR,#OFFLINE
MOV R2,#080H ;在第二行显示 "DM OFFLINE MODE"
MOV R3,#0FH
LCALL WI
LCALL WDD
OPEN_DM_SAT: MOV 1EH,#0AH ;;不正常时重复上送10次
S_5: DJNZ 1EH,OPEN_DM
AJMP DISP
jmp_a2000: ajmp no_a2000
OPEN_DM: ACALL CLS_DATA
MOV R0,#040H
MOV DPTR,#DM_DATA
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#48H
CJNE @R0,#07EH,S_5 ;接收是否正确
MOV A,1DH
CJNE A,#02H,jmp_a2000 ;是选择型号对吗? 转到一般的写ESN
;-------------3500 解密---------------------
MOV DPTR,#MODE_2
MOV R2,#080H ;在第二行显示 "UNLOCK"
MOV R3,#0FH
LCALL WI
LCALL WDD
MOV 1EH,#03H ;;不正常时重复上送10次
pass_r_0: DJNZ 1EH,pass_w_0
AJMP DISP
pass_w_0: ACALL CLS_DATA
MOV R0,#040H
MOV DPTR,#pass000000
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#69H
CJNE @R0,#07EH,pass_r_0 ;接收是否正确
MOV 1EH,#03H ;;不正常时重复上送10次
pass_r_1: DJNZ 1EH,pass_w_1
AJMP DISP
pass_w_1: ACALL CLS_DATA
MOV R0,#040H
MOV DPTR,#pass000001
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#69H
CJNE @R0,#07EH,pass_r_1 ;接收是否正确
MOV 1EH,#03H ;;不正常时重复上送10次
LOCK_r_1: DJNZ 1EH,LOCK_w_1
AJMP DISP
LOCK_w_1: ACALL CLS_DATA
MOV R0,#040H
MOV DPTR,#LOCK
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#69H
CJNE @R0,#07EH,LOCK_r_1 ;接收是否正确
;--------------------------写入PRL-------------------------------
MOV DPTR,#MODE_1
MOV R2,#080H ;在第二行显示 "WRIDE PRL"
MOV R3,#0FH
LCALL WI
LCALL WDD
MOV 1EH,#03H ;;不正常时重复上送10次
prl_r_1: DJNZ 1EH,prl_w_1
AJMP DISP
prl_w_1: ACALL CLS_DATA
clr ri
MOV R0,#040H
MOV DPTR,#prl3500_pass
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#40H
CJNE @R0,#07FH,prl_r_1 ;接收是否正确
MOV 1EH,#03H ;;不正常时重复上送10次
prl_r_2: DJNZ 1EH,prl_w_2
AJMP DISP
prl_w_2: ACALL CLS_DATA
clr ri
MOV R0,#040H
MOV DPTR,#prl3500_1
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#40H
CJNE @R0,#07FH,prl_r_2 ;接收是否正确
MOV 1EH,#03H ;;不正常时重复上送10次
prl_r_3: DJNZ 1EH,prl_w_3
AJMP DISP
prl_w_3: ACALL CLS_DATA
clr ri
MOV R0,#040H
MOV DPTR,#prl3500_2
LCALL COM_TX
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR ES
MOV R0,#40H
CJNE @R0,#07FH,prl_r_3 ;接收是否正确
AJMP MOB_RE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -