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

📄 jianpan.lst

📁 实现3*3 键盘的控制。从而实现用键盘来对单片机进行控制。
💻 LST
📖 第 1 页 / 共 4 页
字号:
__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 + -