📄 receivedata.asm
字号:
;*******************************************************************
;* *
;* ME500单片机开发系统演示程序 - 接收 DTMF 编码 *
;* *
;* LCD1602显示 *
;* *
;* *
;* 版本: V1.0 (2006/11/20) *
;* 作者: gguoqing (Email: gguoqing@willar.com) *
;* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) *
;* 邮箱: support@willar.com *
;* *
;*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* *
;*******************************************************************
MT_RS EQU P2.3
MT_RW EQU P2.4
MT_CS EQU P2.5
MT_CK EQU P2.6
TEL EQU P2.7
LCD_RS EQU P2.0 ;LCD控制端口
LCD_RW EQU P2.1
LCD_EN EQU P2.2
LCD_X EQU 27H ;LCD 地址变量
BEEP BIT P3.7
COUNT EQU 2FH
TEMP EQU 2EH
;**********************************************************
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP EX_T0
ORG 0013H
LJMP EX_T1
ORG 0030H
;**********************************************************
MAIN:
MOV SP,#60H
MOV P1,#0FFH
MOV P0,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CALL INIT_LCD ;初始化LCD
CALL SET_LCD1 ;第一行显示信息
CALL SET_LCD2 ;第二行显示信息
SETB IT1 ;设置中断触发方式:下降沿触发
SETB EA ;总的中断允许
SETB EX1 ;允许外部中断EX1中断
MOV R0,#30H
MOV 20H,#00H
MOV COUNT,#00H
CLR1:
MOV @R0,#00H
INC R0
CJNE R0,#3FH,CLR1
MOV R0,#30H
;-------------------------------------------------------
MAIN1:
JB 20H.0,MAIN2 ;振铃信号有效
JMP MAIN1
MAIN2:
CLR EX1 ;关闭外部T1中断
CLR 20H.0
MOV COUNT,#00H
CLR TEL ;摘机
ACALL DELAY50MS ;延时150ms
ACALL DELAY50MS ;等待电话线路稳定
ACALL DELAY50MS
ACALL MT_INIT
ACALL MT_IRQ_INIT
MOV LCD_X,#04H ;设定显示初始位
MOV TEMP,#00H
MAIN3:
MOV A,TEMP
CJNE A,#0BH,MAIN4 ;"*"
CLR EX0
MOV TEMP,#00H
CALL BEEP_BL
CALL BEEP_BL
SETB EX0
MAIN4:
MOV A,TEMP
CJNE A,#0CH,MAIN3 ;"#"
CLR EX0
CALL BEEP_BL ;挂机提示音
CALL BEEP_BL
CALL BEEP_BL
CALL BEEP_BL
SETB TEL ;挂机
AJMP MAIN
;-------------------------------------------------------------
;MT8880 初始化
;RS=1,RW=0,写状态寄存器
;-------------------------------------------------------------
MT_INIT:
MOV A,#10H
CLR MT_CS
NOP
NOP
SETB MT_RS
CLR MT_RW
CLR MT_CK
MOV P1,A ;写 8880CRA,CRA=0000.
LCALL W_CP
MOV P1,A ;写 8880CRA,CRA=0000.
LCALL W_CP
MOV A,#18H
SETB MT_RS
CLR MT_RW
CLR MT_CK
MOV P1,A ;写 8880CRA,CRA=1000,允许选择CRB.
LCALL W_CP
MOV A,#10H
SETB MT_RS
CLR MT_RW
CLR MT_CK
MOV P1,A ;写 8880CRB,CRB=0000
LCALL W_CP
RET
;---------------------------------------------------------------
;MT8880中断初始化子程序
;RS=1,RW=0,写状态寄存器
;---------------------------------------------------------------
MT_IRQ_INIT:
MOV A,#14H
CLR MT_CS
NOP
NOP
SETB MT_RS
CLR MT_RW
CLR MT_CK
MOV P1,A ;写8880CRA,8880模式1为DTMF,IRQ
LCALL W_CP
SETB IT0 ;设置中断触发方式:下降沿触发
SETB EA ;总的中断允许
SETB EX0 ;允许外部中断EX0中断
ACALL DELAY50MS
ACALL DELAY50MS
RET
;**********************************************************
;MT8880中断接收DTMF子程序
;RS=1,RW=1,读状态寄存器
;RS=0,RW=1,读接收数据寄存器.
;**********************************************************
EX_T0:
CLR EA
LCALL R_STATUS ;读状态寄存器(SR)
MOV A,#0FFH
MOV P1,A
NOP
NOP
CLR MT_RS ;读接收数据寄存器
SETB MT_RW
NOP
NOP
LCALL R_CP ;读 8880 接收数据寄存器
NOP
NOP
ANL A,#0FH ;屏蔽高四位
NOP
NOP
MOV TEMP,A
MOV @R0,A ;低四位为有效数据
CJNE A,#0FH,EX_T01 ;去除蜂鸣器干扰值
JMP T0_END
EX_T01:
ACALL CONV1
INC LCD_X
INC R0
MOV A,LCD_X
CJNE A,#10H,T0_END
CALL SET_LCD2 ;第二行显示信息
MOV R0,#30H
MOV @R0,TEMP
MOV LCD_X,#04H
ACALL CONV1
INC LCD_X
INC R0
T0_END:
SETB EA
RETI
;========================================================
;振铃信号中断子程序
;========================================================
EX_T1:
CLR EX1
INC COUNT
MOV A,COUNT
CJNE A,#03H,EX_END
SETB 20H.0 ;振铃次数标记
CLR COUNT
EX_END:
SETB EX1
RETI
;-------------------------------------------------------
;读状态寄存器
;RS=1,RW=1,读状态寄存器。
;-------------------------------------------------------
R_STATUS:
MOV A,#0FFH
MOV P1,A
SETB MT_RS ;读状态寄存器
SETB MT_RW
SETB MT_CK
NOP
NOP
LCALL R_CP
RET
;-------------------------------------------------------
;写MT8880的Φ2脉冲子程序
;-------------------------------------------------------
W_CP:
SETB MT_CK
NOP
NOP
NOP
NOP
CLR MT_CK
RET
;-------------------------------------------------------
;读MT8880的Φ2脉冲子程序
;-------------------------------------------------------
R_CP:
SETB MT_CK
NOP
NOP
MOV A,P1
NOP
NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -