?? 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 + -