📄 410b.asm
字号:
;TEA5767 FM RADIO
;6MHz 4 digitals display
;2008/5/16 V3.0 PASSED!
RF BIT 08H;READY FLAG
BLF BIT 09H;BAND LIMIT FLAG
STEREO BIT 0AH;STEREO FLAG
READ EQU 0C1H;TEA5767READ ADD
WRIT EQU 0C0H;TEA5767WRITE ADD
S1 EQU P1.4;search
UP EQU P1.3;向上
DOWN EQU P1.2;向下
SDA EQU P1.1;数据传送
SCL EQU P1.0;时钟控制状态
LEDG BIT P3.7;green LED:STREREO
LEDR BIT P3.5;red LED:LIMIT
DOT BIT P3.4
ST1H DATA 30H;收到电台高位
ST1L DATA 31H;收到电台低位
ST2H DATA 32H;READ3
ST2L DATA 33H;READ4
ST3H DATA 34H;READ5
ST3L DATA 35H;READ5
WTH DATA 36H;PLLH
WTL DATA 37H;PLLL
SLA DATA 38H;37H为被控器的地址
NUMBYT DATA 39H;38H为数据字节计数器
DISBUF DATA 3AH;显示缓冲区
MRD DATA 40H;接收数据缓冲区首地址
MTD DATA 50H;发送数据缓冲区首地址
EXTRN CODE (_calc)
;HIGH side LO injection BYTE3.4=1
;0x2A,0xB0,0xF1,0x9E,0x40
;88MHz->29DAH
;93100KHz->2C49H XIAN MUSIC
;主程序
MAIN: MOV SP,#5FH
MOV SCON,#0
LCALL DEL240
CLR RF
CLR BLF
CLR STEREO
LCALL SET896
LCALL DEL240
LCALL MRDINI
LCALL FM_RD
LCALL PLLDIS
JNB STEREO, BEGIN;
CLR LEDG ;STEREO LEDG ON
;88MHz=29DA HILO=0
;search up word 0xE9,0xDA,0xC8,0x17,0x00,
BEGIN:
MOV MTD, #0E9H ;BIT7=1BIT6=1+29H
MOV MTD+1,#0DAH ;88MHz
MOV MTD+2,#0C8H ;search up
MOV MTD+3,#17H ;
MOV MTD+4,#00H
SERCH: JB S1,SERCH
LCALL DEL12
JB S1,SERCH
SETB LEDG
SETB LEDR
LCALL FM_WT
LCALL DEL240
LCALL DEL240
LCALL MRDINI
AGAIN: LCALL FM_RD
JNB RF,AGAIN
JNB STEREO,MONO
MOV MTD+2,#00H ;STEREO
CLR LEDG ;GREEN LED ON
AJMP LIST
MONO: MOV MTD+2,#08H
LIST: MOV MTD+1,ST1L
MOV MTD,ST1H
LCALL FM_WT
LCALL PLLDIS
JB BLF,BACK ;LIMIT?
MOV MTD+2,#0C8H ;search up
MOV A,MRD+1
ADD A,#0CH ;当前频率+100KHz
MOV MTD+1,A
MOV A,MRD
ADDC A,#0C0H ;BIT7=1,BIT6=1搜索
MOV MTD,A
LJMP SERCH
;字节3: 0xC8向上低本振,0x58向下高本振
;108MHz=3364H
;search down word 0xF3,0x64,0x48,0x17,0x00,
BACK: MOV ST1H,#33H
MOV ST1L,#64H
LCALL PLLDIS
CLR LEDR
MOV MTD, #0F3H ;BIT7=1BIT6=1+33H
MOV MTD+1,#64H ;108MHz
MOV MTD+2,#48H ;search down
MOV MTD+3,#17H ;
MOV MTD+4,#00H
SERCH2: JB S1,SERCH2
LCALL DEL12
JB S1,SERCH2
SETB LEDG
SETB LEDR
LCALL FM_WT
LCALL DEL240
LCALL DEL240
LCALL MRDINI
AGAIN2: LCALL FM_RD
JNB RF,AGAIN2
JNB STEREO,MONO2
MOV MTD+2,#00H ;STEREO
CLR LEDG ;GREEN LED ON
AJMP LIST2
MONO2: MOV MTD+2,#08H
LIST2: MOV MTD+1,ST1L
MOV MTD,ST1H
LCALL FM_WT
LCALL PLLDIS
JB BLF,RETUR
MOV MTD+2,#48H ;search down
MOV A,MRD+1
SUBB A,#0CH ;当前频率-100KHz
MOV MTD+1,A
MOV A,MRD
SUBB A,#00H
ADD A,#0C0H ;BIT7=1,BIT6=1搜索
MOV MTD,A
LJMP SERCH2
RETUR: MOV ST1H,#29H
MOV ST1L,#0DAH
LCALL PLLDIS
CLR LEDR
LJMP BEGIN
;===========================================================
;Given station frequency is 92900KHz=Hex2C67
;89600KHz:0x2A,0x9E,0x91,0x9F,0x40
;0x2A,0x9E,0x00,0x17,0x00
SET896: MOV MTD, #2AH ;设定89600KHz
MOV MTD+1,#9EH ;2A9E
MOV MTD+2,#00H ;
MOV MTD+3,#17H ;
MOV MTD+4,#00H
LCALL FM_WT
RET
;---------------------------------------------------
MRDINI: CLR A
MOV MRD, A ;CLR MRD
MOV MRD+1,A ;
MOV MRD+2,A ;
MOV MRD+3,A ;
MOV MRD+4,A
MOV ST1H,A
MOV ST1L,A
RET
;-----------------------------------------------------------
;TEA5767HN写入
FM_WT: MOV SLA,#0C0H ;取写器件地址
MOV NUMBYT,#5 ;写字节数
LCALL WRNBYT ;5个字节写入TEA5767
RET
;-------------------------------------------------------
;TEA5767HN读出
FM_RD:
MOV SLA,#0C1H ;取读器件地址
MOV NUMBYT,#5 ;读出5个字节
LCALL RDNBYT ;
MOV A,MRD ;接收数据缓冲区首地址
ANL A,#3FH ;屏蔽无效位
MOV ST1H,A ;存电台高位
MOV A,MRD
RLC A
MOV RF,C ;READY FLAG
RLC A
MOV BLF,C ;BAND LIMIT FLAG
MOV A,MRD+1 ;
MOV ST1L,A ;存电台低位
MOV A,MRD+2
RLC A
MOV STEREO,C ;STEREO FLAG
RET
;==================================================
;F=PLL×8192+225000/1000000
;8192=2000H
;PLL->F,频率显示
PLLDIS: MOV R7,ST1L;电台低位
MOV R6,ST1H;电台高位
MOV R5,#00H
MOV R4,#00H
LCALL _calc
MOV ST2L,R7;频率最低位
MOV ST2H,R6;频率高位
MOV R6,ST2H
MOV R7,ST2L
LCALL HB2
MOV R0,#DISBUF
MOV A,R5 ;个位
ANL A,#0FH
MOV @R0,A
MOV A,R5 ;十位
SWAP A
ANL A,#0FH
INC R0
MOV @R0,A
MOV A,R4 ;百位
ANL A,#0FH
INC R0
MOV @R0,A
MOV A,R4 ;千位
SWAP A
ANL A,#0FH
INC R0
MOV @R0,A
ORL DISBUF+1,#80H;加小数点
LCALL DISP
RET
;--------------------------------------------------
;双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中。高位在R6
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。R3是最高位
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H
HB3: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A
DJNZ R2,HB3
RET
;-------------------------------------------
;显示先送低位
DISP:
MOV R0,#DISBUF ;先个位
MOV A,#04H
MOV R2,A
DISP1: MOV A,@R0
JNB ACC.7,NOPOT
CLR ACC.7 ;有小数点
MOV B,#7FH ;共阴用#80H
AJMP ISPOT
NOPOT: MOV B,#0FFH ;#00H
ISPOT: MOV DPTR,#TABEL
MOVC A,@A+DPTR
ANL A,B ;共阴显示小数点ORL A,B
LCALL REVERS
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R2,DISP1
RET
;共阳码表低电平有效
tabel:
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;0123456789
db 88h,83h,0c6h,0a1h,86h,8eh,8ch,89h,91h,0bfh,0FFH ;AbCdEFPHY-
REVERS: CLR C
RRC A
MOV 07H,C
RRC A
MOV 06H,C
RRC A
MOV 05H,C
RRC A
MOV 04H,C
RRC A
MOV 03H,C
RRC A
MOV 02H,C
RRC A
MOV 01H,C
RRC A
MOV 00H,C
MOV A,20H
RET
;=======================================================
;IIC总线操作子程序包
STAR: SETB SDA;启动IIC总线
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
STOP: CLR SDA ;停止IIC总线数据传送
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SDA
CLR SCL
RET
MACK: CLR SDA ;发送应答位
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
MNACK: SETB SDA ;发送非应答位
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
RET
CACK: SETB SDA ;应答位检查
SETB SCL
CLR F0
MOV C,SDA
JNC CEND
SETB F0
CEND: CLR SCL
RET
WRBYT: MOV R0,#08H ;向SDA线上发送1个数据字节
WLP: RLC A
JC WR1
AJMP WR00
WLP1: DJNZ R0,WLP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
AJMP WLP1
WR00: CLR SDA
SETB SCL
NOP
NOP
CLR SCL
AJMP WLP1
WRNBYT: MOV R3,NUMBYT ;向IIC总线发送n个字节数据
LCALL STAR
MOV A,SLA ;取写器件地址
LCALL WRBYT ;写入写器件地址
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD ;写入数据缓存首地址
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
RDBYT: MOV R0,#08H ;从SDA线上读取1个数据字节
RLP: SETB SDA
SETB SCL
MOV C,SDA
MOV A,R2
RLC A
MOV R2,A
CLR SCL
DJNZ R0,RLP
RET
;从IIC总线接收n个字节数据
RDNBYT: MOV R3, NUMBYT ;读n个字节数据
LCALL STAR
MOV A,SLA ;取读器件地址
LCALL WRBYT ;写入读器件地址
LCALL CACK
JB F0,RDNBYT
MOV R1,#MRD ;读数据缓存首地址
RDN1: LCALL RDBYT ;读一个字节数据
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK: LCALL MACK
INC R1
SJMP RDN1
;=======================================
;12ms@6MHz延时
DEL12: MOV R7,#25
DEL7: MOV R6,#120
DJNZ R6,$
DJNZ R7,DEL7
RET
;----------------------------------
DEL240: MOV R5,#20
LP1: LCALL DEL12
DJNZ R5,LP1
RET
;=================================
BP: CLR DOT
LCALL DEL240
SETB DOT
RET
;--------------------------------
BPL: MOV R5,#8;长声
BB: LCALL BP
DJNZ R5,BB
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -