⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex77.asm

📁 gprs gsm的汇编程序
💻 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 + -