📄 jianpan.lst
字号:
__start:
__text_start:
003E E5CF LDI R28,0x5F
003F E0D4 LDI R29,4
0040 BFCD OUT 0x3D,R28
0041 BFDE OUT 0x3E,R29
0042 51C0 SUBI R28,0x10
0043 40D0 SBCI R29,0
0044 EA0A LDI R16,0xAA
0045 8308 STD Y+0,R16
0046 2400 CLR R0
0047 E6ED LDI R30,0x6D
0048 E0F0 LDI R31,0
0049 E010 LDI R17,0
004A 39E5 CPI R30,0x95
004B 07F1 CPC R31,R17
004C F011 BEQ 0x004F
004D 9201 ST R0,Z+
004E CFFB RJMP 0x004A
004F 8300 STD Z+0,R16
0050 E6EF LDI R30,0x6F
0051 E0F0 LDI R31,0
0052 E6A0 LDI R26,0x60
0053 E0B0 LDI R27,0
0054 E010 LDI R17,0
0055 37EC CPI R30,0x7C
0056 07F1 CPC R31,R17
0057 F021 BEQ 0x005C
0058 95C8 LPM
0059 9631 ADIW R30,1
005A 920D ST R0,X+
005B CFF9 RJMP 0x0055
005C 940E03F9 CALL _main
_exit:
005E CFFF RJMP _exit
FILE: E:\李斐机器人\周卓\键盘_3\键盘_3yuan\jianpan.c
(0001) //ICC-AVR application builder : 2004-4-28 13:15:44
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) //串口通讯及控制命令格式(协议)如下:
(0005) // 命令的传输长度采用变长数据,第一个字节为指令,其余为可选参数
(0006) //----------------------------------------------------------------------------
(0007) //键盘特殊功能键定义如下:
(0008) //
(0009) //键码 功能
(0010) //-----------------------------------
(0011) // F ENTER(transmit the data to the master)
(0012) // C BACKSPACE
(0013) // A speedup
(0014) // B slowdown
(0015) // E go into the edit mode
(0016) //
(0017) #include <iom16v.h>
(0018) #include <macros.h>
(0019)
(0020) #define uchar unsigned char
(0021) #define uint unsigned int
(0022) #define ulong unsigned long
(0023)
(0024) #define ROUTE_TASK_NUM_LIMIT 30
(0025) #define SET_ROUTE ( PIND & BIT(PD3) ) //键盘设定路径的选通引脚(来自Mega16)
(0026)
(0027) //功能键定义
(0028) #define CANCEL 12 //C
(0029) #define ENTER 15 //F
(0030) #define EDIT 14 //e
(0031) #define speedup 10 //A
(0032) #define slowdown 11 //B
(0033) #define DEBUG 13 //D
(0034)
(0035) //模式1参数个数Model1_flag
(0036) #define Model1_flag 8
(0037) //模式2参数个数Model2_flag
(0038) #define Model2_flag 4
(0039)
(0040) //状态标志
(0041) #define START_COMMAND 0xF0
(0042) #define TRANSMIT 0x02
(0043) #define SAVE 0x00
(0044) #define SETTING 0x01
(0045) #define FREE 0X71
(0046) #define STATE 0X0f
(0047)
(0048) #define PAR1 0x01
(0049) #define PAR2 0x02
(0050) #define PAR3 0x03
(0051) #define PAR4 0x04
(0052) #define PAR5 0x05
(0053) #define PAR6 0x06
(0054) #define PAR7 0x07
(0055) #define PAR8 0x08
(0056) #define PAR9 0x09
(0057) #define PAR10 0x0a
(0058) const uchar KeySet[] =
(0059) {
(0060) 1, 2, 3, 4,
(0061) 5, 6, 7, 8,
(0062) 9, 0, 10,11,
(0063) 12,13,14,15
(0064) };
(0065)
(0066) uchar flag = 0; /* 状态标志变量 */
(0067) const uchar num_table[] = { 0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40 };
(0068) //自定义定时器
(0069) uint DelayCounter = 0;
(0070) uint SysCounter = 0;
(0071) //
(0072) uchar trans_buf[20];
(0073) uchar receive_buf[20];
(0074)
(0075) //键盘控制行为变量
(0076) uint numL= 0; //6位十进制
(0077) uchar numH=0; //显示高2位
(0078)
(0079) uchar mode = 0x71; //显示'F'
(0080) uchar NumBitL=0; //显示高2位
(0081) uchar NumBitH=0; //6位十进制 显示低6位
(0082) uchar Cursor = 0;
(0083) uchar CursorDir = 0;
(0084)
(0085) void delay( uint time );
(0086) //void master( uchar command, uchar* buf, uchar startP, uchar dataLen );
(0087) uchar scan_key( void );
(0088) void display( void );
(0089)
(0090)
(0091) void delay( uint time )
(0092) {
(0093) for( DelayCounter = 0; DelayCounter < time; ) { WDR(); }
_delay:
time --> R16
005F 2422 CLR R2
0060 2433 CLR R3
0061 92300062 STS 0x62,R3
0063 92200061 STS 0x61,R2
0065 C001 RJMP 0x0067
0066 95A8 WDR
0067 90200061 LDS R2,0x61
0069 90300062 LDS R3,0x62
006B 1620 CP R2,R16
006C 0631 CPC R3,R17
006D F3C0 BCS 0x0066
(0094) }
006E 9508 RET
_send:
num --> R20
index --> R22
006F 940E04D2 CALL push_gset2
0071 2F42 MOV R20,R18
0072 2F60 MOV R22,R16
(0095)
(0096) void send( uchar index, uchar num )
(0097) {
(0098) PORTB = ~BIT( index );
0073 E001 LDI R16,1
0074 2F16 MOV R17,R22
0075 940E04E2 CALL lsl8
0077 2E20 MOV R2,R16
0078 9420 COM R2
0079 BA28 OUT 0x18,R2
(0099) if( index < 7 ) { PORTA = num_table[num]; }
007A 3067 CPI R22,7
007B F448 BCC 0x0085
007C E684 LDI R24,0x64
007D E090 LDI R25,0
007E 2FE4 MOV R30,R20
007F 27FF CLR R31
0080 0FE8 ADD R30,R24
0081 1FF9 ADC R31,R25
0082 91E4 LPM R30,0(Z)
0083 BBEB OUT 0x1B,R30
0084 C001 RJMP 0x0086
(0100) else { PORTA = num; }
0085 BB4B OUT 0x1B,R20
(0101) delay( 1 );
0086 E001 LDI R16,1
0087 E010 LDI R17,0
0088 DFD6 RCALL _delay
(0102) }
0089 940E04B5 CALL pop_gset2
008B 9508 RET
_send_char:
ch --> R20
index --> R22
008C 940E04D2 CALL push_gset2
008E 2F42 MOV R20,R18
008F 2F60 MOV R22,R16
(0103)
(0104) void send_char( uchar index, uchar ch )
(0105) {
(0106) PORTB = ~BIT( index );
0090 E001 LDI R16,1
0091 2F16 MOV R17,R22
0092 940E04E2 CALL lsl8
0094 2E20 MOV R2,R16
0095 9420 COM R2
0096 BA28 OUT 0x18,R2
(0107) PORTA = ch;
0097 BB4B OUT 0x1B,R20
(0108) delay(1);
0098 E001 LDI R16,1
0099 E010 LDI R17,0
009A DFC4 RCALL _delay
(0109) }
009B 940E04B5 CALL pop_gset2
009D 9508 RET
(0110)
(0111) //键盘扫描
(0112) uchar scan_key( void )
(0113) {
(0114) uchar index;
(0115) if(!(PINC & 0x80))
_scan_key:
index --> R16
009E 999F SBIC 0x13,7
009F C002 RJMP 0x00A2
(0116) index = 0;
00A0 2700 CLR R16
00A1 C00B RJMP 0x00AD
(0117) else if(!(PINC & 0x40))
00A2 999E SBIC 0x13,6
00A3 C002 RJMP 0x00A6
(0118) index = 1;
00A4 E001 LDI R16,1
00A5 C007 RJMP 0x00AD
(0119) else if(!(PINC & 0x20))
00A6 999D SBIC 0x13,5
00A7 C002 RJMP 0x00AA
(0120) index = 2;
00A8 E002 LDI R16,2
00A9 C003 RJMP 0x00AD
(0121) else if(!(PINC & 0x10))
00AA 999C SBIC 0x13,4
00AB C001 RJMP 0x00AD
(0122) index = 3;
00AC E003 LDI R16,3
(0123) PORTC = 0x0F; //切换
00AD E08F LDI R24,0xF
00AE BB85 OUT 0x15,R24
(0124) DDRC = 0xF0;
00AF EF80 LDI R24,0xF0
00B0 BB84 OUT 0x14,R24
(0125) if( !(PINC & 0x08) )
00B1 999B SBIC 0x13,3
00B2 C001 RJMP 0x00B4
(0126) index += 0;
00B3 C00B RJMP 0x00BF
(0127) else if( !(PINC & 0x04) )
00B4 999A SBIC 0x13,2
00B5 C002 RJMP 0x00B8
(0128) index += 4;
00B6 5F0C SUBI R16,0xFC
00B7 C007 RJMP 0x00BF
(0129) else if( !(PINC & 0x02) )
00B8 9999 SBIC 0x13,1
00B9 C002 RJMP 0x00BC
(0130) index += 8;
00BA 5F08 SUBI R16,0xF8
00BB C003 RJMP 0x00BF
(0131) else if( !(PINC & 0x01) )
00BC 9998 SBIC 0x13,0
00BD C001 RJMP 0x00BF
(0132) index += 12;
00BE 5F04 SUBI R16,0xF4
(0133) PORTC = 0xF0; //切换
00BF EF80 LDI R24,0xF0
00C0 BB85 OUT 0x15,R24
(0134) DDRC = 0x0F;
00C1 E08F LDI R24,0xF
00C2 BB84 OUT 0x14,R24
(0135) return index;
00C3 9508 RET
_transmit:
tmp --> Y+1
i --> R20
00C4 940E04BB CALL push_gset1
(0136) }
(0137) //串口传送数据
(0138) void transmit(void)
(0139) {
(0140) uchar i;
(0141) uchar tmp;
(0142) for(i=0;i<10;i++)
00C6 2744 CLR R20
00C7 C007 RJMP 0x00CF
(0143) {
(0144) send(7,7);
00C8 E027 LDI R18,7
00C9 E007 LDI R16,7
00CA DFA4 RCALL _send
(0145) delay(2);
00CB E002 LDI R16,2
00CC E010 LDI R17,0
00CD DF91 RCALL _delay
00CE 9543 INC R20
00CF 304A CPI R20,0xA
00D0 F3B8 BCS 0x00C8
(0146) }
(0147) for(i=0;i<20;i++)
00D1 2744 CLR R20
00D2 C00E RJMP 0x00E1
(0148) {
(0149) while(!(UCSRA&BIT(UDRE)));
00D3 9B5D SBIS 0x0B,5
00D4 CFFE RJMP 0x00D3
(0150) UDR=trans_buf[i];
00D5 E881 LDI R24,0x81
00D6 E090 LDI R25,0
00D7 2FE4 MOV R30,R20
00D8 27FF CLR R31
00D9 0FE8 ADD R30,R24
00DA 1FF9 ADC R31,R25
00DB 8020 LDD R2,Z+0
00DC B82C OUT 0x0C,R2
(0151) delay(1);
00DD E001 LDI R16,1
00DE E010 LDI R17,0
00DF DF7F RCALL _delay
00E0 9543 INC R20
00E1 3144 CPI R20,0x14
00E2 F380 BCS 0x00D3
(0152) }
(0153) }
00E3 940E04BE CALL pop_gset1
00E5 9508 RET
(0154) void port_init(void)
(0155) {
(0156) PORTA = 0x00;
_port_init:
00E6 2422 CLR R2
00E7 BA2B OUT 0x1B,R2
(0157) DDRA = 0xFF;
00E8 EF8F LDI R24,0xFF
00E9 BB8A OUT 0x1A,R24
(0158) PORTB = 0xFF;
00EA BB88 OUT 0x18,R24
(0159) DDRB = 0xFF;
00EB BB87 OUT 0x17,R24
(0160) PORTC = 0xf0; //m103 output only
00EC EF80 LDI R24,0xF0
00ED BB85 OUT 0x15,R24
(0161) DDRC = 0x0f;
00EE E08F LDI R24,0xF
00EF BB84 OUT 0x14,R24
(0162) PORTD = 0xFF;
00F0 EF8F LDI R24,0xFF
00F1 BB82 OUT 0x12,R24
(0163) DDRD = 0xF0;
00F2 EF80 LDI R24,0xF0
00F3 BB81 OUT 0x11,R24
(0164) }
00F4 9508 RET
(0165)
(0166) //TIMER0 initialisation - prescale:64
(0167) // WGM: Normal
(0168) // desired value: 1mSec
(0169) // actual value: 1.000mSec (0.0%)
(0170) void timer0_init(void)
(0171) {
(0172) TCCR0 = 0x00; //stop
_timer0_init:
00F5 2422 CLR R2
00F6 BE23 OUT 0x33,R2
(0173) TCNT0 = 0x83; //set count
00F7 E883 LDI R24,0x83
00F8 BF82 OUT 0x32,R24
(0174) OCR0 = 0x7D; //set compare
00F9 E78D LDI R24,0x7D
00FA BF8C OUT 0x3C,R24
(0175) TCCR0 = 0x03; //start timer
00FB E083 LDI R24,3
00FC BF83 OUT 0x33,R24
(0176) }
00FD 9508 RET
_timer0_ovf_isr:
00FE 938A ST R24,-Y
00FF 939A ST R25,-Y
0100 B78F IN R24,0x3F
0101 938A ST R24,-Y
(0177)
(0178) #pragma interrupt_handler timer0_ovf_isr:10
(0179) void timer0_ovf_isr(void)
(0180) {
(0181) TCNT0 = 0x83; //reload counter value
0102 E883 LDI R24,0x83
0103 BF82 OUT 0x32,R24
(0182) DelayCounter ++;
(0183) SysCounter ++;
0104 91800061 LDS R24,0x61
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -