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

📄 ctrlbord.cpp

📁 USB接口虚拟示波器软件软件工程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// CtrlBord.cpp : implementation file
//

#include "stdafx.h"
#include "USBOscillograph.h"
#include "CtrlBord.h"
#include <windows.h>
#include <winioctl.h>
#include <process.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

#include "usb100.h"
#include "usbdi.h"
//#include "ezusbsys.h"

#define MAX_DEVICE_NAME 256
#define PI 3.1415926
#define JK1_OFF 0xb0
#define JK1_ON  0xb1
#define JK2_OFF 0xb2
#define JK2_ON  0xb3
#define JK3_OFF 0xb4
#define JK3_ON  0xb5
#define JK4_OFF 0xb6
#define JK4_ON  0xb7
#define JK5_OFF 0xb8
#define JK5_ON  0xb9
#define JK6_OFF 0xba
#define JK6_ON  0xbb
#define JK7_OFF 0xbc
#define JK7_ON  0xbd
//-----------------------
#define VX_ENABLE_TRANS  0xe0
#define VX_DISABLE_TRANS 0xe1   
 //--Select signal ---------
#define SELECT_AC_USB      0xb0
#define SELECT_DC_USB      0xb1
#define SELECT_SIGNAL_USB  0xb2
#define SELECT_GND_USB     0xb3
//------------------------------
//---select dD-----
#define SELECT_10V_DIV_USB   0xb4
#define SELECT_5V_DIV_USB    0xb5
#define SELECT_2V_DIV_USB    0xb6
#define SELECT_1V_DIV_USB    0xb7
#define SELECT_500mV_DIV_USB 0xb8
#define SELECT_200mV_DIV_USB 0xb9
#define SELECT_100mV_DIV_USB 0xba
#define SELECT_50mV_DIV_USB  0xbb
#define SELECT_20mV_DIV_USB  0xbc
#define SELECT_10mV_DIV_USB  0xbd
#define SELECT_5mV_DIV_USB   0xbe

//2é?ù?μ?êéè??
#define SELECT_FT100M_USB 0xc0
#define SELECT_FT50M_USB  0xc1
#define SELECT_FT20M_USB  0xc2
#define SELECT_FT10M_USB  0xc3
#define SELECT_FT5M_USB   0xc4
#define SELECT_FT2M_USB   0xc5
#define SELECT_FT1M_USB   0xc6
#define PI 3.1415926
#define DISWIDTH  500
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

const float vlots[11]={10000.0, 5000.0, 2000.0, 1000.0, 500.0, 200.0, 100.0, 50.0, 20.0, 10.0, 5.0};
//                  1K    2    5   10    20    50    100    200   500K     1M      2     5 
const float sampleFt[16]={1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0, 200.0, 500.0, 1000.0, 2000.0, 5000.0,
		// 10      20     50         100M	
		10000.0, 20000.0, 50000.0, 100000.0};

 char    DeviceName[MAX_DEVICE_NAME] = "Ezusb-0";  

const BYTE db_ctrl[11]={SELECT_10V_DIV_USB,SELECT_5V_DIV_USB,SELECT_2V_DIV_USB,SELECT_1V_DIV_USB,
                 SELECT_500mV_DIV_USB,SELECT_200mV_DIV_USB,SELECT_100mV_DIV_USB,SELECT_50mV_DIV_USB,
				 SELECT_20mV_DIV_USB,SELECT_10mV_DIV_USB,SELECT_5mV_DIV_USB};

const BYTE Fcount[7]={SELECT_FT100M_USB,SELECT_FT50M_USB,SELECT_FT20M_USB,SELECT_FT10M_USB,SELECT_FT5M_USB,SELECT_FT2M_USB,SELECT_FT1M_USB};
/////////////////////////////////////////////////////////////////////////////
// CCtrlBord
extern unsigned char addata[];
extern unsigned int time_div[];
WORD vv[5];
unsigned char adbuffer[1032];

int vt;
IMPLEMENT_DYNCREATE(CCtrlBord, CFormView)

CCtrlBord::CCtrlBord()
	: CFormView(CCtrlBord::IDD)
{
	//{{AFX_DATA_INIT(CCtrlBord)
	m_TrigeMode = false;
	m_JK1 = FALSE;
	m_JK2 = FALSE;
	m_JK3 = FALSE;
	m_JK4 = FALSE;
	m_JK5 = FALSE;
	m_JK6 = FALSE;
	m_JK7 = FALSE;
	m_single_trige = FALSE;
	m_mes = _T("");
	m_mes2 = _T("");
	m_trig_vlot = 0;
	m_vlot_dis = _T("1.25V");
	m_db10 = FALSE;
	m_db2 = FALSE;
	m_db5 = FALSE;
	//}}AFX_DATA_INIT
	isRun=false;
	send_req=false;
	busy_flag=false;
	
	select_Tdv=13;
	sampleT=1000; //1000ns 1Mhz采样率
	//初始状态1ms/div
	T_div=time_div[select_Tdv]/50;//20000;//ns 1,000,000/50
}

CCtrlBord::~CCtrlBord()
{
}

void CCtrlBord::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCtrlBord)
	DDX_Control(pDX, IDC_CHB, m_select_ch2);
	DDX_Control(pDX, IDC_CHA, m_select_ch1);
	DDX_Control(pDX, IDC_CH1SUBCH2, m_ch1subch2);
	DDX_Control(pDX, IDC_SLIDER_TRIG, m_trig_ctrl);
	DDX_Control(pDX, IDC_COMBO_SELECT_FT, m_FT_comb);
	DDX_Control(pDX, IDC_RUN, m_run_button);
	DDX_Control(pDX, IDC_SIGNAL_TRIG, m_single_trige_button);
	DDX_Control(pDX, IDC_CHECK_TRIGE, m_check_trige_button);
	DDX_Control(pDX, IDC_GND, m_gnd_button);
	DDX_Control(pDX, IDC_DC, m_dc_button);
	DDX_Control(pDX, IDC_AC, m_ac_button);
	DDX_Control(pDX, IDC_CH1ANDCH2, m_ch1_ch2_button);
	DDX_Control(pDX, IDC_CH2, m_ch2_button);
	DDX_Control(pDX, IDC_CH1, m_ch1_button);
	DDX_Control(pDX, IDC_CH2DBCTRL, m_ch2dbCtl);
	DDX_Control(pDX, IDC_DISPLAYWND, m_displayWnd);
	DDX_Control(pDX, IDC_CH1TIMECTRL, m_ch1TimeCtl);
	DDX_Control(pDX, IDC_CH1DBCTRL, m_ch1dbCtl);
	DDX_Check(pDX, IDC_CHECK_TRIGE, m_TrigeMode);
	DDX_Check(pDX, IDC_JK1, m_JK1);
	DDX_Check(pDX, IDC_JK2, m_JK2);
	DDX_Check(pDX, IDC_JK3, m_JK3);
	DDX_Check(pDX, IDC_JK4, m_JK4);
	DDX_Check(pDX, IDC_JK5, m_JK5);
	DDX_Check(pDX, IDC_JK6, m_JK6);
	DDX_Check(pDX, IDC_JK7, m_JK7);
	DDX_Check(pDX, IDC_SIGNAL_TRIG, m_single_trige);
	DDX_Control(pDX, IDC_MSCOMM, m_ComPort);
	DDX_Text(pDX, IDC_EDIT1, m_mes);
	DDX_Text(pDX, IDC_EDIT2, m_mes2);
	DDX_Slider(pDX, IDC_SLIDER_TRIG, m_trig_vlot);
	DDX_Text(pDX, IDC_VLOT_DIS, m_vlot_dis);
	DDX_Check(pDX, IDC_DB10, m_db10);
	DDX_Check(pDX, IDC_DB2, m_db2);
	DDX_Check(pDX, IDC_DB5, m_db5);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCtrlBord, CFormView)
	//{{AFX_MSG_MAP(CCtrlBord)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_CH1, OnCh1)
	ON_BN_CLICKED(IDC_CH2, OnCh2)
	ON_BN_CLICKED(IDC_CH1ANDCH2, OnCh1andch2)
	ON_BN_CLICKED(IDC_RUN, OnRun)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_BN_CLICKED(IDC_CH1DBCTRL, OnCh1dbctrl)
	ON_BN_CLICKED(IDC_CH1TIMECTRL, OnCh1timectrl)
	ON_BN_CLICKED(IDC_CHECK_TRIGE, OnCheckTrige)
	ON_BN_CLICKED(IDC_SCALELINE, OnScaleline)
	ON_BN_CLICKED(IDC_SAVE, OnSave)
	ON_BN_CLICKED(IDC_SIGNAL_TRIG, OnSignalTrig)
	ON_BN_CLICKED(IDC_AC, OnAc)
	ON_BN_CLICKED(IDC_DC, OnDc)
	ON_BN_CLICKED(IDC_GND, OnGnd)
	ON_CBN_SELCHANGE(IDC_COMBO_SELECT_FT, OnSelchangeComboSelectFt)
	ON_BN_CLICKED(IDC_KEY_UP, OnKeyUp)
	ON_BN_CLICKED(IDC_KEY_LEFT, OnKeyLeft)
	ON_BN_CLICKED(IDC_KEY_RIGHT, OnKeyRight)
	ON_BN_CLICKED(IDC_KEY_DOWN, OnKeyDown)
	ON_BN_CLICKED(IDC_KEY_OK, OnKeyOk)
	ON_BN_CLICKED(IDC_KEY_EXIT, OnKeyExit)
	ON_BN_CLICKED(IDC_OFF, OnOff)
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_JK1, OnJk1)
	ON_BN_CLICKED(IDC_JK2, OnJk2)
	ON_BN_CLICKED(IDC_JK3, OnJk3)
	ON_BN_CLICKED(IDC_JK4, OnJk4)
	ON_BN_CLICKED(IDC_DB10, OnDb10)
	ON_BN_CLICKED(IDC_DB2, OnDb2)
	ON_BN_CLICKED(IDC_DB5, OnDb5)
	ON_BN_CLICKED(IDC_CH1ANDCH3, OnCh1andch3)
	ON_BN_CLICKED(IDC_CH1SUBCH2, OnCh1subch2)
	ON_BN_CLICKED(IDC_CHA, OnCha)
	ON_BN_CLICKED(IDC_CHB, OnChb)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCtrlBord diagnostics

#ifdef _DEBUG
void CCtrlBord::AssertValid() const
{
	CFormView::AssertValid();
}

void CCtrlBord::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCtrlBord message handlers
/*
0  50ns/div : 50ns/50=1ns  500*1=500ns  50Mhz 1024*20ns=20480ns 40   使用插值算法 屏数据

1  0.1us/div: 100ns/50=2ns 500*2=1,000ns 50Mhz 1024*20ns=20480ns 20  使用插值算法

2  0.2us/div: 200/50=4ns   500*4=2,000ns  50Mhz      20480/2000 =10  使用插值算法

3  0.5us/div: 500/50=10ns  500*10=5,000ns 50Mhz      20480/5000 =4   使用插值算法

4  1us/div:   1,000/50=20ns 500*20=10,000ns 50Mhz   0  20480/10000=2 不使用插值算法

5  2us/div:   2,000/50=40ns 500*40=20,000ns 50Mhz   1 1024*40ns=40960ns 2屏数据  

6  5us/div:   5,000/50=100ns 500*100=50,000ns 5  10Mhz  0  1024*100ns=102400 /50000=2屏数据

7  10us/div:  10,000/50=200ns 500*200=100,000ns  5Mhz  0   1024*200/100000=2 

8  20us/div:  20,000/50=400ns 500*400=200,000ns  5Mhz  1   采集1024*2数据在显示 显示2屏数据

9  50us/div:  50,000/50=1,000ns 500*1000=500,000ns 1Mhz 0 1024*1000=1024000 2 屏数据

10 0.1ms/div: 100,000/50=2,000ns 500*2000=  1,000,000ns 1Mhz 1 采集1024*  隔2取一点 数据显示2屏数据 2048000ns/1000000 =2ms 500hz

11 0.2ms/div: 200,000/50=4,000ns 500*4000=  2,000,000ns 1Mhz  3 采集1024* 隔4取一点 数据显示2屏数据 4096000ns/1000000 =4ms 200hz

12 0.5ms/div: 500,000/50=10,000ns 500*10,000= 5,000,000 ns 1Mhz 9 采集1024* 隔10取一点 数据显示2屏数据 10240000ns/ 1000000=10ms 100hz

13 1ms/div:   1,000,000/50=20,000ns 500*20,000=10,000,000 ns 1Mhz 19 采集1024* 隔20点取一点 数据显示2屏数据 20480000/1000000=20ms 50hz

14 2ms/div:   2,000,000/50=40,000ns 500*40,000=20,000,000 ns 1Mhz 采集1024*     隔40点取一点 数据显示2屏数据 40960000/1000000=40ms 25hz

15 5ms/div:   5,000,000/50=100,000ns 500*100,000= 50,000,000ns 1Mhz 采集1024*   隔100点取一点 数据显示2屏数据  100ms驱动 显示方式为滚动模式

16 10ms/div:  10,000,000/50=200,000ns 500*200,000=100,000,000NS 1Mhz 采集1024*  隔200点取一点 数据现实  200ms驱动 显示方式为滚动模式

17 20ms/div:  20,000,000/50=400,000ns  ------------------------- 1Mhz 采集 隔400点取一点

18 50ms/div:  50,000,000/50=1000,000ns                          1Mhz 采集 隔1000点取一点
*/

int CCtrlBord::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_ch1TimeCtl.SetSwitchNumber (19);
	m_ch1TimeCtl.SetDisString ("50ns 0.1us 0.2 0.5 1us 2 5 10 20 50us 0.1ms 0.2 0.5 1ms 2 5 10 20 50ms");
	m_ch1TimeCtl.SetSwitchName("Time/Div");
	m_ch1TimeCtl.SetStartSwitch(13);
	//m_RoundCtrl.SetBKColor (RGB(51,102,153));
	m_ch1TimeCtl.SetTextColor (RGB(0,0,0));

	//	m_ch2TimeCtl.SetSwitchNumber (5);
	//	m_ch2TimeCtl.SetDisString (" 0.1us 0.2us 0.3us 0.4us 0.5us  ");
	//	m_ch2TimeCtl.SetSwitchName("时间常数");
	//	m_ch2TimeCtl.SetStartSwitch(2);
	//  m_RoundCtrl.SetBKColor (RGB(51,102,153));
	//	m_ch2TimeCtl.SetTextColor (RGB(255,0,0));
	//  m_RoundCtrl.SetLineColor (RGB(255,255,255));

	m_ch1dbCtl.SetSwitchNumber (10);
	//m_FT_comb.SetWindowText("5M");
	//	10V/Div   5X10V=50V    -->衰减100倍=500mV  500/500=1 放大系数 1dB
	//	5V/Div    5X5V=25V     -->衰减100倍=250mV  500/250=2 放大系数 2dB
    //	2V/Div    5X2V=10V     -->衰减100倍=100mV  500/100=5 放大系数 5dB
    //	1V/Div    5X1v=5V      -->衰减100倍=50mV   500/50=10 -------->10dB
	//	0.5V/Div  5X0.5V=2.5V  -->衰减100倍=25mV   500/25=20 -------->20dB
	//	0.2V/Div  5X0.2V=1V    -->衰减100倍=10mV   500/10=50 ------->50dB
	//	0.1V/Div  5X0.1V=500mV                     500/500=1 ------->1dB
	//	50mV/Div  5X50mV=250mV                     500/250=2 ------->2dB 
    //	20mV/Div  5X20mV=100mV                     500/100=5 ------->5dB
	//	10mV/Div  5X10mV=50mV                      500/50=10 ------->10dB
	//	5mV/Div   5X5mV=25mV                       500/25=20 ------->20dB
	
	m_ch1dbCtl.SetDisString ("10V 5V 2 1 0.5 0.2 0.1V 50mV 20 10 5mV");
	m_ch1dbCtl.SetSwitchName("CH1 Volts / Div");
	m_ch1dbCtl.SetTextColor (RGB(0,0,0));	
	m_ch1dbCtl.SetStartSwitch(1);
	

	m_ch2dbCtl.SetSwitchNumber (10);
	m_ch2dbCtl.SetDisString ("10V 5V 2 1 0.5 0.2 0.1V 50mV 20 10 5mV");
	m_ch2dbCtl.SetSwitchName("CH2 Volts / Div");
	m_ch2dbCtl.SetTextColor (RGB(0,0,0));	
	m_ch2dbCtl.SetStartSwitch(1);


