📄 sp_lib.lst
字号:
F_Key_Scan_ServiceLoop_2:
00008DD0 11 93 01 70 r1 = [P_IOA_Buffer]; // PortA.7 low(scan line +Vcc)
00008DD2 09 B3 7F FF r1 &= 0xFF7F;
00008DD4 19 D3 01 70 [P_IOA_Buffer] = r1;
00008DD6 11 93 00 70 r1 = [P_IOA_Data]; // get key data from IOA
//r1 = [P_IOB_Data]; // get key data from IOB
00008DD8 4F B2 r1 &= 0x000F; //
00008DD9 01 95 r2 = r1; // key from +Vcc
00008DDA 0A 87 FF FF r3 = r2 xor 0xffff; // Be a +Vcc mask
// delay here
00008DDC 00 EE nop;
00008DDD 00 EE nop;
00008DDE 00 EE nop;
00008DDF 11 93 01 70 r1 = [P_IOA_Buffer]; // PortA.7 high(scan line)
00008DE1 09 A3 80 00 r1 |= 0x0080; //
00008DE3 19 D3 01 70 [P_IOA_Buffer] = r1; //
00008DE5 11 93 00 70 r1 = [P_IOA_Data]; //
//r1 = [P_IOB_Data]; // get key data from IOB
00008DE7 4F B2 r1 &= 0x000F; //
00008DE8 02 83 r1 ^= r2; // possible bits by scan line
00008DE9 03 B3 r1 &= r3; // do +Vcc mask
00008DEA 59 93 r1 = r1 lsl 4; //
00008DEB 02 A3 r1 |= r2; //
//r2 = r2 lsl 4; //
//r1 |= r2; //
00008DEC 09 B3 FF 00 r1 = r1 and 0xFF; // mask bit[0..7]
00008DEE 12 95 C5 00 r2 = [R_DebounceReg]; //
00008DF0 19 D3 C5 00 [R_DebounceReg] = r1; //
00008DF2 12 45 C5 00 cmp r2,[R_DebounceReg]; //
00008DF4 04 5E je L_KS_StableTwoSample_2; //
00008DF5 48 92 r1 = C_DebounceCnt; //debounce time setting
00008DF6 19 D3 C6 00 [R_DebounceCnt] = r1; //
00008DF8 90 9A retf; //
L_KS_StableTwoSample_2:
00008DF9 11 93 C6 00 r1 = [R_DebounceCnt]; //
00008DFB 01 5E jz L_KS_StableOverDebounce_2; //
00008DFC 90 9A retf;
L_KS_StableOverDebounce_2:
00008DFD 19 D3 C6 00 [R_DebounceCnt] = r1; //
00008DFF 12 95 C5 00 r2 = [R_DebounceReg]; //
00008E01 11 93 C7 00 r1 = [R_KeyBuf]; //
00008E03 1A D5 C7 00 [R_KeyBuf] = r2; //
00008E05 09 83 FF 00 r1 = r1 xor 0x00ff; //
00008E07 11 B3 C7 00 r1 = r1 and [R_KeyBuf]; //
00008E09 09 B3 FF 00 r1 = r1 and 0x00ff; //
00008E0B 11 A3 C8 00 r1 = r1 or [R_KeyStrobe]; //
00008E0D 19 D3 C8 00 [R_KeyStrobe] = r1; //save stable key code to R_KeyStrobe
00008E0F 90 9A retf;
//////////////////////////////////////////////////////////////////
// Function: debounce counter down count
//////////////////////////////////////////////////////////////////
F_Key_DebounceCnt_Down:
00008E10 11 93 C6 00 r1 = [R_DebounceCnt]; // Debounce subroutine for F_IO_Key_Scan:
00008E12 03 5E jz L_DebounceCntZero; // stop count if zero
00008E13 41 22 r1 -= 0x0001; //
00008E14 19 D3 C6 00 [R_DebounceCnt] = r1; //
L_DebounceCntZero: //
00008E16 90 9A retf; //
//****************************************************************
// Function: Get Keycode for I/O Port
// Destory register: r1, r2
//****************************************************************
_SP_GetCh:
F_SP_GetCh:
//push BP,BP to [SP];
//BP = SP + 1;
00008E17 11 93 C8 00 r1 = [R_KeyStrobe]; // Get Key code
00008E19 40 94 r2 = 0x0000; // Clear KeyStrobe for next key
00008E1A 1A D5 C8 00 [R_KeyStrobe] = r2; //
//pop BP,BP from [SP];
00008E1C 90 9A retf;
//////////////////////////////////////////////////////////////////
// I/O APIs
//////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
//-- Procedure: _SP_Init_IOA
//-- Syntax : SP_Init_IOA(Dir,Data,Attrib)
//-- Description: Initialize IOA setting
//-- Parameter:
//-- Dir --> P_IOA_Dir,
//-- Data --> P_IOA_Data,
//-- Attrib --> P_IOA_Attrib
//-- Return:
//-- None
//--------------------------------------------------------------------
_SP_Init_IOA: .PROC
00008E1D 88 DA PUSH BP,BP TO [SP];
00008E1E 08 0B 01 00 BP = SP + 1;
00008E20 88 D2 PUSH R1,R1 TO [SP];
00008E21 03 92 R1 = [BP+3]; // Port direction
00008E22 19 D3 02 70 [P_IOA_Dir] = R1;
00008E24 04 92 R1 = [BP+4];
00008E25 19 D3 00 70 [P_IOA_Data] = R1;
00008E27 05 92 R1 = [BP+5];
00008E28 19 D3 03 70 [P_IOA_Attrib] = R1;
00008E2A 88 90 POP R1,R1 FROM [SP];
00008E2B 88 98 POP BP,BP FROM [SP];
00008E2C 90 9A RETF;
.ENDP
//////////////////////////////////////////////////////////////////
// SP_Inti_IOB
//////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
//-- Procedure: _SP_Init_IOB
//-- Syntax : SP_Init_IOB(Dir,Data,Attrib)
//-- Description: Initialize IOB setting
//-- Parameter:
//-- Dir --> P_IOB_Dir,
//-- Data --> P_IOB_Data,
//-- Attrib --> P_IOB_Attrib
//-- Return:
//-- None
//--------------------------------------------------------------------
_SP_Init_IOB: .PROC
00008E2D 88 DA PUSH BP,BP TO [SP];
00008E2E 08 0B 01 00 BP = SP + 1;
00008E30 88 D2 PUSH R1,R1 TO [SP];
00008E31 03 92 R1 = [BP+3]; // Port direction
00008E32 19 D3 07 70 [P_IOB_Dir] = R1;
00008E34 04 92 R1 = [BP+4];
00008E35 19 D3 05 70 [P_IOB_Data] = R1;
00008E37 05 92 R1 = [BP+5];
00008E38 19 D3 08 70 [P_IOB_Attrib] = R1;
00008E3A 88 90 POP R1,R1 FROM [SP];
00008E3B 88 98 POP BP,BP FROM [SP];
00008E3C 90 9A RETF;
.ENDP
//--------------------------------------------------------------------
//-- Procedure: _SP_Import
//-- Syntax : SP_Import(Port Number,Data Buffer Pointer)
//-- Description: Import number from IO and save to a memory location
//-- Parameter:
//-- Port Number --> P_IOB_Dir,
//-- Data Buffer Pointer --> P_IOB_Data,
//-- Return:
//-- None
//--------------------------------------------------------------------
_SP_Import: .PROC
00008E3D 88 DA PUSH BP,BP TO [SP];
00008E3E 08 0B 01 00 BP = SP + 1;
00008E40 90 D4 PUSH R1,R2 TO [SP];
00008E41 03 92 R1 = [BP+3]; // Port Number
00008E42 04 94 R2 = [BP+4]; // Data Buffer Pointer
00008E43 C1 92 R1 = [R1] ;
00008E44 C2 D2 [R2] = R1 ;
00008E45 90 90 POP R1,R2 FROM [SP];
00008E46 88 98 POP BP,BP FROM [SP];
00008E47 90 9A RETF;
.ENDP
//--------------------------------------------------------------------
//-- Procedure: _SP_Export
//-- Syntax : SP_Export(Port Number,value)
//-- Description: Export value to I/O
//-- Parameter:
//-- Port Number --> Port_IOA_Data,Port_IOB_Data
//-- value
//-- Return:
//-- None
//--------------------------------------------------------------------
_SP_Export: .PROC
00008E48 88 DA PUSH BP,BP TO [SP];
00008E49 08 0B 01 00 BP = SP + 1;
00008E4B 90 D4 PUSH R1,R2 TO [SP];
00008E4C 03 92 R1 = [BP+3]; // Port Number
00008E4D 04 94 R2 = [BP+4]; // Value
00008E4E C1 D4 [R1] = R2 ;
00008E4F 90 90 POP R1,R2 FROM [SP];
00008E50 88 98 POP BP,BP FROM [SP];
00008E51 90 9A RETF;
.ENDP
//========================================================================================
// End of sp_lib.asm
//========================================================================================
0 error(s), 0 warning(s).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -