📄 ex77.asm
字号:
; "扩展模块" 实验七十七 GPRS通信实验(可选)
;
; 这是新增加的实验:手机互相通话
; 把第"40"号模块"键盘显示"的片选信号CS40孔接第"36"号模块";
; 片选信号"YS0(08000-08FFFH)孔。
; 用实验箱上0-9按键作为手机数字键用来拔号;
; 用“TRACE"键作为拔打功能键
; 用”STEP"键作为挂机键
; 用“HERE"键作为应答键
; 用实验连线把"Lab51CPU板”上P3.0孔连第32号模块的“RXD”孔,P3.1孔连“TXD"孔
; 用串口线把GPRS模块上DB9和实验箱上第32号模块中的DB9连接起来。
; 把SIM卡插入模块的卡座中。
; 用实验连线给GPRE模块加电,注意不能接反!!!。
; 程序清单:(KEIL例程\A51\实验七十七\EX77.ASM)
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口
IN equ 08001h ; 键盘读入口
LEDBuf equ 50h ; 显示缓冲
DataBuf equ 60h ; 拔号命令和号码缓存
size1 equ 7eh ;
size2 equ 7fh
ORG 0000H
ljmp Start
ORG 0030H
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr, #OUTSEG
movx @dptr, a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
ret
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 输出线置为0
mov dptr, #IN
movx a, @dptr ; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 键码定义
db 16h, 15h, 14h, 0ffh
db 13h, 12h, 11h, 10h
db 0dh, 0ch, 0bh, 0ah
db 0eh, 03h, 06h, 09h
db 0fh, 02h, 05h, 08h
db 00h, 01h, 04h, 07h
GetKey:
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b
mov r2, #6
KLoop:
mov a, r1 ; 找出键所在列
cpl a
movx @dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, @r0
cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入
djnz r2, KLoop
mov r2, #0ffh ; 没有键按下, 返回 0ffh
sjmp Exit
Goon1:
mov r1, a ; 键值 = 列 X 4 + 行
mov a, r2
dec a
rl a
rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中为读入的行值
mov r1, #4
LoopC:
rrc a ; 移位找出所在行
jc Exit
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit:
mov a, r2 ; 取出键码
mov dptr, #KeyTable
movc a, @a+dptr
mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等键释放
clr a
movx @dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
Start:
mov sp, #40h ;
mov LEDBuf+0, #0ffh ; 显示 8.8.8.8.
mov LEDBuf+1, #0ffh
mov LEDBuf+2, #0ffh
mov LEDBuf+3, #0ffh
mov LEDBuf+4, #0
mov LEDBuf+5, #0
mov DataBuf,#'A'; ;拔号命令
mov DataBuf+1,#'T';
mov DataBuf+2,#'D';
mov DataBuf+0eh,#';';
mov DataBuf+0fh,#0dh;
mov DataBuf+10h,#0ah;
MOV TMOD,#20H ;定时器T1初始化
MOV TH1,#0f4H
MOV TL1,#0f4H
MOV SCON,#50H ;串行口初始化
MOV PCON,#80H ;SMOD=1
SETB TR1 ;启动定时器T1
SETB EA ;开中断
MLoop0:mov size1,#03h ;
MLoop: call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
mov b,a;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cjne a,#10h, key11
sjmp gkey
key11: cjne a,#11h,key12
sjmp gkey2
key12: cjne a,#12h,key1_9
sjmp gkey3
; anl a,#0f0h;
;是功能键即发送给GPRS,进行拔号
; jnz gkey
key1_9: mov r0,#DataBuf ;送到拔号命令和号码缓存区
mov r1, #size1
mov a,@r1
add a,r0
mov r0,a
mov a,b
add a,#30h; ;转换成ACSII码;
mov @r0,a
mov a,b
anl a, #0fh ; 显示键码
mov dptr, #LEDMap
movc a, @a+dptr
mov LEDBuf+5, a
inc size1
mov r7,size1
cjne r7,#0eh,MLOOP
ljmp MLoop0
gkey: mov size2,#00h
gkey1: mov r0,#DataBuf ;送到拔号命令和号码缓存区
mov r1, #size2
mov a,@r1
add a,r0
mov r0,a
mov a,@r0
call senda_0
inc size2
mov r6,size2
cjne r6,#11h,gkey1
endok: mov LEDBuf+0, #40h ; 拔号完毕,显示 - - - - - -;
mov LEDBuf+1, #40h
mov LEDBuf+2, #40h
mov LEDBuf+3, #40h
mov LEDBuf+4, #40h
mov LEDBuf+5, #40h
endok1:call DisplayLED
call TestKey ; 有键入?
jz endok1 ; 无键入, 继续显示
call GetKey ; 读入键码
mov b,a;
anl a,#0f0h; ;是功能键即发送给GPRS,进行拔号
jnz gkey2
sjmp endok1
gkey2: mov a,#'a' ;挂机
call senda_0
mov a,#'t'
call senda_0
mov a,#'h'
call senda_0
mov a,#0dh
call senda_0
mov a,#0ah
call senda_0
ljmp start
gkey3: mov a,#'a' ;挂机
call senda_0
mov a,#'t'
call senda_0
mov a,#'a'
call senda_0
mov a,#0dh
call senda_0
mov a,#0ah
call senda_0
ljmp start
senda_0:mov sbuf,a
JNB TI,$ ;串行发送一帧结束了吗?
CLR TI ;
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -