📄 icprg.asm
字号:
;===================================================================================
;
; 通泰MCU 通讯 DVD MCU 应用(V1.00)
;
; 2005/10/20
;============== CPU WORKING REGISTER ===============================================
.EQ DP $0
.EQ ACC $1
.EQ TB1 $2
.EQ TB2 $3
.EQ TB3 $4
.EQ DPL $5
.EQ DPM $6
.EQ DPH $7 ;DEFAULT
;===================================================================================
.EQ PS $8 ;PS R/W 1100 CPU power saving register
.EQ INTF $9 ;INTF R/W 0000 Interrupt request flag register
.EQ INTC $A ;INTC R/W 0000 Interrupt control register
;============== I/O Port SFR Define ================================================
.EQ PAC $0B ;PAC R/W 1111 I/O port A control register
.EQ PA $0C ;PA R/W 1111 I/O port A register
.EQ PBC $0D ;PBC R/W 1111 I/O port B control register
.EQ PB $0E ;PB R/W 1111 I/O port B register
.EQ PCC $0F ;PCC R/W 1111 I/O port C control register
.EQ PC $10 ;PC R/W 1111 I/O port C register
;===================================================================================
.EQ TBC $15 ;TBC R/W 0000 Time base control register
.EQ TMRAL $16 ;TMAL R/W 0000 Timer/counter A data low register
.EQ TMRAH $17 ;TMAH R/W 0000 Timer/counter A data high register
.EQ TMRAC $18 ;TMAC R/W 0000 Timer/counter A control register
.EQ TMRBL $19 ;TMBL R/W 0000 Timer/counter B data low register
.EQ TMRBH $1A ;TMBH R/W 0000 Timer/counter B data high register
.EQ TMRBC $1B ;TMBC R/W 0000 Timer/counter B control register
;============== SFR REGISTER =======================================================
.EQ MFC $1F ;MFC R/W 0010 Multi-function control register
;============== USER RAM DEFINE RANGE ->20h~9Fh ====================================
.EQ PIN_DAT #$1 ;数据 PA0
.EQ PIN_CLK #$2 ;时钟 PA1
.EQ PIN_STB #$4 ;片选 PA2
.EQ PIN_TST #$8 ;测试 PA3
;===================================================================================
;必须使用的变量
;===================================================================================
.EQ DATA_HI $21
.EQ DATA_LO $22
.EQ LOOP_COUNT $23
;====================================================================================
.ORG $0
;程序开始
JMP LAB_MAIN
;中断处理,(无须中断,所以不做处理)
INIT_PROG:
NOP
NOP
NOP
RET
LAB_MAIN:
;程序开始,清零
STX #$0,ACC
STX #$0,DPL
STX #$0,DPM
STX #$0,DPH
STX #$0,TB1
STX #$0,TB2
STX #$0,TB3
STX #$0,INTF
STX #$0,INTC
STX #$0,TBC
STX #$0,TMRAL
STX #$0,TMRAH
STX #$0,TMRAC
STX #$0,TMRBL
STX #$0,TMRBH
STX #$0,TMRBC
LAB_INIT_IO_PIN:
;A0,A1,A2 三个脚位输入其它都输出!
STX #$7,PAC
STX #$0,PBC
STX #$0,PCC
LAB_LOOP_BEGIN:
;清除数据
STX #$0,DATA_LO
STX #$0,DATA_HI
;循环8次
STX #$8,LOOP_COUNT
LAB_STB_LOOP_HIGH:
;读入数据,等待 STB=LOW
;LDA PA
;XOR PIN_TST,ACC,A
;STX PA
LDA PA
TST PIN_STB,ACC
JPZ LAB_CLK_LOOP_HIGH
JMP LAB_STB_LOOP_HIGH
LAB_CLK_LOOP_HIGH:
;等待CLK变底
LDA PA
TST PIN_CLK,ACC
JPZ LAB_DATA_LEFT_SHIFT
JMP LAB_CLK_LOOP_HIGH
LAB_DATA_LEFT_SHIFT:
;循环移位
;DATA_LO <<= 1
;DATA_HI <<= 1
CLC
RLC DATA_LO,M
RLC DATA_HI,M
LAB_DATA_READ:
;读出数据
LDA PA
TST PIN_DAT,ACC
JPZ LAB_CLK_LOOP_LOW
;高位放入数据 80
;DATA_LO |= 1
ORI #$1,DATA_LO,M
LAB_CLK_LOOP_LOW:
;等待CLK变高
LDA PA
TST PIN_CLK,ACC
JPZ LAB_CLK_LOOP_LOW
;计数器递减
LDA LOOP_COUNT
SUB #$1,ACC,A
STX LOOP_COUNT
;退出循环
JPZ LAB_STB_LOOP_LOW
;继续循环
JMP LAB_CLK_LOOP_HIGH
LAB_STB_LOOP_LOW:
;等待STB变高
LDA PA
TST PIN_STB,ACC
JPZ LAB_STB_LOOP_LOW
LAB_CMP_FIRST:
;比较数据高位是否为 = 1
LDA DATA_HI
CMP #$1,ACC
JPZ LAB_STX_PA
JMP LAB_CMP_NEXT
LAB_STX_PA:
LDA DATA_LO
STX PA
NOP
JMP LAB_CMP_END
LAB_CMP_NEXT:
;比较数据高位是否为 = 2
CMP #$2,ACC
JPZ LAB_STX_PB
JMP LAB_CMP_LAST
LAB_STX_PB:
LDA DATA_LO
STX PB
NOP
JMP LAB_CMP_END
LAB_CMP_LAST:
;比较数据高位是否为 = 3
CMP #$3,ACC
JPZ LAB_STX_PC
JMP LAB_CMP_END
LAB_STX_PC:
LDA DATA_LO
STX PC
NOP
LAB_CMP_END:
;比较结束,准备循环,加上部分延时
NOP
;重新循环
JMP LAB_LOOP_BEGIN
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -