📄 keyboard.lst
字号:
__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 + -