// m_select_ch1.SetCheck(1);
//	m_ch2dbCtl.SetSwitchNumber (6);
//	m_ch2dbCtl.SetDisString (" 1mV 2mV 3mV 4mV 5mV 6mV 7mV ");
//	m_ch2dbCtl.SetSwitchName("电压幅度");
//	m_ch2dbCtl.SetTextColor (RGB(0,0,255));	
	return 0;
}

void CCtrlBord::OnCh1() 
{

m_ch2_button.SetCheck(0);
m_ch1_ch2_button.SetCheck(0);

}

void CCtrlBord::OnCh2() 
{


 //	m_displayWnd.Caiyang=1;
 //      m_displayWnd.comEventStart.SetEvent();
m_ch1_button.SetCheck(0);
m_ch1_ch2_button.SetCheck(0);

}

void CCtrlBord::OnCh1andch2() 
{
m_ch1_button.SetCheck(0);
m_ch2_button.SetCheck(0);
	
}

void CCtrlBord::OnRun() 
{//unsigned char c;
if(!isRun)	
{  isRun=true;
   code[0]='C';   //开始采集数据
	m_run_button.SetWindowText("停止");
 //  while(busy_flag);
	SendMessageToCom(code,5);  
 
}
else
{
    code[0]='E';  //暂停采集
    isRun=false;
	m_run_button.SetWindowText("运行");
	
}

//	SendMessageToCom(code,5);  


}

void CCtrlBord::OnStop() 
{
//	m_displayWnd.Caiyang=false;	
 //unsigned  char c='O';
 // SendMessageToCom(&c,1);

 //   isRun=false;

}

