⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchhandle.s01

📁 5807收音机模块用于炬力平台
💻 S01
字号:
	NAME	searchhandle(17)
	RSEG	CODE_1(0)
	RSEG	CSTR(0)
	RSEG	CONST(0)
	EXTERN	ClearScreen
	EXTERN	FMStatus
	EXTERN	Freqtab
	EXTERN	GetBattery
	EXTERN	PutS
	EXTERN	ResShowPic
	PUBLIC	SearchHandle
	PUBLIC	Search_Show
	EXTERN	SetTextPos
	PUBLIC	ShowFreqInFM
	EXTERN	UpdateScreen
	EXTERN	ap_get_message
	EXTERN	ap_handle_hotkey
	EXTERN	fmSendCommand
	EXTERN	g_comval
	EXTERN	itoa_1
	EXTERN	itoa_2
	EXTERN	itoa_3
	EXTERN	radio_param
	EXTERN	ui_show_batt
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?US_DIV_L02
	EXTERN	?SS_DIV_L02
	EXTERN	?SS_MOD_L02
	EXTERN	?S_MUL_L02
	EXTERN	?SL_CMP_L03
	EXTERN	?BANK_CALL_DIRECT_L08
	EXTERN	?BANK_FAST_LEAVE_L08
	EXTERN	?STRCPY_L11
	EXTERN	?STRCAT_L11
	RSEG	CODE_1
