📄 system.asm
字号:
.include hardware.inc
.CODE
K_V: .DW 0x6D4B,0x694C,0x6465,0x5E9A,0x4A80,0x3FC4,0x331C,0x2462;
D_V: .DW 0xDEB1,0xDB9D,0xD84D,0xD4E4,0xCBF6,0xC882,0xC553,0xC2A4;
F_V: .DW 0x0035,0x0004,0x0005,0x0006,0x0014,0x0015,0x0016,0x0024,0x0025,0x0026,0x0035,0x0034,0x0036,0x0007,0x0017,0x0027;
.RAM
.VAR dtmf_count;
.VAR KF1,DF10,DF11,KF2,DF20,DF21;
.TEXT
.public _Init_System
_Init_System:
PUSH R1 TO [SP]
R1 = 0x0000;
[dtmf_count] = R1;
POP R1 FROM [SP]
RETF
.public _Open_Int
_Open_Int:
PUSH BP TO [SP]
BP = SP + 1
PUSH R1 TO [SP]
R1 = [BP+3]
[P_INT_Ctrl] = R1
// INT FIQ,IRQ
POP R1 FROM [SP]
POP BP FROM [SP]
RETF
.public _Close_Int
_Close_Int:
INT OFF
RETF
.public _Init_IO
_Init_IO:
PUSH BP TO [SP]
BP = SP + 1
PUSH R1,R2 TO [SP]
R1 = [BP + 3]
R2 = [BP + 4]
[R1] = R2 //Io_dir
R2 = [BP + 5]
R1 += 1
[R1] = R2 //Io_Attrib
R2 = [BP + 6]
R1 = R1 - 3
[R1] = R2 //Io_Data
POP R1,R2 FROM [SP]
POP BP FROM [SP]
RETF
.public _Send_7219
_Send_7219:
PUSH BP TO [SP]
BP = SP + 1
PUSH R1 TO [SP]
R1 = [BP + 3]
PUSH R1 TO [SP]
PUSH R1 TO [SP]
R1 = [P_IOB_Data]
R1 &= 0xFFFB
[P_IOB_Data] = R1
R1 = 0x00D9
[P_SIO_Ctrl] = R1
[P_SIO_Start] = R1
POP R1 FROM [SP]
R1 &= 0xFF00
R1 = R1 LSR 4
R1 = R1 LSR 4
CALL _S_Send
POP R1 FROM [SP]
R1 &= 0x00FF
CALL _S_Send
[P_SIO_Stop] = R1
R1 = [P_IOB_Data]
R1 |= 0x0004
[P_IOB_Data] = R1
POP R1 FROM [SP]
POP BP FROM [SP]
RETF
.public _S_Send
_S_Send:
[P_SIO_Data] = R1
S_Busy:
R1 = 0x0080
TEST R1,[P_SIO_Start]
JNZ S_Busy
RETF
.public _WatchDog_Clear
_WatchDog_Clear:
PUSH R1 TO [SP]
R1 = 0x0001
[P_Watchdog_Clear] = R1
POP R1 FROM [SP]
RETF
.public _SystemClock
_SystemClock:
PUSH R1 TO [SP]
R1 = 0x001B
[P_SystemClock] = R1
POP R1 FROM [SP]
RETF
.public _Init_ADC
_Init_ADC:
PUSH R1 TO [SP]
R1 = 0x0000 //选择通道LINE_IN为IOA0
[P_ADC_MUX_Ctrl] = r1
R1 = 0x003D //允许A/D转换
[P_ADC_Ctrl] = r1
POP R1 FROM [SP]
RETF
.public _Init_DAC
_Init_DAC:
PUSH R1 TO [SP]
R1 = 0x00A0 //允许A/D转换
[P_DAC_Ctrl] = r1
POP R1 FROM [SP]
RETF
.public _Set_Sample_Rate
_Set_Sample_Rate:
PUSH BP to [SP]
BP = SP+1
PUSH R1 TO [SP]
R1 = 0x0030 // 时钟频率为CLKA的Fosc/2
[P_TimerA_Ctrl] = R1
R1 = [BP+3]
[P_TimerA_Data] = R1
POP R1 FROM [SP]
POP BP FROM [SP]
RETF
.public _DELAY
_DELAY:
PUSH R2 TO [SP]
R2 = 0x0001
DELAY_LP:
[P_Watchdog_Clear] = R2
R1 -= 1
CMP R1,0
JNE DELAY_LP
POP R2 FROM [SP]
RETF
.public _Dial
_Dial:
PUSH BP TO [SP]
INT OFF
BP = SP+1;
PUSH R1,R2 TO [SP]
R1 = [BP+3];
R2 = F_V;
R2 += R1;
R1 = [R2];
PUSH R1 TO [SP]
R1 &= 0x00F0;
R1 = R1 LSR 4;
R2 = K_V;
R2 = R2+R1;
R2 = [R2];
[KF1] = R2;
R2 = D_V;
R2 = R2+R1;
R2 = [R2];
[DF10] = R2;
R2 = 0x0000;
[DF11] = R2;
POP R1 FROM [SP]
R1 &= 0x000F;
R2 = K_V;
R2 += R1;
R2 = [R2];
[KF2] = R2;
R2 = D_V;
R2 += R1;
R2 = [R2];
[DF20] = R2;
R2 = 0x0000;
[DF21] = R2;
R1 = 1000;
[dtmf_count] = R1;
INT IRQ;
Dial_LP:
R1 = 0x0001;
[P_Watchdog_Clear] = R1;
R2 = 0x0000;
CMP R2,[dtmf_count];
JB Dial_LP
POP R1,R2 FROM [SP]
POP BP FROM [SP]
RETF
.public _Init_UART
_Init_UART:
PUSH BP TO [SP]
BP = SP +1
PUSH R1,R2 TO [SP]
R1 = [BP + 3]
R2 = R1
R1 &= 0x00FF
[P_UART_Command1] = R1
R2 &= 0xFF00
R2 = R2 LSR 4
R2 = R2 LSR 4
[P_UART_Command2] = R2
R1 = [BP + 4]
R2 = R1
R1 &= 0x00FF
[P_UART_BaudScalarLow] = R1
R2 = R2 LSR 4
R2 = R2 LSR 4
[P_UART_BaudScalarHigh] = R2
POP R1,R2 FROM [SP]
POP BP FROM [SP]
RETF
.public _Send_UART
_Send_UART:
PUSH R2 TO [SP]
_SU_LP:
R2 = 0x0040 //Ready to send data
TEST R2,[P_UART_Command2]
JZ _SU_LP
[P_UART_Data] = R1
R1 = 0x0100
CALL _DELAY
POP R2 FROM [SP]
RETF
.public _IRQ1
_IRQ1:
PUSH R1,R5 TO [SP]
R1 = 0x0001;
[P_Watchdog_Clear] = R1;
R1 = 0x1000
[P_INT_Clear] = R1
R2 = 0x0001;
ADC_LP:
[P_Watchdog_Clear] = R2
R1 = [P_ADC_Ctrl]
TEST R1,0x8000
JZ ADC_LP
R1 = [0x7014]
[P_DAC1] = R1;
POP R1,R5 FROM [SP]
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -