📄 bo hao.asm
字号:
;*******************************************************************
;* *
;* ME500单片机开发系统演示程序 - 电话拨号器 *
;* *
;* 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 *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* *
;*******************************************************************
; 采用MT8880双音频芯片
; 单片机的 P1.0-P1.3 分别接入MT8880的 D0-D3;
; 使用矩阵键盘输入电话号码,按"F"健开始拨号。
;**********************************************************
MT_RS EQU P2.3
MT_RW EQU P2.4
MT_CS EQU P2.5
MT_CK EQU P2.6
TEL EQU P2.7
K1 BIT P1.4
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
KEY_COUN EQU 4FH ;按键计数单元
;**********************************************************
ORG 0000H
AJMP MAIN
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 ;第二行显示信息
MOV R0,#40H
MOV A,#00H
MOV KEY_COUN,A
CLR1:
MOV @R0,A ;清零
INC R0
CJNE R0,#50H,CLR1
;==========================================================
;输入号码子程序
;==========================================================
TEL_IN:
MOV R0,#40H
MOV LCD_X,#4
S_LOOP:
MOV P1,#0F0H ;判是否有按键按下
MOV A,P1
CJNE A,#0F0H,S_LOOP1 ;有键按下转LOOP1
JMP S_LOOP
S_LOOP1:
ACALL KEY_IN ;调矩阵键盘程序
ACALL BEEP_BL ;调蜂鸣器程序
MOV A,R3 ;键值入A
CJNE A,#0FH,S_LOOP2 ;是否为发送键
JMP S_DTMF ;调拨号程序
S_LOOP2:
CJNE A,#00H,S_LOOP3 ;是否为"0"键
MOV A,#0AH
S_LOOP3:
MOV @R0,A ;键值送寄存器保存
ACALL CONV1 ;显示键值
INC LCD_X
INC R0
INC KEY_COUN ;对按键的次数,进行计数
JMP S_LOOP
;----------------------------------------------------
;发送DTMF信号
;-----------------------------------------------------
S_DTMF:
CALL SET_LCD2 ;第二行显示信息
MOV R5,#30
CLR TEL ;摘机
LOP0: CALL DELAY50MS ;延时等待拨号音出现
DJNZ R5,LOP0
ACALL MT_INIT ;MT8880初始化
ACALL MT_TRAN ;MT8880拨号
MOV R5,#240
LOP1: CALL DELAY50MS
DJNZ R5,LOP1
SETB TEL ;挂机
MOV R5,#4
LOP2: CALL DELAY50MS
DJNZ R5,LOP2
LJMP 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,写状态寄存器
;RS=1,RW=1,读状态寄存器
;RS=0,RW=0,写发送寄存器
;**********************************************************
MT_TRAN:
MOV R0,#40H ;发送数据存放起始单元
MOV R1,KEY_COUN
MOV LCD_X,#4
LOOP4:
MOV A,#1DH ;写8880CRA,CRA=1101.
CLR MT_CS
NOP
NOP
SETB MT_RS
CLR MT_RW
CLR MT_CK
MOV P1,A
LCALL W_CP
MOV A,#10H
SETB MT_RS
CLR MT_RW
CLR MT_CK
MOV P1,A ;写 8880CRB,CRB=0000.
LCALL W_CP ;8880模式2为TONE,DTMF,IRQ,BURST
CLR MT_RS ;写发送寄存器
CLR MT_RW
CLR MT_CK
LOOP2:
MOV A,@R0
ANL A,#0FH
MOV P1,A ;发送数据
LCALL W_CP
CALL DELAY50MS ;延时50MS
LOOP3:
;LCALL R_STATUS ;读 8880 状态寄存器
;JNB ACC.1,LOOP3
CALL CONV1
CALL DELAY50MS
CALL DELAY50MS
CALL DELAY50MS ;延时150MS
INC R0
INC LCD_X
DJNZ R1,LOOP2
SETB MT_CS
LCALL SET_LCD1
RET
;-------------------------------------------------------
;读状态寄存器
;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
CLR MT_CK
RET
;--------------------------------------------------------
;设置LCD初始化显示
;--------------------------------------------------------
SET_LCD1:
MOV DPTR,#LMESS1 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
RET
SET_LCD2:
MOV DPTR,#LMESS2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_PRINT
RET
LMESS1:
DB "TELEPHONE DIALER",0 ;LCD 第一行显示
LMESS2:
DB "TEL: ",0 ;LCD 第二行显示
;--------------------------------------------------------
;LCD 初始化子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -