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

📄 lcm1602.lst

📁 WINAVR编写的PS2键盘驱动
💻 LST
📖 第 1 页 / 共 5 页
字号:
   1               		.file	"lcm1602.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  74               	.global	LCM1602Init
  76               	LCM1602Init:
   1:lcm1602.c     **** /*---------------------------------------------------------
   2:lcm1602.c     ****  *Filename:lcm1602.c
   3:lcm1602.c     ****  *Function:lcm1602液晶的显示通用程序,包括闪烁显示,移位循环显示
   4:lcm1602.c     ****  *Author:ken
   5:lcm1602.c     ****  *Date:2007-8-18
   6:lcm1602.c     **** ----------------------------------------------------------*/
   7:lcm1602.c     **** #include <avr/io.h>
   8:lcm1602.c     **** #include <util/delay.h>
   9:lcm1602.c     **** #include "lcm1602.h"
  10:lcm1602.c     **** #include "type.h"
  11:lcm1602.c     **** 
  12:lcm1602.c     **** //1602液晶端口宏定义
  13:lcm1602.c     **** #define RS_PIN  PD4   //数据/命令选择端,低时是命令,高时是数据
  14:lcm1602.c     **** #define RS_DDR  DDRD
  15:lcm1602.c     **** #define RS_PORT PORTD
  16:lcm1602.c     **** 
  17:lcm1602.c     **** #define RW_PIN  PD5   //读/写选择端,低时是写,高时是读
  18:lcm1602.c     **** #define RW_DDR  DDRD
  19:lcm1602.c     **** #define RW_PORT PORTD
  20:lcm1602.c     **** 
  21:lcm1602.c     **** #define E_PIN   PD7    //使能信号(高脉冲使能)
  22:lcm1602.c     **** #define E_DDR   DDRD
  23:lcm1602.c     **** #define E_PORT  PORTD
  24:lcm1602.c     **** //数据端口宏定义
  25:lcm1602.c     **** #define DB_PORT PORTB
  26:lcm1602.c     **** #define DB_DDR  DDRB
  27:lcm1602.c     **** #define DB_PIN  PINB
  28:lcm1602.c     **** 
  29:lcm1602.c     **** //no need to be modify 
  30:lcm1602.c     **** #define RS_CLR  (RS_PORT&=~(1<<RS_PIN))
  31:lcm1602.c     **** #define RS_SET  (RS_PORT|=(1<<RS_PIN))
  32:lcm1602.c     **** 
  33:lcm1602.c     **** #define RW_CLR  (RW_PORT&=~(1<<RW_PIN))
  34:lcm1602.c     **** #define RW_SET	(RW_PORT|=(1<<RW_PIN))
  35:lcm1602.c     **** 
  36:lcm1602.c     **** #define E_CLR   (E_PORT&=~(1<<E_PIN))
  37:lcm1602.c     **** #define E_SET	  (E_PORT|=(1<<E_PIN))
  38:lcm1602.c     **** 
  39:lcm1602.c     **** #define DB_IN   (DB_DDR=0)
  40:lcm1602.c     **** #define DB_OUT  (DB_DDR=0xff)
  41:lcm1602.c     **** #define DB_READ (DB_PIN)
  42:lcm1602.c     **** 
  43:lcm1602.c     **** //1602液晶的坐标
  44:lcm1602.c     **** #define XSIZE  16
  45:lcm1602.c     **** #define YSIZE   2
  46:lcm1602.c     **** 
  47:lcm1602.c     **** #ifndef NULL
  48:lcm1602.c     **** #define NULL  0
  49:lcm1602.c     **** #endif 
  50:lcm1602.c     **** 
  51:lcm1602.c     **** 
  52:lcm1602.c     **** /*----------------------------------------------------------------------------------------------
  53:lcm1602.c     **** ------------------------------------------------------------------------------------------------
  54:lcm1602.c     **** 带背光的液晶模块TC1602A采用标准的16脚接口,其引脚功能如下:
  55:lcm1602.c     ****   第1脚:VSS为电源地,接GND。
  56:lcm1602.c     ****   第2脚:VDD接5V正电源。
  57:lcm1602.c     ****   第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产
  58:lcm1602.c     ****            使用时可以通过一个10K的电位器调整对比度。
  59:lcm1602.c     ****   第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  60:lcm1602.c     ****   第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
  61:lcm1602.c     ****            当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当
  62:lcm1602.c     ****   第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  63:lcm1602.c     ****   第7~14脚:D0~D7为8位双向数据线。
  64:lcm1602.c     ****   第15脚:BLA背光电源正极(+5V)输入引脚。
  65:lcm1602.c     ****   第16脚:BLK背光电源负极,接GND。  
  66:lcm1602.c     **** ----------------------------------------------------------------------------------------------
  67:lcm1602.c     **** ------------------------------------------------------------------------------------------ */
  68:lcm1602.c     **** 
  69:lcm1602.c     **** //1602液晶初始化
  70:lcm1602.c     **** void LCM1602Init(void )
  71:lcm1602.c     **** {
  78               	.LM1:
  79               	/* prologue: frame size=12 */
  80 0000 CF93      		push r28
  81 0002 DF93      		push r29
  82 0004 CDB7      		in r28,__SP_L__
  83 0006 DEB7      		in r29,__SP_H__
  84 0008 2C97      		sbiw r28,12
  85 000a 0FB6      		in __tmp_reg__,__SREG__
  86 000c F894      		cli
  87 000e DEBF      		out __SP_H__,r29
  88 0010 0FBE      		out __SREG__,__tmp_reg__
  89 0012 CDBF      		out __SP_L__,r28
  90               	/* prologue end (size=10) */
  72:lcm1602.c     **** 	RS_DDR|=(1<<RS_PIN);    
  92               	.LM2:
  93 0014 8091 3100 		lds r24,49
  94 0018 8061      		ori r24,lo8(16)
  95 001a 8093 3100 		sts 49,r24
  73:lcm1602.c     **** 	RW_DDR|=(1<<RW_PIN);   
  97               	.LM3:
  98 001e 8091 3100 		lds r24,49
  99 0022 8062      		ori r24,lo8(32)
 100 0024 8093 3100 		sts 49,r24
  74:lcm1602.c     **** 	E_DDR|=(1<<E_PIN);     
 102               	.LM4:
 103 0028 8091 3100 		lds r24,49
 104 002c 8068      		ori r24,lo8(-128)
 105 002e 8093 3100 		sts 49,r24
  75:lcm1602.c     **** 	DB_OUT;                          //PB设为输出
 107               	.LM5:
 108 0032 8FEF      		ldi r24,lo8(-1)
 109 0034 8093 3700 		sts 55,r24
  76:lcm1602.c     **** 	DB_PORT = 0x00;
 111               	.LM6:
 112 0038 1092 3800 		sts 56,__zero_reg__
 113               	.LBB2:
 115               	.Ltext1:
   1:C:/WinAVR/avr/include/util/delay.h **** /* Copyright (c) 2002, Marek Michalkiewicz
   2:C:/WinAVR/avr/include/util/delay.h ****    Copyright (c) 2004,2005 Joerg Wunsch
   3:C:/WinAVR/avr/include/util/delay.h ****    All rights reserved.
   4:C:/WinAVR/avr/include/util/delay.h **** 
   5:C:/WinAVR/avr/include/util/delay.h ****    Redistribution and use in source and binary forms, with or without
   6:C:/WinAVR/avr/include/util/delay.h ****    modification, are permitted provided that the following conditions are met:
   7:C:/WinAVR/avr/include/util/delay.h **** 
   8:C:/WinAVR/avr/include/util/delay.h ****    * Redistributions of source code must retain the above copyright
   9:C:/WinAVR/avr/include/util/delay.h ****      notice, this list of conditions and the following disclaimer.
  10:C:/WinAVR/avr/include/util/delay.h **** 
  11:C:/WinAVR/avr/include/util/delay.h ****    * Redistributions in binary form must reproduce the above copyright
  12:C:/WinAVR/avr/include/util/delay.h ****      notice, this list of conditions and the following disclaimer in
  13:C:/WinAVR/avr/include/util/delay.h ****      the documentation and/or other materials provided with the
  14:C:/WinAVR/avr/include/util/delay.h ****      distribution.
  15:C:/WinAVR/avr/include/util/delay.h **** 
  16:C:/WinAVR/avr/include/util/delay.h ****    * Neither the name of the copyright holders nor the names of
  17:C:/WinAVR/avr/include/util/delay.h ****      contributors may be used to endorse or promote products derived
  18:C:/WinAVR/avr/include/util/delay.h ****      from this software without specific prior written permission.
  19:C:/WinAVR/avr/include/util/delay.h **** 
  20:C:/WinAVR/avr/include/util/delay.h ****   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21:C:/WinAVR/avr/include/util/delay.h ****   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22:C:/WinAVR/avr/include/util/delay.h ****   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23:C:/WinAVR/avr/include/util/delay.h ****   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  24:C:/WinAVR/avr/include/util/delay.h ****   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25:C:/WinAVR/avr/include/util/delay.h ****   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26:C:/WinAVR/avr/include/util/delay.h ****   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27:C:/WinAVR/avr/include/util/delay.h ****   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28:C:/WinAVR/avr/include/util/delay.h ****   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29:C:/WinAVR/avr/include/util/delay.h ****   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30:C:/WinAVR/avr/include/util/delay.h ****   POSSIBILITY OF SUCH DAMAGE. */
  31:C:/WinAVR/avr/include/util/delay.h **** 
  32:C:/WinAVR/avr/include/util/delay.h **** /* $Id: delay.h,v 1.1.2.1 2005/12/12 23:19:49 joerg_wunsch Exp $ */
  33:C:/WinAVR/avr/include/util/delay.h **** 
  34:C:/WinAVR/avr/include/util/delay.h **** #ifndef _UTIL_DELAY_H_
  35:C:/WinAVR/avr/include/util/delay.h **** #define _UTIL_DELAY_H_ 1
  36:C:/WinAVR/avr/include/util/delay.h **** 
  37:C:/WinAVR/avr/include/util/delay.h **** #include <inttypes.h>
  38:C:/WinAVR/avr/include/util/delay.h **** 
  39:C:/WinAVR/avr/include/util/delay.h **** /** \defgroup util_delay <util/delay.h>: Busy-wait delay loops
  40:C:/WinAVR/avr/include/util/delay.h ****     \code
  41:C:/WinAVR/avr/include/util/delay.h ****     #define F_CPU 1000000UL  // 1 MHz
  42:C:/WinAVR/avr/include/util/delay.h ****     //#define F_CPU 14.7456E6
  43:C:/WinAVR/avr/include/util/delay.h ****     #include <util/delay.h>
  44:C:/WinAVR/avr/include/util/delay.h ****     \endcode
  45:C:/WinAVR/avr/include/util/delay.h **** 
  46:C:/WinAVR/avr/include/util/delay.h ****     \note As an alternative method, it is possible to pass the
  47:C:/WinAVR/avr/include/util/delay.h ****     F_CPU macro down to the compiler from the Makefile.
  48:C:/WinAVR/avr/include/util/delay.h ****     Obviously, in that case, no \c \#define statement should be
  49:C:/WinAVR/avr/include/util/delay.h ****     used.
  50:C:/WinAVR/avr/include/util/delay.h **** 
  51:C:/WinAVR/avr/include/util/delay.h ****     The functions in this header file implement simple delay loops
  52:C:/WinAVR/avr/include/util/delay.h ****     that perform a busy-waiting.  They are typically used to
  53:C:/WinAVR/avr/include/util/delay.h ****     facilitate short delays in the program execution.  They are
  54:C:/WinAVR/avr/include/util/delay.h ****     implemented as count-down loops with a well-known CPU cycle
  55:C:/WinAVR/avr/include/util/delay.h ****     count per loop iteration.  As such, no other processing can
  56:C:/WinAVR/avr/include/util/delay.h ****     occur simultaneously.  It should be kept in mind that the
  57:C:/WinAVR/avr/include/util/delay.h ****     functions described here do not disable interrupts.
  58:C:/WinAVR/avr/include/util/delay.h **** 
  59:C:/WinAVR/avr/include/util/delay.h ****     In general, for long delays, the use of hardware timers is
  60:C:/WinAVR/avr/include/util/delay.h ****     much preferrable, as they free the CPU, and allow for
  61:C:/WinAVR/avr/include/util/delay.h ****     concurrent processing of other events while the timer is
  62:C:/WinAVR/avr/include/util/delay.h ****     running.  However, in particular for very short delays, the
  63:C:/WinAVR/avr/include/util/delay.h ****     overhead of setting up a hardware timer is too much compared
  64:C:/WinAVR/avr/include/util/delay.h ****     to the overall delay time.
  65:C:/WinAVR/avr/include/util/delay.h **** 
  66:C:/WinAVR/avr/include/util/delay.h ****     Two inline functions are provided for the actual delay algorithms.
  67:C:/WinAVR/avr/include/util/delay.h **** 
  68:C:/WinAVR/avr/include/util/delay.h ****     Two wrapper functions allow the specification of microsecond, and
  69:C:/WinAVR/avr/include/util/delay.h ****     millisecond delays directly, using the application-supplied macro
  70:C:/WinAVR/avr/include/util/delay.h ****     F_CPU as the CPU clock frequency (in Hertz).  These functions
  71:C:/WinAVR/avr/include/util/delay.h ****     operate on double typed arguments, however when optimization is
  72:C:/WinAVR/avr/include/util/delay.h ****     turned on, the entire floating-point calculation will be done at
  73:C:/WinAVR/avr/include/util/delay.h ****     compile-time.
  74:C:/WinAVR/avr/include/util/delay.h **** 
  75:C:/WinAVR/avr/include/util/delay.h ****     \note When using _delay_us() and _delay_ms(), the expressions
  76:C:/WinAVR/avr/include/util/delay.h ****     passed as arguments to these functions shall be compile-time
  77:C:/WinAVR/avr/include/util/delay.h ****     constants, otherwise the floating-point calculations to setup the
  78:C:/WinAVR/avr/include/util/delay.h ****     loops will be done at run-time, thereby drastically increasing
  79:C:/WinAVR/avr/include/util/delay.h ****     both the resulting code size, as well as the time required to
  80:C:/WinAVR/avr/include/util/delay.h ****     setup the loops.
  81:C:/WinAVR/avr/include/util/delay.h **** */
  82:C:/WinAVR/avr/include/util/delay.h **** 
  83:C:/WinAVR/avr/include/util/delay.h **** #if !defined(__DOXYGEN__)
  84:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline));
  85:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline));
  86:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_us(double __us) __attribute__((always_inline));
  87:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_ms(double __ms) __attribute__((always_inline));
  88:C:/WinAVR/avr/include/util/delay.h **** #endif
  89:C:/WinAVR/avr/include/util/delay.h **** 
  90:C:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
  91:C:/WinAVR/avr/include/util/delay.h **** 
  92:C:/WinAVR/avr/include/util/delay.h ****     Delay loop using an 8-bit counter \c __count, so up to 256
  93:C:/WinAVR/avr/include/util/delay.h ****     iterations are possible.  (The value 256 would have to be passed
  94:C:/WinAVR/avr/include/util/delay.h ****     as 0.)  The loop executes three CPU cycles per iteration, not
  95:C:/WinAVR/avr/include/util/delay.h ****     including the overhead the compiler needs to setup the counter
  96:C:/WinAVR/avr/include/util/delay.h ****     register.
  97:C:/WinAVR/avr/include/util/delay.h **** 
  98:C:/WinAVR/avr/include/util/delay.h ****     Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
  99:C:/WinAVR/avr/include/util/delay.h ****     can be achieved.
 100:C:/WinAVR/avr/include/util/delay.h **** */
 101:C:/WinAVR/avr/include/util/delay.h **** void
 102:C:/WinAVR/avr/include/util/delay.h **** _delay_loop_1(uint8_t __count)
 103:C:/WinAVR/avr/include/util/delay.h **** {
 104:C:/WinAVR/avr/include/util/delay.h **** 	__asm__ volatile (
 105:C:/WinAVR/avr/include/util/delay.h **** 		"1: dec %0" "\n\t"
 106:C:/WinAVR/avr/include/util/delay.h **** 		"brne 1b"
 107:C:/WinAVR/avr/include/util/delay.h **** 		: "=r" (__count)
 108:C:/WinAVR/avr/include/util/delay.h **** 		: "0" (__count)
 109:C:/WinAVR/avr/include/util/delay.h **** 	);
 110:C:/WinAVR/avr/include/util/delay.h **** }
 111:C:/WinAVR/avr/include/util/delay.h **** 
 112:C:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
 113:C:/WinAVR/avr/include/util/delay.h **** 
 114:C:/WinAVR/avr/include/util/delay.h ****     Delay loop using a 16-bit counter \c __count, so up to 65536
 115:C:/WinAVR/avr/include/util/delay.h ****     iterations are possible.  (The value 65536 would have to be
 116:C:/WinAVR/avr/include/util/delay.h ****     passed as 0.)  The loop executes four CPU cycles per iteration,
 117:C:/WinAVR/avr/include/util/delay.h ****     not including the overhead the compiler requires to setup the
 118:C:/WinAVR/avr/include/util/delay.h ****     counter register pair.
 119:C:/WinAVR/avr/include/util/delay.h **** 
 120:C:/WinAVR/avr/include/util/delay.h ****     Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
 121:C:/WinAVR/avr/include/util/delay.h ****     milliseconds can be achieved.
 122:C:/WinAVR/avr/include/util/delay.h ****  */
 123:C:/WinAVR/avr/include/util/delay.h **** void
 124:C:/WinAVR/avr/include/util/delay.h **** _delay_loop_2(uint16_t __count)
 125:C:/WinAVR/avr/include/util/delay.h **** {
 126:C:/WinAVR/avr/include/util/delay.h **** 	__asm__ volatile (
 127:C:/WinAVR/avr/include/util/delay.h **** 		"1: sbiw %0,1" "\n\t"
 128:C:/WinAVR/avr/include/util/delay.h **** 		"brne 1b"
 129:C:/WinAVR/avr/include/util/delay.h **** 		: "=w" (__count)
 130:C:/WinAVR/avr/include/util/delay.h **** 		: "0" (__count)
 131:C:/WinAVR/avr/include/util/delay.h **** 	);
 132:C:/WinAVR/avr/include/util/delay.h **** }
 133:C:/WinAVR/avr/include/util/delay.h **** 
 134:C:/WinAVR/avr/include/util/delay.h **** #ifndef F_CPU
 135:C:/WinAVR/avr/include/util/delay.h **** /* prevent compiler error by supplying a default */
 136:C:/WinAVR/avr/include/util/delay.h **** # warning "F_CPU not defined for <util/delay.h>"
 137:C:/WinAVR/avr/include/util/delay.h **** # define F_CPU 1000000UL
 138:C:/WinAVR/avr/include/util/delay.h **** #endif
 139:C:/WinAVR/avr/include/util/delay.h **** 
 140:C:/WinAVR/avr/include/util/delay.h **** /**
 141:C:/WinAVR/avr/include/util/delay.h ****    \ingroup util_delay
 142:C:/WinAVR/avr/include/util/delay.h **** 
 143:C:/WinAVR/avr/include/util/delay.h ****    Perform a delay of \c __us microseconds, using _delay_loop_1().
 144:C:/WinAVR/avr/include/util/delay.h **** 
 145:C:/WinAVR/avr/include/util/delay.h ****    The macro F_CPU is supposed to be defined to a
 146:C:/WinAVR/avr/include/util/delay.h ****    constant defining the CPU clock frequency (in Hertz).
 147:C:/WinAVR/avr/include/util/delay.h **** 
 148:C:/WinAVR/avr/include/util/delay.h ****    The maximal possible delay is 768 us / F_CPU in MHz.
 149:C:/WinAVR/avr/include/util/delay.h ****  */
 150:C:/WinAVR/avr/include/util/delay.h **** void
 151:C:/WinAVR/avr/include/util/delay.h **** _delay_us(double __us)
 152:C:/WinAVR/avr/include/util/delay.h **** {
 153:C:/WinAVR/avr/include/util/delay.h **** 	uint8_t __ticks;
 154:C:/WinAVR/avr/include/util/delay.h **** 	double __tmp = ((F_CPU) / 3e6) * __us;
 155:C:/WinAVR/avr/include/util/delay.h **** 	if (__tmp < 1.0)
 156:C:/WinAVR/avr/include/util/delay.h **** 		__ticks = 1;
 157:C:/WinAVR/avr/include/util/delay.h **** 	else if (__tmp > 255)
 158:C:/WinAVR/avr/include/util/delay.h **** 		__ticks = 0;	/* i.e. 256 */
 159:C:/WinAVR/avr/include/util/delay.h **** 	else
 160:C:/WinAVR/avr/include/util/delay.h **** 		__ticks = (uint8_t)__tmp;
 161:C:/WinAVR/avr/include/util/delay.h **** 	_delay_loop_1(__ticks);
 162:C:/WinAVR/avr/include/util/delay.h **** }
 163:C:/WinAVR/avr/include/util/delay.h **** 
 164:C:/WinAVR/avr/include/util/delay.h **** 
 165:C:/WinAVR/avr/include/util/delay.h **** /**
 166:C:/WinAVR/avr/include/util/delay.h ****    \ingroup util_delay
 167:C:/WinAVR/avr/include/util/delay.h **** 
 168:C:/WinAVR/avr/include/util/delay.h ****    Perform a delay of \c __ms milliseconds, using _delay_loop_2().
 169:C:/WinAVR/avr/include/util/delay.h **** 
 170:C:/WinAVR/avr/include/util/delay.h ****    The macro F_CPU is supposed to be defined to a
 171:C:/WinAVR/avr/include/util/delay.h ****    constant defining the CPU clock frequency (in Hertz).
 172:C:/WinAVR/avr/include/util/delay.h **** 

⌨️ 快捷键说明

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