SearchHandle:
; 1.	/*
; 2.	 *******************************************************************************
; 3.	 *                ACTOS AP
; 4.	 *        main ap of sdk 3.0
; 5.	 *
; 6.	 *        (c) Copyright, Actions Co,Ld.
; 7.	 *             All Right Reserved
; 8.	 *
; 9.	 *******************************************************************************
; 10.	 */
; 11.	
; 12.	#pragma codeseg(CODE_1)
; 13.	
; 14.	#include "ap_radio.h"
; 15.	#include "actos.h"
; 16.	extern comval_t F_comval;
; 17.	extern fm_play_status_t FMStatus;
; 18.	extern FMRADIO_param_t radio_param;
; 19.	extern char Freqtab[10];
; 20.	void ShowFreqInFM(void); //FM主界面显示
; 21.	bool Search_Show(FM_direct_t Direct); //自动搜台时的显示
; 22.	
; 23.	
; 24.	extern FMStatus_Tab_t d_FMStatus; 
; 25.	extern char SearchFreq;
; 26.	extern char SetFreq;
; 27.	
; 28.	int SearchHandle(BYTE Direct)
; 29.	{
	PUSH	BC
	PUSH	IX
	PUSH	AF
	LD	D,E
; 30.	    int key;
; 31.	    bool need_draw = TRUE;
; 32.	    BYTE Searchflag = 1;
	LD	HL,1
	ADD	HL,SP
	LD	(HL),1
	DEC	HL
	LD	(HL),1
?0003:
; 33.	    while (1)
; 34.	    {
; 35.	        if (Direct != 0)
	INC	D
	DEC	D
	JP	Z,?0038
?0005:
; 36.	        {
; 37.	            if (Direct == 10) //NEXT搜索处理
	LD	A,D
	CP	10
	JR	NZ,?0008
?0007:
; 38.	            {
; 39.	                if(((FMStatus.freq+1)>210)&&(FMStatus.mode==0))FMStatus.freq=0;
	LD	BC,(FMStatus+1)
	INC	BC
	LD	HL,210
	AND	A
	SBC	HL,BC
	JR	NC,?0010
	LD	A,(FMStatus+5)
	OR	A
	JR	Z,?0109
?0012:
?0011:
?0009:
?0010:
; 40.	                else if(((FMStatus.freq+1)>140)&&(FMStatus.mode==1))FMStatus.freq=0;
	LD	HL,140
	AND	A
	SBC	HL,BC
	JR	NC,?0015
	LD	A,(FMStatus+5)
	DEC	A
	JR	NZ,?0015
?0017:
?0016:
?0014:
?0109:
	LD	L,A
	LD	H,A
	JR	?0103
; 41.	                else
?0015:
; 42.	                {
; 43.	                    FMStatus.freq+=1;
	LD	L,C
	LD	H,B
?0103:
	LD	(FMStatus+1),HL
?0018:
?0013:
; 44.	                }
; 45.	                if(Search_Show(UP))return 0;
	PUSH	DE
	LD	E,1
	LD	A,BYTE3 Search_Show
	LD	HL,LWRD Search_Show
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	INC	L
	DEC	L
	POP	DE
	JR	Z,?0038
?0019:
	JR	?0107
; 46.	            }
?0020:
?0008:
; 47.	            else if (Direct == 20) //LAST搜索处理
	CP	20
	JR	NZ,?0023
?0022:
; 48.	            {
; 49.	                if(((FMStatus.freq-1)<2)&&(FMStatus.mode==0))FMStatus.freq=210;
	LD	HL,(FMStatus+1)
	LD	BC,65535
	ADD	HL,BC
	LD	BC,2
	AND	A
	SBC	HL,BC
	JR	NC,?0025
	LD	A,(FMStatus+5)
	OR	A
	JR	NZ,?0025
?0027:
?0026:
?0024:
	LD	HL,210
	JR	?0105
?0025:
; 50.	                else if(((FMStatus.freq-1)<2)&&(FMStatus.mode==1))FMStatus.freq=140;
	LD	HL,(FMStatus+1)
	LD	BC,65535
	ADD	HL,BC
	LD	BC,2
	AND	A
	SBC	HL,BC
	JR	NC,?0030
	LD	A,(FMStatus+5)
	DEC	A
	JR	NZ,?0030
?0032:
?0031:
?0029:
	LD	HL,140
?0105:
	LD	(FMStatus+1),HL
; 51.	                else
	JR	?0033
?0030:
; 52.	                {
; 53.	                    FMStatus.freq-=1;
	LD	HL,FMStatus+1
	LD	A,(HL)
	ADD	A,255
	LD	(HL),A
	INC	HL
	LD	A,(HL)
	ADC	A,255
	LD	(HL),A
?0033:
?0028:
; 54.	                }
; 55.	                if(Search_Show(DOWN))return 0;
	PUSH	DE
	LD	E,B
	LD	A,BYTE3 Search_Show
	LD	HL,LWRD Search_Show
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	INC	L
	DEC	L
	POP	DE
	JR	Z,?0038
?0034:
	JR	?0107
; 56.	            }
?0035:
?0023:
; 57.	            else if (Direct == 50)
	CP	50
	JR	NZ,?0038
?0037:
; 58.	            {
; 59.	                Direct = 0;
; 60.	                return 0;
?0107:
	LD	HL,0
; 61.	            }
	JP	LWRD ?0065
?0038:
?0036:
?0021:
?0006:
; 62.	        }
; 63.	        if (need_draw) //显示
	LD	HL,1
	ADD	HL,SP
	XOR	A
	OR	(HL)
	JR	Z,?0040
?0039:
; 64.	        {
; 65.	            ShowFreqInFM();
	LD	A,BYTE3 ShowFreqInFM
	LD	HL,LWRD ShowFreqInFM
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 66.	            need_draw = FALSE;
	LD	HL,1
	ADD	HL,SP
	LD	(HL),0
?0040:
; 67.	        }
; 68.	        key = ap_get_message();
	CALL	LWRD ap_get_message
	LD	C,A
	LD	B,0
	PUSH	BC
	POP	IX
; 69.	        switch (key)
	LD	A,29
	XOR	C
	JP	Z,?0003
?0042:
; 70.	        {
; 71.	            case AP_MSG_STANDBY:
; 72.	            //do nothing
; 73.	            break;
?0043:
	LD	A,38
	XOR	C
	JR	NZ,?0051
; 74.	            case AP_KEY_NEXT | AP_KEY_UP: //NEXT搜索时按NEXT键,停止搜索
; 75.	            if (Searchflag == 1)
	LD	L,B
	LD	H,B
	ADD	HL,SP
	LD	B,(HL)
	DEC	B
	JR	Z,?0110
?0044:
; 76.	            {
; 77.	                Searchflag = 0;
?0045:
; 78.	            }
; 79.	            else if (Direct == 10)
	LD	A,D
	CP	10
	JP	NZ,?0003
?0047:
; 80.	            {
; 81.	                Direct = 50;
	LD	D,50
; 82.	                   if(FMStatus.volume)
	LD	A,(FMStatus+6)
	OR	A
	JP	Z,?0003
?0049:
; 83.	                fmSendCommand(MC_MUTE, releaseMUTE);
	JR	?0108
?0050:
?0048:
?0046:
; 84.	            }
; 85.	            break;
?0051:
	LD	A,37
	XOR	C
	JR	NZ,?0059
; 86.	            case AP_KEY_PREV | AP_KEY_UP: //LAST搜索时按LAST键,停止搜索
; 87.	            if (Searchflag == 1)
	LD	L,B
	LD	H,B
	ADD	HL,SP
	LD	B,(HL)
	DEC	B
	JR	NZ,?0053
?0052:
; 88.	            {
; 89.	                Searchflag = 0;
?0110:
	LD	(HL),B
	JP	LWRD ?0003
?0053:
; 90.	            }
; 91.	            else if (Direct == 20)
	LD	A,D
	CP	20
	JP	NZ,?0003
?0055:
; 92.	            {
; 93.	                Direct = 50;
	LD	D,50
; 94.	                    if(FMStatus.volume)
	LD	A,(FMStatus+6)
	OR	A
	JP	Z,?0003
?0057:
; 95.	                fmSendCommand(MC_MUTE, releaseMUTE);
?0108:
	PUSH	DE
	CALL	LWRD ?0127
	POP	DE
?0058:
?0056:
?0054:
; 96.	            }
; 97.	            break;
	JP	LWRD ?0003
?0059:
; 98.	            default: //热键处理
; 99.	            key = ap_handle_hotkey(key);
	PUSH	DE
	PUSH	IX
	POP	HL
	LD	E,L
	CALL	LWRD ap_handle_hotkey
	LD	C,A
	PUSH	BC
	POP	IX
	POP	DE
; 100.	            if (key == RESULT_REDRAW)
	LD	A,46
	XOR	C
	JR	NZ,?0061
?0060:
; 101.	                need_draw = TRUE;
	LD	HL,1
	ADD	HL,SP
	LD	(HL),1
	JP	LWRD ?0003
?0061:
; 102.	            else if (key != 0)
	PUSH	IX
	POP	HL
	LD	A,L
	OR	H
	JP	Z,?0003
?0063:
; 103.	            {
; 104.	                return key;
; 105.	            }
?0065:
	POP	AF
	POP	IX
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
?0127:
	LD	BC,0
?0128:
	LD	E,12
?0129:
	LD	A,BYTE3 fmSendCommand
	LD	HL,LWRD fmSendCommand
	JP	LWRD ?BANK_CALL_DIRECT_L08
?0064:
?0062:
?0041:
; 106.	        }
; 107.	    }
; 108.	}
Search_Show:
; 109.	
; 110.	bool Search_Show(FM_direct_t Direct)
; 111.	{
	PUSH	BC
	PUSH	IX
	PUSH	DE
	PUSH	AF
; 112.	    bool Search_Flag;
; 113.	    int i;
; 114.	    FMStatus.stereo_status = 1;
	LD	A,1
	LD	(FMStatus+7),A
; 115.	    FMStatus.station = 0;
	XOR	A
	LD	(FMStatus+3),A
; 116.	    fmSendCommand(MC_MUTE, SetMUTE);
	LD	BC,1
	CALL	LWRD ?0128
; 117.	    fmSendCommand(MC_SETVOLUME, FMStatus.volume);
	LD	BC,(FMStatus+6)
	LD	B,0
	LD	E,64
	CALL	LWRD ?0129
; 118.	    fmSendCommand(MC_RESTORE, (int) &radio_param);
	LD	BC,radio_param
	LD	E,69
	CALL	LWRD ?0129
; 119.	    Search_Flag = fmSendCommand(MC_SEARCH, Direct);
	LD	HL,2
	ADD	HL,SP
	LD	C,(HL)
	LD	B,0
	LD	E,10
	CALL	LWRD ?0129
	PUSH	HL
	LD	HL,2
	ADD	HL,SP
	POP	BC
	LD	(HL),C
; 120.	    if (Search_Flag) //搜台成功后,MUTE释放
	XOR	A
	OR	C
	JR	Z,?0067
?0066:
; 121.	    {
; 122.	        fmSendCommand(MC_MUTE, releaseMUTE);
	CALL	LWRD ?0127
; 123.	        fmSendCommand(MC_GETSTATUS, (int) &FMStatus);
	LD	BC,FMStatus
	LD	E,131
	CALL	LWRD ?0129
?0067:
; 124.	    }
; 125.	    ShowFreqInFM();
	LD	A,BYTE3 ShowFreqInFM
	LD	HL,LWRD ShowFreqInFM
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 126.	    for (i = 0; i < 0x3999; i++)
	LD	IX,0
?0069:
	LD	BC,47513
	PUSH	IX
	POP	HL
	LD	A,128
	XOR	H
	LD	H,A
	SBC	HL,BC
	JR	NC,?0068
?0070:
	INC	IX
	JR	?0069
?0068:
; 127.	    {
; 128.	    }
; 129.	    return Search_Flag;
	LD	HL,0
	ADD	HL,SP
	LD	L,(HL)
; 130.	}
	POP	AF
	POP	AF
	POP	IX
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
ShowFreqInFM:
; 131.	
; 132.	void ShowFreqInFM(void)
; 133.	{
	PUSH	BC
	PUSH	DE
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	LD	HL,65518
	ADD	HL,SP
	LD	SP,HL
; 134.	    char buf[4] =
; 135.	    { "FM" };
	EX	DE,HL
	LD	HL,?0072
	LD	BC,4
	LDIR
; 136.	    long i;
; 137.	    int k, h;
; 138.	    char FMTab[7];
; 139.	
; 140.	    ClearScreen(NULL);
	LD	E,C
	LD	D,B
	CALL	LWRD ClearScreen
; 141.	    SetTextPos(128 / 2 - 6 * 3, 0);
	LD	E,46
	CALL	LWRD SetTextPos
; 142.	    if ((FMStatus.station_count > 0) && (FMStatus.station > 0)) //显示电台号
	LD	A,(FMStatus+4)
	OR	A
	JR	Z,?0074
	LD	A,(FMStatus+3)
	OR	A
	JR	Z,?0074
?0076:
?0075:
?0073:
; 143.	    {
; 144.	        strcpy(FMTab, "[");
	LD	DE,?0077
	LD	HL,4
	ADD	HL,SP
	CALL	LWRD ?STRCPY_L11
; 145.	        strcat(FMTab, "CH");
	LD	DE,?0078
	LD	HL,4
	ADD	HL,SP
	CALL	LWRD ?STRCAT_L11
; 146.	        *itoa_2(FMStatus.station, buf);
	LD	HL,0
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	DE,(FMStatus+3)
	LD	A,BYTE3 itoa_2
	LD	HL,LWRD itoa_2
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 147.	        strcat(FMTab, buf);
	LD	HL,0
	ADD	HL,SP
	EX	DE,HL
	LD	HL,4
	ADD	HL,SP
	CALL	LWRD ?STRCAT_L11
; 148.	        strcat(FMTab, "]");
	LD	DE,?0079
	LD	HL,4
	ADD	HL,SP
	CALL	LWRD ?STRCAT_L11
; 149.	        PutS(FMTab, -1);
	LD	C,255
	LD	HL,4
	ADD	HL,SP
	EX	DE,HL
	CALL	LWRD PutS
?0074:
; 150.	    }
; 151.	
; 152.	    ResShowPic(RA_FM, 16, 0); //fm 标志显示
	LD	C,0
	PUSH	BC
	LD	C,16
	LD	DE,433
	CALL	LWRD ?0130
	POP	AF
; 153.	    if (FMStatus.stereo_status == 0)
	LD	A,(FMStatus+7)
	OR	A
	JR	NZ,?0081
?0080:
; 154.	    {
; 155.	        ResShowPic(RA_STERE, 128 - 30, 0); //显示立体声
	LD	C,A
	PUSH	BC
	LD	C,98
	LD	DE,440
	CALL	LWRD ?0130
	POP	AF
?0081:
; 156.	    }
; 157.	
; 158.	    ui_show_batt(GetBattery(), F_comval.BatteryType); //电池电量显示
	LD	BC,(g_comval+15)
	CALL	LWRD GetBattery
	LD	E,A
	LD	D,0
	LD	A,BYTE3 ui_show_batt
	LD	HL,LWRD ui_show_batt
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 159.	    strcpy(Freqtab, "<");
	LD	DE,?0082
	LD	HL,Freqtab
	CALL	LWRD ?STRCPY_L11
; 160.	    strcat(Freqtab, "FM");
	LD	DE,?0083
	LD	HL,Freqtab
	CALL	LWRD ?STRCAT_L11
; 161.	#if 1  
; 162.	    //strcpy(Freqtab,"FM");
; 163.	    //频率换算及转换成ASCII码
; 164.	    k = FMStatus.freq;
	LD	IY,(FMStatus+1)
; 165.	    if(FMStatus.mode==0)
	LD	A,(FMStatus+5)
	OR	A
	LD	BC,10
	PUSH	IY
	POP	DE
	CALL	LWRD ?SS_DIV_L02
	JR	NZ,?0085
?0084:
; 166.	        i=k/10 + 87; 
	LD	HL,87
	JR	?0111
	LD	A,H
	JR	?0113
	SBC	A,A
	JR	?0115
	LD	B,C
	JR	?0116
	LD	(IX-5),H
	JR	?0117
	LD	(IX-3),B
; 167.	    else
	JR	?0086
?0085:
; 168.	        i=k/10 + 76;
	LD	HL,76
?0111:
	ADD	HL,DE
	LD	A,H
?0113:
	RLCA
	SBC	A,A
?0115:
	LD	C,A
	LD	B,C
?0116:
	LD	(IX-6),L
	LD	(IX-5),H
?0117:
	LD	(IX-4),C
	LD	(IX-3),B
?0086:
; 169.	
; 170.	    h=k%10;
	LD	BC,10
	PUSH	IY
	POP	DE
	CALL	LWRD ?SS_MOD_L02
	LD	(IX-2),E
; 171.	    
; 172.	    
; 173.	
; 174.	    if (i < 100)
	LD	L,B
	LD	H,B
	PUSH	HL
	LD	L,100
	PUSH	HL
	LD	C,(IX-4)
	LD	B,(IX-3)
	LD	L,(IX-6)
	LD	H,(IX-5)
	CALL	LWRD ?SL_CMP_L03
	LD	HL,0
	JR	NC,?0088
?0087:
; 175.	        *itoa_2(i, buf);
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	E,(IX-6)
	LD	A,BYTE3 itoa_2
	LD	HL,LWRD itoa_2
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 176.	    else
	JR	?0089
?0088:
; 177.	        *itoa_3(i, buf);
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	E,(IX-6)
	LD	D,(IX-5)
	LD	A,BYTE3 itoa_3
	LD	HL,LWRD itoa_3
	CALL	LWRD ?BANK_CALL_DIRECT_L08
?0089:
; 178.	    strcat(Freqtab, buf);
	LD	HL,0
	ADD	HL,SP
	EX	DE,HL
	LD	HL,Freqtab
	CALL	LWRD ?STRCAT_L11
; 179.	    strcat(Freqtab, ".");
	LD	DE,?0090
	LD	HL,Freqtab
	CALL	LWRD ?STRCAT_L11
; 180.	    
; 181.	    *itoa_1(h, buf);
	LD	HL,0
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	E,(IX-2)
	LD	A,BYTE3 itoa_1
	LD	HL,LWRD itoa_1
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 182.	    //buf[1]=' ';
; 183.	    //buf[1] = 0;
; 184.	    strcat(Freqtab, buf);
	LD	HL,0
	ADD	HL,SP
	EX	DE,HL
	LD	HL,Freqtab
	CALL	LWRD ?STRCAT_L11
; 185.	    strcat(Freqtab, ">");
	LD	DE,?0091
	LD	HL,Freqtab
	CALL	LWRD ?STRCAT_L11
; 186.	#else
; 187.	    *itoa_2(SetFreq, buf);
; 188.	    strcat(Freqtab, buf);
; 189.	    *itoa_2(SearchFreq, buf);
; 190.	    strcat(Freqtab, buf);
; 191.	    
; 192.	#endif    
; 193.	    
; 194.	    
; 195.	    
; 196.	    SetTextPos((128 - 6 * 8) / 2, 8);
	LD	C,8
	LD	E,40
	CALL	LWRD SetTextPos
; 197.	    PutS(Freqtab, -1); //显示电台频率
	LD	C,255
	LD	DE,Freqtab
	CALL	LWRD PutS
; 198.	    if (FMStatus.mode == 0)
	LD	A,(FMStatus+5)
	OR	A
	LD	BC,(FMStatus+1)
	LD	DE,100
	CALL	LWRD ?S_MUL_L02
	LD	BC,200
	CALL	LWRD ?US_DIV_L02
	LD	C,16
	PUSH	BC
	LD	A,E
	JR	NZ,?0093
?0092:
; 199.	    {
; 200.	        k = (FMStatus.freq )*100/200;
; 201.	        
; 202.	        ResShowPic(DWNARROW, 11 - 5 + k, 16); //显示箭头
	ADD	A,6
	CALL	LWRD ?0131
	POP	AF
; 203.	        ResShowPic(FQBAR, 0, 24); //显示US频率条
	LD	C,24
	PUSH	BC
	LD	C,0
	LD	DE,167
	JR	?0112
	LD	HL,LWRD ResShowPic
	JR	?0114
	POP	AF
; 204.	    }
; 205.	    else
	JR	?0094
?0093:
; 206.	    {
; 207.	        k = (FMStatus.freq )*100/200;
; 208.	        
; 209.	        ResShowPic(DWNARROW, 30 - 6 + k, 16); //显示箭头
	ADD	A,24
	CALL	LWRD ?0131
	POP	AF
; 210.	        ResShowPic(FQBAR2, 0, 24); //显示JP频率条
	LD	C,24
	PUSH	BC
	LD	C,0
	LD	DE,168
?0112:
	LD	A,BYTE3 ResShowPic
	LD	HL,LWRD ResShowPic
?0114:
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	POP	AF
?0094:
; 211.	    }
; 212.	    UpdateScreen(NULL); //刷新
	LD	DE,0
	CALL	LWRD UpdateScreen
; 213.	}
	LD	SP,IX
	POP	IX
	POP	IY
	POP	DE
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
?0131:
	LD	C,A
	LD	DE,94
?0130:
	LD	A,BYTE3 ResShowPic
	LD	HL,LWRD ResShowPic
	JP	LWRD ?BANK_CALL_DIRECT_L08
; 214.	
	RSEG	CSTR
?0077:
	DEFB	'['
	DEFB	0
?0078:
	DEFB	'CH'
	DEFB	0
?0079:
	DEFB	']'
	DEFB	0
?0082:
	DEFB	'<'
	DEFB	0
?0083:
	DEFB	'FM'
	DEFB	0
?0090:
	DEFB	'.'
	DEFB	0
?0091:
	DEFB	'>'
	DEFB	0
	RSEG	CONST
?0072:
	DEFB	'FM'
	DEFB	0
	DEFB	0
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -