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

📄 keyboard.lst

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    003A EFCF      LDI	R28,0xFF
    003B E0D4      LDI	R29,4
    003C BFCD      OUT	0x3D,R28
    003D BFDE      OUT	0x3E,R29
    003E 51C0      SUBI	R28,0x10
    003F 40D0      SBCI	R29,0
    0040 EA0A      LDI	R16,0xAA
    0041 8308      STD	Y+0,R16
    0042 2400      CLR	R0
    0043 E0E0      LDI	R30,0
    0044 E0F1      LDI	R31,1
    0045 E011      LDI	R17,1
    0046 32E0      CPI	R30,0x20
    0047 07F1      CPC	R31,R17
    0048 F011      BEQ	0x004B
    0049 9201      ST	R0,Z+
    004A CFFB      RJMP	0x0046
    004B 8300      STD	Z+0,R16
    004C E7E3      LDI	R30,0x73
    004D E0F0      LDI	R31,0
    004E E0A0      LDI	R26,0
    004F E0B1      LDI	R27,1
    0050 E010      LDI	R17,0
    0051 37E3      CPI	R30,0x73
    0052 07F1      CPC	R31,R17
    0053 F021      BEQ	0x0058
    0054 95C8      LPM
    0055 9631      ADIW	R30,1
    0056 920D      ST	R0,X+
    0057 CFF9      RJMP	0x0051
    0058 940E0248  CALL	_main
_exit:
    005A CFFF      RJMP	_exit
FILE: E:\AVRATM~1\key_board\keyboard.c
(0001) //ICC-AVR application builder : 2004-8-25 1:33
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include <eeprom.h>
(0007) 
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010) #define ulong unsigned long
(0011) 
(0012) const uchar num_table[] = { 0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40 };
(0013) //自定义定时器
(0014) uint  delay_counter, scom_counter, key_counter;
(0015) //定义通讯缓存
(0016) #define SCOM_BUF_LEN 10
(0017) uchar tbuf[SCOM_BUF_LEN];
(0018) uchar rbuf[SCOM_BUF_LEN];
(0019) //显示缓存
(0020) uint l_des_speed, r_des_speed;
(0021) //键盘缓存
(0022) uint key_buf;
(0023) //子函数声明
(0024) void delay( uint time );
(0025) void master( uchar command, uchar* buf, uchar startP, uchar dataLen );
(0026) uint scan_key( void );
(0027) void display( void );
(0028) void error_handle( void );
(0029) 
(0030) /******************公共的底层函数区********************/
(0031) void delay( uint time )
(0032) {
(0033) 	for( delay_counter = 0; delay_counter < time; ) { WDR(); }
_delay:
  time                 --> R16
    005B 2422      CLR	R2
    005C 2433      CLR	R3
    005D 9230011F  STS	delay_counter+1,R3
    005F 9220011E  STS	delay_counter,R2
    0061 C001      RJMP	0x0063
    0062 95A8      WDR
    0063 9020011E  LDS	R2,delay_counter
    0065 9030011F  LDS	R3,delay_counter+1
    0067 1620      CP	R2,R16
    0068 0631      CPC	R3,R17
    0069 F3C0      BCS	0x0062
    006A 9508      RET
_scan_key:
  key_status           --> R20
    006B 940E02BE  CALL	push_gset1
(0034) }
(0035) 
(0036) uint scan_key( void )
(0037) {
(0038) 	uint key_status = 0;
    006D 2744      CLR	R20
    006E 2755      CLR	R21
(0039) 	PORTC = 0xF7;	//定义管脚输入输出状态
    006F EF87      LDI	R24,0xF7
    0070 BB85      OUT	0x15,R24
(0040) 	delay(1);
    0071 E001      LDI	R16,1
    0072 E010      LDI	R17,0
    0073 DFE7      RCALL	_delay
(0041) 	if (!(PINC & 0x80))	key_status |= BIT(0);
    0074 999F      SBIC	0x13,7
    0075 C001      RJMP	0x0077
    0076 6041      ORI	R20,1
(0042) 	if (!(PINC & 0x40))	key_status |= BIT(1); 
    0077 999E      SBIC	0x13,6
    0078 C001      RJMP	0x007A
    0079 6042      ORI	R20,2
(0043) 	if (!(PINC & 0x20))	key_status |= BIT(2); 
    007A 999D      SBIC	0x13,5
    007B C001      RJMP	0x007D
    007C 6044      ORI	R20,4
(0044) 	if (!(PINC & 0x10))	key_status |= BIT(3); 
    007D 999C      SBIC	0x13,4
    007E C001      RJMP	0x0080
    007F 6048      ORI	R20,0x8
(0045)  	PORTC = 0xFB;
    0080 EF8B      LDI	R24,0xFB
    0081 BB85      OUT	0x15,R24
(0046) 	delay(1);
    0082 E001      LDI	R16,1
    0083 E010      LDI	R17,0
    0084 DFD6      RCALL	_delay
(0047) 	if (!(PINC & 0x80))	key_status |= BIT(4);
    0085 999F      SBIC	0x13,7
    0086 C001      RJMP	0x0088
    0087 6140      ORI	R20,0x10
(0048) 	if (!(PINC & 0x40))	key_status |= BIT(5); 
    0088 999E      SBIC	0x13,6
    0089 C001      RJMP	0x008B
    008A 6240      ORI	R20,0x20
(0049) 	if (!(PINC & 0x20))	key_status |= BIT(6); 
    008B 999D      SBIC	0x13,5
    008C C001      RJMP	0x008E
    008D 6440      ORI	R20,0x40
(0050) 	if (!(PINC & 0x10))	key_status |= BIT(7); 
    008E 999C      SBIC	0x13,4
    008F C001      RJMP	0x0091
    0090 6840      ORI	R20,0x80
(0051) 	PORTC = 0xFD;
    0091 EF8D      LDI	R24,0xFD
    0092 BB85      OUT	0x15,R24
(0052) 	delay(1);
    0093 E001      LDI	R16,1
    0094 E010      LDI	R17,0
    0095 DFC5      RCALL	_delay
(0053) 	if (!(PINC & 0x80))	key_status |= BIT(8);
    0096 999F      SBIC	0x13,7
    0097 C001      RJMP	0x0099
    0098 6051      ORI	R21,1
(0054) 	if (!(PINC & 0x40))	key_status |= BIT(9); 
    0099 999E      SBIC	0x13,6
    009A C001      RJMP	0x009C
    009B 6052      ORI	R21,2
(0055) 	if (!(PINC & 0x20))	key_status |= BIT(10); 
    009C 999D      SBIC	0x13,5
    009D C001      RJMP	0x009F
    009E 6054      ORI	R21,4
(0056) 	if (!(PINC & 0x10))	key_status |= BIT(11); 
    009F 999C      SBIC	0x13,4
    00A0 C001      RJMP	0x00A2
    00A1 6058      ORI	R21,0x8
(0057) 	PORTC = 0xFE;
    00A2 EF8E      LDI	R24,0xFE
    00A3 BB85      OUT	0x15,R24
(0058) 	delay(1);
    00A4 E001      LDI	R16,1
    00A5 E010      LDI	R17,0
    00A6 DFB4      RCALL	_delay
(0059) 	if (!(PINC & 0x80))	key_status |= BIT(12);
    00A7 999F      SBIC	0x13,7
    00A8 C001      RJMP	0x00AA
    00A9 6150      ORI	R21,0x10
(0060) 	if (!(PINC & 0x40))	key_status |= BIT(13); 
    00AA 999E      SBIC	0x13,6
    00AB C001      RJMP	0x00AD
    00AC 6250      ORI	R21,0x20
(0061) 	if (!(PINC & 0x20))	key_status |= BIT(14); 
    00AD 999D      SBIC	0x13,5
    00AE C001      RJMP	0x00B0
    00AF 6450      ORI	R21,0x40
(0062) 	if (!(PINC & 0x10))	key_status |= BIT(15); 
    00B0 999C      SBIC	0x13,4
    00B1 C001      RJMP	0x00B3
    00B2 6850      ORI	R21,0x80
(0063) 	PORTC = 0xF0;
    00B3 EF80      LDI	R24,0xF0
    00B4 BB85      OUT	0x15,R24
(0064) 	DDRC  = 0x0F;
    00B5 E08F      LDI	R24,0xF
    00B6 BB84      OUT	0x14,R24
(0065) 	PORTD |= BIT(PD2);
    00B7 9A92      SBI	0x12,2
(0066) 	DDRD &= ~BIT(PD2);
    00B8 988A      CBI	0x11,2
(0067) 	return key_status;
    00B9 018A      MOVW	R16,R20
    00BA 940E02C1  CALL	pop_gset1
    00BC 9508      RET
_master:
  i                    --> R20
  dataLen              --> R22
  startP               --> R10
  buf                  --> R18
  command              --> R16
    00BD 940E02D9  CALL	push_gset3
    00BF 80AE      LDD	R10,Y+6
    00C0 8568      LDD	R22,Y+8
(0068) }
(0069) 
(0070) void master( uchar command, uchar* buf, uchar startP, uchar dataLen )
(0071) { 
(0072) 	uchar i;
(0073) 	CLI();
    00C1 94F8      BCLR	7
(0074) 	if ( command == 0x01 ){
    00C2 3001      CPI	R16,1
    00C3 F4C1      BNE	0x00DC
(0075) 		while( !( UCSRA & BIT( UDRE ) ) );
    00C4 9B5D      SBIS	0x0B,5
    00C5 CFFE      RJMP	0x00C4
(0076)   		UDR = command;
    00C6 B90C      OUT	0x0C,R16
(0077)   		while( !( UCSRA & BIT( UDRE ) ) );
    00C7 9B5D      SBIS	0x0B,5
    00C8 CFFE      RJMP	0x00C7
(0078)   		UDR = dataLen;
    00C9 B96C      OUT	0x0C,R22
(0079)   		for( i = startP; i < dataLen + startP; i ++ ){
    00CA 2D4A      MOV	R20,R10
    00CB C00B      RJMP	0x00D7
(0080) 			while( !( UCSRA & BIT( UDRE ) ) );
    00CC 9B5D      SBIS	0x0B,5
    00CD CFFE      RJMP	0x00CC
(0081)    			UDR = tbuf[i];
    00CE E180      LDI	R24,0x10
    00CF E091      LDI	R25,1
    00D0 2FE4      MOV	R30,R20
    00D1 27FF      CLR	R31
    00D2 0FE8      ADD	R30,R24
    00D3 1FF9      ADC	R31,R25
    00D4 8020      LDD	R2,Z+0
    00D5 B82C      OUT	0x0C,R2
    00D6 9543      INC	R20
    00D7 2E26      MOV	R2,R22
    00D8 0C2A      ADD	R2,R10
    00D9 1542      CP	R20,R2
    00DA F388      BCS	0x00CC
(0082)   		}  
(0083)  	} else {
    00DB C017      RJMP	0x00F3
(0084)   		while( !( UCSRA & BIT( UDRE ) ) );
    00DC 9B5D      SBIS	0x0B,5
    00DD CFFE      RJMP	0x00DC
(0085)   		UDR = command;
    00DE B90C      OUT	0x0C,R16
(0086)   		while( !( UCSRA & BIT( UDRE ) ) );
    00DF 9B5D      SBIS	0x0B,5
    00E0 CFFE      RJMP	0x00DF
(0087)   		UDR = dataLen;
    00E1 B96C      OUT	0x0C,R22
(0088)   		for( i = startP; i < dataLen + startP; i ++ ){
    00E2 2D4A      MOV	R20,R10
    00E3 C00B      RJMP	0x00EF
(0089)    			while( !( UCSRA & BIT( RXC ) ) );
    00E4 9B5F      SBIS	0x0B,7
    00E5 CFFE      RJMP	0x00E4
(0090)    			rbuf[i] = UDR;   
    00E6 E086      LDI	R24,6
    00E7 E091      LDI	R25,1
    00E8 2FE4      MOV	R30,R20
    00E9 27FF      CLR	R31
    00EA 0FE8      ADD	R30,R24
    00EB 1FF9      ADC	R31,R25
    00EC B02C      IN	R2,0x0C
    00ED 8220      STD	Z+0,R2
    00EE 9543      INC	R20
    00EF 2E26      MOV	R2,R22
    00F0 0C2A      ADD	R2,R10
    00F1 1542      CP	R20,R2
    00F2 F388      BCS	0x00E4
(0091)   		}
(0092)  	}
(0093)  	SEI();
    00F3 9478      BSET	7
    00F4 940E02BB  CALL	pop_gset3
    00F6 9508      RET
(0094) }
(0095) 
(0096) void port_init(void)
(0097) {
(0098) 	PORTA = 0x00;
_port_init:
    00F7 2422      CLR	R2
    00F8 BA2B      OUT	0x1B,R2
(0099) 	DDRA  = 0xFF;
    00F9 EF8F      LDI	R24,0xFF
    00FA BB8A      OUT	0x1A,R24
(0100) 	PORTB = 0xFF;
    00FB BB88      OUT	0x18,R24
(0101) 	DDRB  = 0xFF;
    00FC BB87      OUT	0x17,R24
(0102) 	PORTC = 0xF0; //m103 output only
    00FD EF80      LDI	R24,0xF0
    00FE BB85      OUT	0x15,R24
(0103) 	DDRC  = 0x0F;
    00FF E08F      LDI	R24,0xF
    0100 BB84      OUT	0x14,R24
(0104) 	PORTD = 0xFF;
    0101 EF8F      LDI	R24,0xFF
    0102 BB82      OUT	0x12,R24
(0105) 	DDRD  = 0x00;
    0103 BA21      OUT	0x11,R2
    0104 9508      RET
(0106) }
(0107) 
(0108) //TIMER0 initialisation - prescale:64
(0109) // WGM: Normal
(0110) // desired value: 1mSec
(0111) // actual value:  1.000mSec (0.0%)
(0112) void timer0_init(void)
(0113) {
(0114) 	TCCR0 = 0x00; //stop
_timer0_init:
    0105 2422      CLR	R2
    0106 BE23      OUT	0x33,R2
(0115) 	TCNT0 = 0x83; //set count
    0107 E883      LDI	R24,0x83
    0108 BF82      OUT	0x32,R24
(0116) 	OCR0  = 0x7D;  //set compare
    0109 E78D      LDI	R24,0x7D
    010A BF8C      OUT	0x3C,R24
(0117) 	TCCR0 = 0x03; //start timer
    010B E083      LDI	R24,3
    010C BF83      OUT	0x33,R24
    010D 9508      RET
_timer0_ovf_isr:
    010E 938A      ST	R24,-Y
    010F 939A      ST	R25,-Y
    0110 B78F      IN	R24,0x3F
    0111 938A      ST	R24,-Y
(0118) }
(0119) 
(0120) #pragma interrupt_handler timer0_ovf_isr:10
(0121) void timer0_ovf_isr(void)
(0122) {
(0123) 	TCNT0 = 0x83; //reload counter value
    0112 E883      LDI	R24,0x83
    0113 BF82      OUT	0x32,R24
(0124) 	delay_counter ++;
    0114 9180011E  LDS	R24,delay_counter
    0116 9190011F  LDS	R25,delay_counter+1
    0118 9601      ADIW	R24,1
    0119 9390011F  STS	delay_counter+1,R25
    011B 9380011E  STS	delay_counter,R24
(0125) 	key_counter ++;
    011D 9180011A  LDS	R24,key_counter
    011F 9190011B  LDS	R25,key_counter+1
    0121 9601      ADIW	R24,1
    0122 9390011B  STS	key_counter+1,R25
    0124 9380011A  STS	key_counter,R24
(0126) 	scom_counter ++;
    0126 9180011C  LDS	R24,scom_counter
    0128 9190011D  LDS	R25,scom_counter+1
    012A 9601      ADIW	R24,1
    012B 9390011D  STS	scom_counter+1,R25
    012D 9380011C  STS	scom_counter,R24
    012F 9189      LD	R24,Y+
    0130 BF8F      OUT	0x3F,R24
    0131 9199      LD	R25,Y+
    0132 9189      LD	R24,Y+
    0133 9518      RETI
(0127) }
(0128) 
(0129) //UART0 initialisation
(0130) // desired baud rate: 9600
(0131) // actual: baud rate:9615 (0.2%)
(0132) // char size: 8 bit
(0133) // parity: Disabled
(0134) void uart0_init(void)
(0135) {
(0136) 	UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0134 2422      CLR	R2
    0135 B82A      OUT	0x0A,R2
(0137) 	UCSRA = 0x00;
    0136 B82B      OUT	0x0B,R2
(0138) 	UCSRC = 0x86;
    0137 E886      LDI	R24,0x86
    0138 BD80      OUT	0x20,R24
(0139) 	UBRRL = 0x00; //set baud rate lo
    0139 B829      OUT	0x09,R2
(0140) 	UBRRH = 0x00; //set baud rate hi
    013A BC20      OUT	0x20,R2
(0141) 	UCSRB = 0x98;
    013B E988      LDI	R24,0x98
    013C B98A      OUT	0x0A,R24
    013D 9508      RET
(0142) }
(0143) 
(0144) //Watchdog initialisation
(0145) // prescale: 32K cycles
(0146) void watchdog_init(void)
(0147) {
(0148) 	WDR(); //this prevents a timout on enabling
_watchdog_init:
    013E 95A8      WDR
(0149) 	WDTCR = 0x0A; //WATCHDOG ENABLED - dont forget to issue WDRs
    013F E08A      LDI	R24,0xA
    0140 BD81      OUT	0x21,R24
    0141 9508      RET
(0150) }
(0151) 
(0152) //call this routine to initialise all peripherals
(0153) void init_devices(void)
(0154) {
(0155) 	//stop errant interrupts until set up
(0156) 	CLI(); //disable all interrupts
_init_devices:
    0142 94F8      BCLR	7
(0157) 	port_init();
    0143 DFB3      RCALL	_port_init
(0158) 	timer0_init(); 
    0144 DFC0      RCALL	_timer0_init
(0159) 	uart0_init();
    0145 DFEE      RCALL	_uart0_init
(0160) 	//watchdog_init();
(0161)  
(0162) 	MCUCR = 0x00;
    0146 2422      CLR	R2
    0147 BE25      OUT	0x35,R2
(0163) 	GICR  = 0x00;
    0148 BE2B      OUT	0x3B,R2
(0164) 	TIMSK = 0x01; //timer interrupt sources
    0149 E081      LDI	R24,1
    014A BF89      OUT	0x39,R24
(0165) 	SEI(); //re-enable interrupts
    014B 9478      BSET	7
    014C 9508      RET
_send_num:
  num                  --> R20
  index                --> R22
    014D 940E02D5  CALL	push_gset2
    014F 2F42      MOV	R20,R18
    0150 2F60      MOV	R22,R16
(0166) 	//all peripherals are now initialised
(0167) }
(0168) 
(0169) //显示
(0170) void send_num( uchar index, uchar num )
(0171) {
(0172) 	PORTB = ~BIT( index ); 
    0151 E001      LDI	R16,1
    0152 2F16      MOV	R17,R22

⌨️ 快捷键说明

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