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

📄 main.lst

📁 键盘操作 键盘扫描 用的是单片机mega16
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    003C E5CF      LDI	R28,0x5F
    003D E0D4      LDI	R29,4
    003E BFCD      OUT	0x3D,R28
    003F BFDE      OUT	0x3E,R29
    0040 51C0      SUBI	R28,0x10
    0041 40D0      SBCI	R29,0
    0042 EA0A      LDI	R16,0xAA
    0043 8308      STD	Y+0,R16
    0044 2400      CLR	R0
    0045 E6E2      LDI	R30,0x62
    0046 E0F0      LDI	R31,0
    0047 E010      LDI	R17,0
    0048 36E6      CPI	R30,0x66
    0049 07F1      CPC	R31,R17
    004A F011      BEQ	0x004D
    004B 9201      ST	R0,Z+
    004C CFFB      RJMP	0x0048
    004D 8300      STD	Z+0,R16
    004E E7E5      LDI	R30,0x75
    004F E0F0      LDI	R31,0
    0050 E6A0      LDI	R26,0x60
    0051 E0B0      LDI	R27,0
    0052 E010      LDI	R17,0
    0053 37E7      CPI	R30,0x77
    0054 07F1      CPC	R31,R17
    0055 F021      BEQ	0x005A
    0056 95C8      LPM
    0057 9631      ADIW	R30,1
    0058 920D      ST	R0,X+
    0059 CFF9      RJMP	0x0053
    005A 940E0196  CALL	_main
_exit:
    005C CFFF      RJMP	_exit
_Delay100us:
  i                    --> R20
  n                    --> R16
    005D 940E01EC  CALL	push_gset1
FILE: D:\avrvi\democode\key_4\source\lib\delay.c
(0001) /************************************************************
(0002) 文   件:delay.c
(0003) 用   途:delay100us和delay10ms软件延时函数
(0004) Target : 任意AVR
(0005) Crystal: #define F_CPU 进行设置
(0006) 说   明:请与delay.h配合使用
(0007)          请根据实际定义 #define F_CPU 为晶振大小
(0008) 	     有中断时,延时将不再准确
(0009) 创   建:2008.1.29
(0010) 修   改:2008.1.29
(0011) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0012) ************************************************************/
(0013) 
(0014) #include "..\config.h"
(0015) 
(0016) 
(0017) 
(0018) //需要根据频率调整循环变量
(0019) #ifndef F_CPU
(0020) #define F_CPU 1000000         	             //晶振频率
(0021) #endif
(0022) 
(0023) 
(0024) /*******************************************
(0025) ** 函数名称: void Delay100us(uint8 n)
(0026) ** 功能描述: 100us延时函数
(0027) ** 输 入: 延时的时间
(0028) ** 输出   : 无
(0029) ** 全局变量: 无
(0030) ** 调用模块: 
(0031) ** 说明:最大参数为255
(0032) ** 注意:如果中途有中断发生,延时将不只100us
(0033) ********************************************/
(0034) #define CONT_DELAY100US_COUNT F_CPU/100000
(0035) void Delay100us(uint8 n)      //最大255
(0036) {
    005F C00A      RJMP	0x006A
(0037) 	uint8 i;
(0038) 	while(n--)                //5 clk	
(0039) 	    {
(0040) 		i=CONT_DELAY100US_COUNT;  //1 clk
    0060 E04A      LDI	R20,0xA
    0061 C003      RJMP	0x0065
(0041) 		while(--i)
(0042) 		  {
(0043) 		  NOP();
    0062 0000      NOP
(0044) 		  NOP();
    0063 0000      NOP
(0045) 		  NOP();
    0064 0000      NOP
    0065 2F84      MOV	R24,R20
    0066 5081      SUBI	R24,1
    0067 2F48      MOV	R20,R24
    0068 2388      TST	R24
    0069 F7C1      BNE	0x0062
    006A 2E20      MOV	R2,R16
    006B 2433      CLR	R3
    006C 5001      SUBI	R16,1
    006D 2022      TST	R2
    006E F789      BNE	0x0060
    006F 940E01EF  CALL	pop_gset1
    0071 9508      RET
_Delay10ms:
  i                    --> R20
  n                    --> R16
    0072 940E01EC  CALL	push_gset1
(0046) 		  }          //10 clk
(0047) 		}
(0048) }
(0049) 
(0050) /*******************************************
(0051) ** 函数名称: void Delay10ms(uint8 n)
(0052) ** 功能描述: 10ms延时函数
(0053) ** 输 入: 延时的时间
(0054) ** 输出   : 无
(0055) ** 全局变量: 无
(0056) ** 调用模块: 
(0057) ** 说明:最大参数为255
(0058) ** 注意:如果中途有中断发生,延时将不只10ms
(0059) ********************************************/
(0060) #define CONT_DELAY10MS_COUNT F_CPU/1000
(0061) void Delay10ms(uint8 n)       //最大255
(0062) {
    0074 C00C      RJMP	0x0081
(0063) 	uint16 i;
(0064) 	while(n--)                //5 clk	
(0065) 	    {
(0066) 		i=CONT_DELAY10MS_COUNT;  //1 clk
    0075 EE48      LDI	R20,0xE8
    0076 E053      LDI	R21,3
    0077 C003      RJMP	0x007B
(0067) 		while(--i)
(0068) 		  {
(0069) 		  NOP();
    0078 0000      NOP
(0070) 		  NOP();
    0079 0000      NOP
(0071) 		  NOP();
    007A 0000      NOP
    007B 01CA      MOVW	R24,R20
    007C 9701      SBIW	R24,1
    007D 01AC      MOVW	R20,R24
    007E 3040      CPI	R20,0
    007F 0745      CPC	R20,R21
    0080 F7B9      BNE	0x0078
    0081 2E20      MOV	R2,R16
    0082 2433      CLR	R3
    0083 5001      SUBI	R16,1
    0084 2022      TST	R2
    0085 F779      BNE	0x0075
    0086 940E01EF  CALL	pop_gset1
    0088 9508      RET
FILE: D:\avrvi\democode\key_4\source\lib\7segled.c
(0001) /************************************************
(0002) 文件:7segled.c
(0003) 用途:七段数码管驱动程序
(0004) 注意:外部7.3728M晶振
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) #pragma data:code
(0011) const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,             //0,1,2,3,4
(0012)                          0x6D,0x7D,0x07,0x7F,0x6F,             //5,6,7,8,9
(0013) 						 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};  //a,b,c,d,e,f
(0014) #pragma data:data
(0015) volatile unsigned char Seg7_Led_Buf[4];
(0016) void Seg7_Led_Init(void)
(0017) {
(0018)  Seg7_Data_Ddr=0xff;
_Seg7_Led_Init:
    0089 EF8F      LDI	R24,0xFF
    008A BB87      OUT	0x17,R24
(0019)  Seg7_Data_Port=0x00;
    008B 2422      CLR	R2
    008C BA28      OUT	0x18,R2
(0020)  Seg7_Bitselect_Port&=~((1<<Seg7_Bit0)|(1<<Seg7_Bit1)|(1<<Seg7_Bit2)|(1<<Seg7_Bit3));
    008D B385      IN	R24,0x15
    008E 738C      ANDI	R24,0x3C
    008F BB85      OUT	0x15,R24
(0021)  Seg7_Bitselect_Ddr|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1)|(1<<Seg7_Bit2)|(1<<Seg7_Bit3));
    0090 B384      IN	R24,0x14
    0091 6C83      ORI	R24,0xC3
    0092 BB84      OUT	0x14,R24
(0022)  Seg7_Led_Buf[0]=16;
    0093 E180      LDI	R24,0x10
    0094 93800062  STS	Seg7_Led_Buf,R24
(0023)  Seg7_Led_Buf[1]=16;
    0096 93800063  STS	Seg7_Led_Buf+1,R24
(0024)  Seg7_Led_Buf[2]=16;
    0098 93800064  STS	Seg7_Led_Buf+2,R24
(0025)  Seg7_Led_Buf[3]=16;
    009A 93800065  STS	Seg7_Led_Buf+3,R24
    009C 9508      RET
(0026) }
(0027) 
(0028) void Seg7_Led_Update(void)
(0029) {
(0030)  Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[0]];
_Seg7_Led_Update:
    009D E584      LDI	R24,0x54
    009E E090      LDI	R25,0
    009F 91E00062  LDS	R30,Seg7_Led_Buf
    00A1 27FF      CLR	R31
    00A2 0FE8      ADD	R30,R24
    00A3 1FF9      ADC	R31,R25
    00A4 91E4      LPM	R30,0(Z)
    00A5 BBE8      OUT	0x18,R30
(0031)  Seg7_Bit0_En();
    00A6 9AA7      SBI	0x14,7
    00A7 9AAF      SBI	0x15,7
(0032)  Delay100us(60);
    00A8 E30C      LDI	R16,0x3C
    00A9 940E005D  CALL	_Delay100us
(0033)  Seg7_Bit0_Dis();
    00AB 9AA7      SBI	0x14,7
    00AC 98AF      CBI	0x15,7
(0034)  Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[1]];
    00AD E584      LDI	R24,0x54
    00AE E090      LDI	R25,0
    00AF 91E00063  LDS	R30,Seg7_Led_Buf+1
    00B1 27FF      CLR	R31
    00B2 0FE8      ADD	R30,R24
    00B3 1FF9      ADC	R31,R25
    00B4 91E4      LPM	R30,0(Z)
    00B5 BBE8      OUT	0x18,R30
(0035)  Seg7_Bit1_En();
    00B6 9AA6      SBI	0x14,6
    00B7 9AAE      SBI	0x15,6
(0036)  Delay100us(60);
    00B8 E30C      LDI	R16,0x3C
    00B9 940E005D  CALL	_Delay100us
(0037)  Seg7_Bit1_Dis();
    00BB 9AA6      SBI	0x14,6
    00BC 98AE      CBI	0x15,6
(0038)  Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[2]];
    00BD E584      LDI	R24,0x54
    00BE E090      LDI	R25,0
    00BF 91E00064  LDS	R30,Seg7_Led_Buf+2
    00C1 27FF      CLR	R31
    00C2 0FE8      ADD	R30,R24
    00C3 1FF9      ADC	R31,R25
    00C4 91E4      LPM	R30,0(Z)
    00C5 BBE8      OUT	0x18,R30
(0039)  Seg7_Bit2_En();
    00C6 9AA1      SBI	0x14,1
    00C7 9AA9      SBI	0x15,1
(0040)  Delay100us(60);
    00C8 E30C      LDI	R16,0x3C
    00C9 940E005D  CALL	_Delay100us
(0041)  Seg7_Bit2_Dis();
    00CB 9AA1      SBI	0x14,1
    00CC 98A9      CBI	0x15,1
(0042)  Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[3]];
    00CD E584      LDI	R24,0x54
    00CE E090      LDI	R25,0
    00CF 91E00065  LDS	R30,Seg7_Led_Buf+3
    00D1 27FF      CLR	R31
    00D2 0FE8      ADD	R30,R24
    00D3 1FF9      ADC	R31,R25
    00D4 91E4      LPM	R30,0(Z)
    00D5 BBE8      OUT	0x18,R30
(0043)  Seg7_Bit3_En();
    00D6 9AA0      SBI	0x14,0
    00D7 9AA8      SBI	0x15,0
(0044)  Delay100us(60);
    00D8 E30C      LDI	R16,0x3C
    00D9 940E005D  CALL	_Delay100us
(0045)  Seg7_Bit3_Dis(); 
    00DB 9AA0      SBI	0x14,0
    00DC 98A8      CBI	0x15,0
    00DD 9508      RET
_Seg7_Led_display:
  data                 --> R20
    00DE 940E01EC  CALL	push_gset1
    00E0 01A8      MOVW	R20,R16
(0046) }
(0047) 
(0048) void Seg7_Led_display(unsigned int data)
(0049) {
(0050)  Seg7_Led_Buf[3]=data/1000;
    00E1 EE28      LDI	R18,0xE8
    00E2 E033      LDI	R19,3
    00E3 018A      MOVW	R16,R20
    00E4 940E01C7  CALL	div16u
    00E6 93000065  STS	Seg7_Led_Buf+3,R16
(0051)  Seg7_Led_Buf[2]=(data%1000)/100;
    00E8 EE28      LDI	R18,0xE8
    00E9 E033      LDI	R19,3
    00EA 018A      MOVW	R16,R20
    00EB 940E01C5  CALL	mod16u
    00ED E624      LDI	R18,0x64
    00EE E030      LDI	R19,0
    00EF 940E01C7  CALL	div16u
    00F1 93000064  STS	Seg7_Led_Buf+2,R16
(0052)  Seg7_Led_Buf[1]=(data%100)/10;
    00F3 E624      LDI	R18,0x64
    00F4 E030      LDI	R19,0
    00F5 018A      MOVW	R16,R20
    00F6 940E01C5  CALL	mod16u
    00F8 E02A      LDI	R18,0xA
    00F9 E030      LDI	R19,0
    00FA 940E01C7  CALL	div16u
    00FC 93000063  STS	Seg7_Led_Buf+1,R16
(0053)  Seg7_Led_Buf[0]=data%10;
    00FE E02A      LDI	R18,0xA
    00FF E030      LDI	R19,0
    0100 018A      MOVW	R16,R20
    0101 940E01C5  CALL	mod16u
    0103 93000062  STS	Seg7_Led_Buf,R16
(0054)  Seg7_Led_Update();
    0105 DF97      RCALL	_Seg7_Led_Update
    0106 940E01EF  CALL	pop_gset1
    0108 9508      RET
_int_isr:
    0109 940E0203  CALL	push_lset
FILE: D:\avrvi\democode\key_4\source\lib\key_board.c
(0001) /**************************************
(0002) ** Filename: key_board.c
(0003) ** Describe: 矩阵键盘程序
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time  :   2007-2-15
(0006) **************************************/
(0007) 
(0008) #include "..\config.h"
(0009) 
(0010) const uint8 key_board_table[]={0,1,2,3,
(0011) 	  						   4,5,6,7,
(0012) 							   8,9,10,11,
(0013) 							   12,13,14,15};
(0014) //键值可以任意设定,请不要使用0xFF
(0015) //const uint8 key_board_table[]={0,1,2,3,4,5,6,7,8,9,10,11,'A','B','C','D'};
(0016) 
(0017) //如果使用中断
(0018) #if KEY_USE_INT==1
(0019) 	volatile uint8 KEY_FLAG=0,key=0xff;						 //加 volatile 允许在中断中修改
(0020) 	#pragma interrupt_handler int_isr:IV_number
(0021) 	void int_isr(void)
(0022) 	{
(0023) 	 KEY_FLAG = 1; //中断中标记已经产生按键中断,由于使用低电平触发方式,不用再考虑防抖问题
    010B E081      LDI	R24,1
    010C 93800060  STS	KEY_FLAG,R24
(0024) 	 key = key_board_get_key();				//读取键值
    010E D01A      RCALL	_key_board_get_key
    010F 93000061  STS	key,R16
    0111 940E021A  CALL	pop_lset
    0113 9518      RETI
(0025) 	}
(0026) #endif
(0027) 
(0028) /***********************************************************
(0029) ** 函数名称: void key_board_int(void)
(0030) ** 功能描述: 中断脚初始化
(0031) ** 输 入: 无
(0032) ** 输出   : 无
(0033) ** 全局变量: 无
(0034) ** 调用模块: 
(0035) ** 说明:输入,并使能内部上拉
(0036) ** 注意:
(0037) **********************************************************/
(0038) void key_int_init(void)
(0039) {
(0040)  KEY_INT_DDR &=~ (1<<KEY_INT);
_key_int_init:
    0114 988A      CBI	0x11,2
(0041)  KEY_INT_RORT |= (1<<KEY_INT);
    0115 9A92      SBI	0x12,2
(0042)  GICR  |= (1<<INT_BIT);		  //中断允许位,如INT0
    0116 B78B      IN	R24,0x3B
    0117 6480      ORI	R24,0x40
    0118 BF8B      OUT	0x3B,R24
    0119 9508      RET
(0043) }
(0044) 
(0045) /***********************************************************
(0046) ** 函数名称: void key_board_int(void)
(0047) ** 功能描述: 矩阵键盘扫描初始化
(0048) ** 输 入: 无
(0049) ** 输出   : 无
(0050) ** 全局变量: 无
(0051) ** 调用模块: 
(0052) ** 说明:默认初始化为行输出低,列输入,并使能内部上拉
(0053) ** 注意:
(0054) **********************************************************/
(0055) 
(0056) void key_board_int(void)
(0057) {
(0058)  KEY_DDR_ROW   |=  KEY_ROW_ALL;							   //行输出,低
_key_board_int:
    011A B38A      IN	R24,0x1A
    011B 6F80      ORI	R24,0xF0
    011C BB8A      OUT	0x1A,R24
(0059)  KEY_PORT_ROW  &=~ KEY_ROW_ALL;
    011D B38B      IN	R24,0x1B
    011E 708F      ANDI	R24,0xF
    011F BB8B      OUT	0x1B,R24
(0060)  KEY_DDR_COL   &=~ KEY_COL_ALL;							   //列输入,并使能内部上拉
    0120 B38A      IN	R24,0x1A
    0121 7F80      ANDI	R24,0xF0
    0122 BB8A      OUT	0x1A,R24
(0061)  KEY_PORT_COL  |=  KEY_COL_ALL;
    0123 B38B      IN	R24,0x1B
    0124 608F      ORI	R24,0xF
    0125 BB8B      OUT	0x1B,R24
(0062)  #if BEEP_EN ==1
(0063)    BEEP_DDR |= (1<<BEEP_BIT);
    0126 9A88      SBI	0x11,0
(0064)    BEEP_PORT &=~ (1<<BEEP_BIT);
    0127 9890      CBI	0x12,0
    0128 9508      RET
_key_board_get_key:
  key_i                --> R20
  temp_key             --> R22
    0129 940E01E8  CALL	push_gset3
(0065)  #endif
(0066) }
(0067) 
(0068) /***********************************************************
(0069) ** 函数名称: uint8 key_board_get_key(void)
(0070) ** 功能描述: 矩阵键盘扫描并读取键值
(0071) ** 输 入: 无
(0072) ** 输出   : 按键的键值,在key_board_table[]定义,无按键返回0xFF
(0073) ** 全局变量: 无
(0074) ** 调用模块: void key_board_int(void)
(0075) ** 说明:通过预定义#define WAIT_KEY_UP设置等待按键抬起(1),不等待按键抬起(0)
(0076) ** 注意:如果不等待按键抬起,很容易产生粘贴键,注意在程序中处理。
(0077) **********************************************************/
(0078) 
(0079) uint8 key_board_get_key(void)
(0080) {
(0081)   uint8 key_i=0,temp_key=0;
    012B 2744      CLR	R20
    012C 2766      CLR	R22
(0082)   if(HAVE_KEY_DOWN)
    012D B389      IN	R24,0x19
    012E 708F      ANDI	R24,0xF
    012F 308F      CPI	R24,0xF
    0130 F409      BNE	0x0132
    0131 C060      RJMP	0x0192
(0083)   {

⌨️ 快捷键说明

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