void CCtrlBord::OnCh1dbctrl() 
{  //10V 5V 2 1 0.5 0.2 0.1V 50mV 20 10 5mV

}
/*
0  50ns/div : 50ns/50=1ns  500*1=500ns  50Mhz 1024*20ns=20480ns 40   使用插值算法 屏数据

1  0.1us/div: 100ns/50=2ns 500*2=1,000ns 50Mhz 1024*20ns=20480ns 20  使用插值算法

2  0.2us/div: 200/50=4ns   500*4=2,000ns  50Mhz      20480/2000 =10  使用插值算法

3  0.5us/div: 500/50=10ns  500*10=5,000ns 50Mhz      20480/5000 =4   使用插值算法

4  1us/div:   1,000/50=20ns 500*20=10,000ns 50Mhz   0  20480/10000=2 不使用插值算法

5  2us/div:   2,000/50=40ns 500*40=20,000ns 50Mhz   1 1024*40ns=40960ns 2屏数据  

6  5us/div:   5,000/50=100ns 500*100=50,000ns 5  10Mhz  0  1024*100ns=102400 /50000=2屏数据

7  10us/div:  10,000/50=200ns 500*200=100,000ns  5Mhz  0   1024*200/100000=2 

8  20us/div:  20,000/50=400ns 500*400=200,000ns  5Mhz  1   采集1024*2数据在显示 显示2屏数据

9  50us/div:  50,000/50=1,000ns 500*1000=500,000ns 1Mhz 0 1024*1000=1024000 2 屏数据

10 0.1ms/div: 100,000/50=2,000ns 500*2000=  1,000,000ns 1Mhz 1 采集1024*  隔2取一点 数据显示2屏数据 2048000ns/1000000 =2ms 500hz

11 0.2ms/div: 200,000/50=4,000ns 500*4000=  2,000,000ns 1Mhz  3 采集1024* 隔4取一点 数据显示2屏数据 4096000ns/1000000 =4ms 200hz

12 0.5ms/div: 500,000/50=10,000ns 500*10,000= 5,000,000 ns 1Mhz 9 采集1024* 隔10取一点 数据显示2屏数据 10240000ns/ 1000000=10ms 100hz

13 1ms/div:   1,000,000/50=20,000ns 500*20,000=10,000,000 ns 1Mhz 19 采集1024* 隔20点取一点 数据显示2屏数据 20480000/1000000=20ms 50hz

14 2ms/div:   2,000,000/50=40,000ns 500*40,000=20,000,000 ns 1Mhz 采集1024*     隔40点取一点 数据显示2屏数据 40960000/1000000=40ms 25hz

15 5ms/div:   5,000,000/50=100,000ns 500*100,000= 50,000,000ns 1Mhz 采集1024*   隔100点取一点 数据显示2屏数据  100ms驱动 显示方式为滚动模式

16 10ms/div:  10,000,000/50=200,000ns 500*200,000=100,000,000NS 1Mhz 采集1024*  隔200点取一点 数据现实  200ms驱动 显示方式为滚动模式

17 20ms/div:  20,000,000/50=400,000ns  ------------------------- 1Mhz 采集 隔400点取一点

18 50ms/div:  50,000,000/50=1000,000ns                          1Mhz 采集 隔1000点取一点
*/


void CCtrlBord::OnCh1timectrl() 
{
   select_Tdv=m_ch1TimeCtl.GetSelectSwitch();
    code[0]='E';
   switch(select_Tdv)
   {case 0:
    case 1:
    case 2:
	case 4:
    code[1]=0; //选择50M采样率
	code[2]=0; //隔0点取样
	sampleT =20 ;//ns
	break;
	case 5:
	code[1]=0; //选择50M采样率
	code[2]=1; //隔2点取样
	sampleT =20 ;//ns
	break;
	case 6:
		code[1]=2;//选择10M采样率
		code[2]=0;
		sampleT =100 ;//ns
		break;
	case 7:
		code[1]=3; //选择5M采样率
		code[2]=0;
		sampleT =200 ;//ns
        break;
	case 8:
		code[1]=3;//选择5M采样率
		code[2]=1; //隔2点取样
		sampleT =200 ;//ns
		break;
	case 9:
		code[1]=4;//选择1M采样率
		code[2]=0;
		sampleT =1000 ;//ns
		break;
	case 10:
		code[1]=4;
		code[2]=1;
		sampleT =1000 ;//ns
		break;
	case 11:
		code[1]=4;
		code[2]=3;//隔4点取样
		sampleT =1000 ;//ns
        break;
	case 12:
		code[1]=4;
		code[2]=9;//隔10点取样
		sampleT =1000 ;//ns
		break;
	case 13:
		code[1]=4;
		code[2]=19;//隔20点取样
		sampleT =1000 ;//ns
        break;
	case 14:
		code[1]=4;
		code[2]=39;//隔40点取样
		sampleT =1000 ;//ns
		break;
	case 15:
		code[1]=4;
		code[2]=99;
		sampleT =1000 ;//ns
		break;
	case 16:
		code[1]=4;
		code[2]=199;
		sampleT =1000 ;//ns
		break;
	case 17:
	case 18:
		code[1]=4;
		code[2]=0;
		sampleT =1000 ;//ns
		break;
	default:
	    code[1]=4;
		code[2]=19;
		sampleT =1000 ;//ns
		break;


   }
    
   m_displayWnd.tdv =select_Tdv;
   T_div=time_div[select_Tdv]/50;
 
   if(!isRun)
   { SendMessageToCom(code,5);  

⌨️ 快捷键说明

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