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

📄 ps2_lcm1602.lss

📁 WINAVR编写的PS2键盘驱动
💻 LSS
📖 第 1 页 / 共 5 页
字号:

ps2_lcm1602.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000011a2  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000126  00800060  000011a2  00001236  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000052  00800186  00800186  0000135c  2**0
                  ALLOC
  3 .noinit       00000000  008001d8  008001d8  0000135c  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  0000135c  2**0
                  CONTENTS
  5 .stab         00001eb4  00000000  00000000  0000135c  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      00000c5f  00000000  00000000  00003210  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
       0:	0c 94 2a 00 	jmp	0x54 <__ctors_end>
       4:	0c 94 9f 00 	jmp	0x13e <__vector_1>
       8:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
       c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      10:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      14:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      18:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      1c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      20:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      24:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      28:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      2c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      30:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      34:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      38:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      3c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      40:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      44:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      48:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      4c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      50:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>

00000054 <__ctors_end>:
      54:	11 24       	eor	r1, r1
      56:	1f be       	out	0x3f, r1	; 63
      58:	cf e5       	ldi	r28, 0x5F	; 95
      5a:	d4 e0       	ldi	r29, 0x04	; 4
      5c:	de bf       	out	0x3e, r29	; 62
      5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
      60:	11 e0       	ldi	r17, 0x01	; 1
      62:	a0 e6       	ldi	r26, 0x60	; 96
      64:	b0 e0       	ldi	r27, 0x00	; 0
      66:	e2 ea       	ldi	r30, 0xA2	; 162
      68:	f1 e1       	ldi	r31, 0x11	; 17
      6a:	02 c0       	rjmp	.+4      	; 0x70 <.do_copy_data_start>

0000006c <.do_copy_data_loop>:
      6c:	05 90       	lpm	r0, Z+
      6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
      70:	a6 38       	cpi	r26, 0x86	; 134
      72:	b1 07       	cpc	r27, r17
      74:	d9 f7       	brne	.-10     	; 0x6c <.do_copy_data_loop>

00000076 <__do_clear_bss>:
      76:	11 e0       	ldi	r17, 0x01	; 1
      78:	a6 e8       	ldi	r26, 0x86	; 134
      7a:	b1 e0       	ldi	r27, 0x01	; 1
      7c:	01 c0       	rjmp	.+2      	; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
      7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
      80:	a8 3d       	cpi	r26, 0xD8	; 216
      82:	b1 07       	cpc	r27, r17
      84:	e1 f7       	brne	.-8      	; 0x7e <.do_clear_bss_loop>
      86:	0c 94 47 00 	jmp	0x8e <main>

0000008a <__bad_interrupt>:
      8a:	0c 94 00 00 	jmp	0x0 <__vectors>

0000008e <main>:
#include "kb.h" 
#include "type.h"

int main(void)
{
      8e:	ca e5       	ldi	r28, 0x5A	; 90
      90:	d4 e0       	ldi	r29, 0x04	; 4
      92:	de bf       	out	0x3e, r29	; 62
      94:	cd bf       	out	0x3d, r28	; 61
 char *str1,*str2;
 str1="TQT input words!";
      96:	80 e6       	ldi	r24, 0x60	; 96
      98:	90 e0       	ldi	r25, 0x00	; 0
      9a:	9a 83       	std	Y+2, r25	; 0x02
      9c:	89 83       	std	Y+1, r24	; 0x01
 str2="ken:";
      9e:	81 e7       	ldi	r24, 0x71	; 113
      a0:	90 e0       	ldi	r25, 0x00	; 0
      a2:	9c 83       	std	Y+4, r25	; 0x04
      a4:	8b 83       	std	Y+3, r24	; 0x03

 
 GICR= (1<<INT0);                   // 使能外部中断INT0,GICR通用中断控制寄存器,0x40
      a6:	80 e4       	ldi	r24, 0x40	; 64
      a8:	80 93 5b 00 	sts	0x005B, r24

 InitKeyBoard();                    // 键盘初始化
      ac:	0e 94 81 00 	call	0x102 <InitKeyBoard>
 LCM1602Init();                     // lcm1602初始化
      b0:	0e 94 a4 02 	call	0x548 <LCM1602Init>


 
 LCM1602Write_String(0,0,str1);
      b4:	49 81       	ldd	r20, Y+1	; 0x01
      b6:	5a 81       	ldd	r21, Y+2	; 0x02
      b8:	60 e0       	ldi	r22, 0x00	; 0
      ba:	80 e0       	ldi	r24, 0x00	; 0
      bc:	0e 94 d0 04 	call	0x9a0 <LCM1602Write_String>
 LCM1602Write_String(0,1,str2);
      c0:	4b 81       	ldd	r20, Y+3	; 0x03
      c2:	5c 81       	ldd	r21, Y+4	; 0x04
      c4:	61 e0       	ldi	r22, 0x01	; 1
      c6:	80 e0       	ldi	r24, 0x00	; 0
      c8:	0e 94 d0 04 	call	0x9a0 <LCM1602Write_String>

 while(1)
    {
	
    uchar key = getchar_kb();
      cc:	0e 94 33 02 	call	0x466 <getchar_kb>
      d0:	8d 83       	std	Y+5, r24	; 0x05
		if(key=='*') 
      d2:	8d 81       	ldd	r24, Y+5	; 0x05
      d4:	8a 32       	cpi	r24, 0x2A	; 42
      d6:	89 f4       	brne	.+34     	; 0xfa <main+0x6c>
		{
		  LCM1602WriteCommand(0x01,1);        //如果键盘输入*,清屏
      d8:	61 e0       	ldi	r22, 0x01	; 1
      da:	81 e0       	ldi	r24, 0x01	; 1
      dc:	0e 94 4b 04 	call	0x896 <LCM1602WriteCommand>
		  LCM1602Write_String(0,0,str1);
      e0:	49 81       	ldd	r20, Y+1	; 0x01
      e2:	5a 81       	ldd	r21, Y+2	; 0x02
      e4:	60 e0       	ldi	r22, 0x00	; 0
      e6:	80 e0       	ldi	r24, 0x00	; 0
      e8:	0e 94 d0 04 	call	0x9a0 <LCM1602Write_String>
      LCM1602Write_String(0,1,str2);
      ec:	4b 81       	ldd	r20, Y+3	; 0x03
      ee:	5c 81       	ldd	r21, Y+4	; 0x04
      f0:	61 e0       	ldi	r22, 0x01	; 1
      f2:	80 e0       	ldi	r24, 0x00	; 0
      f4:	0e 94 d0 04 	call	0x9a0 <LCM1602Write_String>
      f8:	e9 cf       	rjmp	.-46     	; 0xcc <main+0x3e>
		}
		else LCM1602WriteData(key);
      fa:	8d 81       	ldd	r24, Y+5	; 0x05
      fc:	0e 94 7d 04 	call	0x8fa <LCM1602WriteData>
     100:	e5 cf       	rjmp	.-54     	; 0xcc <main+0x3e>

00000102 <InitKeyBoard>:
作者         :ken
日期         :2007-8-18
------------------------------------------------------------*/ 
void InitKeyBoard(void)
{
     102:	cf 93       	push	r28
     104:	df 93       	push	r29
     106:	cd b7       	in	r28, 0x3d	; 61
     108:	de b7       	in	r29, 0x3e	; 62
    inpt =  kb_buffer;                        // 初始化键盘缓冲区
     10a:	87 e9       	ldi	r24, 0x97	; 151
     10c:	91 e0       	ldi	r25, 0x01	; 1
     10e:	90 93 92 01 	sts	0x0192, r25
     112:	80 93 91 01 	sts	0x0191, r24
    outpt = kb_buffer;
     116:	87 e9       	ldi	r24, 0x97	; 151
     118:	91 e0       	ldi	r25, 0x01	; 1
     11a:	90 93 95 01 	sts	0x0195, r25
     11e:	80 93 94 01 	sts	0x0194, r24
    buffcnt = 0;
     122:	10 92 d7 01 	sts	0x01D7, r1

    MCUCR = (1<<ISC01);                      // INT0下降沿有效
     126:	82 e0       	ldi	r24, 0x02	; 2
     128:	80 93 55 00 	sts	0x0055, r24
    edge = 0;                                // 0 = 下降沿  1 = 上升沿
     12c:	10 92 96 01 	sts	0x0196, r1
    bitcount = 11;                           // PS2传输一帧数据是11位,一个起始位,一个奇偶校验位,一个停止位。
     130:	8b e0       	ldi	r24, 0x0B	; 11
     132:	80 93 93 01 	sts	0x0193, r24
    sei();                                   // 开全局中断
     136:	78 94       	sei
     138:	df 91       	pop	r29
     13a:	cf 91       	pop	r28
     13c:	08 95       	ret

0000013e <__vector_1>:
}


/*-----------------------------------------------------------
INT0_interrupt:处理键盘中断服务程序
输入参数      :无
输出参数      :无
作者          :ken
日期          :2007-8-18
------------------------------------------------------------*/ 
SIGNAL(SIG_INTERRUPT0)                           //PSCLK与PD2即INT0连接,下降沿读取PSDAT的数据
{
     13e:	1f 92       	push	r1
     140:	0f 92       	push	r0
     142:	0f b6       	in	r0, 0x3f	; 63
     144:	0f 92       	push	r0
     146:	11 24       	eor	r1, r1
     148:	2f 93       	push	r18
     14a:	3f 93       	push	r19
     14c:	4f 93       	push	r20
     14e:	5f 93       	push	r21
     150:	6f 93       	push	r22
     152:	7f 93       	push	r23
     154:	8f 93       	push	r24
     156:	9f 93       	push	r25
     158:	af 93       	push	r26
     15a:	bf 93       	push	r27
     15c:	ef 93       	push	r30
     15e:	ff 93       	push	r31
     160:	cf 93       	push	r28
     162:	df 93       	push	r29
     164:	cd b7       	in	r28, 0x3d	; 61
     166:	de b7       	in	r29, 0x3e	; 62
    static unsigned char data;                 // data用来保存接收到的数据。

        if(bitcount < 11 && bitcount > 2)       // 3-10位是数据位. 忽略起始位,校验位,停止位
     168:	80 91 93 01 	lds	r24, 0x0193
     16c:	8b 30       	cpi	r24, 0x0B	; 11
     16e:	a8 f4       	brcc	.+42     	; 0x19a <__vector_1+0x5c>
     170:	80 91 93 01 	lds	r24, 0x0193
     174:	83 30       	cpi	r24, 0x03	; 3
     176:	88 f0       	brcs	.+34     	; 0x19a <__vector_1+0x5c>
        {                                      
            data = (data >> 1);                 //因为PS2协议是低位在前的,所以要右移
     178:	80 91 86 01 	lds	r24, 0x0186
     17c:	86 95       	lsr	r24
     17e:	80 93 86 01 	sts	0x0186, r24
            if(PIND & (1<<PSDAT))              
     182:	80 91 30 00 	lds	r24, 0x0030
     186:	99 27       	eor	r25, r25
     188:	80 74       	andi	r24, 0x40	; 64
     18a:	90 70       	andi	r25, 0x00	; 0
     18c:	00 97       	sbiw	r24, 0x00	; 0
     18e:	29 f0       	breq	.+10     	; 0x19a <__vector_1+0x5c>
                data = data | 0x80;             
     190:	80 91 86 01 	lds	r24, 0x0186
     194:	80 68       	ori	r24, 0x80	; 128
     196:	80 93 86 01 	sts	0x0186, r24
        }

        if(--bitcount == 0)                    // 11位数据都接收完,进入解码程序
     19a:	80 91 93 01 	lds	r24, 0x0193
     19e:	81 50       	subi	r24, 0x01	; 1
     1a0:	80 93 93 01 	sts	0x0193, r24
     1a4:	88 23       	and	r24, r24
     1a6:	39 f4       	brne	.+14     	; 0x1b6 <__vector_1+0x78>
        {
            decode(data);
     1a8:	80 91 86 01 	lds	r24, 0x0186
     1ac:	0e 94 ee 00 	call	0x1dc <decode>
            bitcount = 11;
     1b0:	8b e0       	ldi	r24, 0x0B	; 11
     1b2:	80 93 93 01 	sts	0x0193, r24
     1b6:	df 91       	pop	r29
     1b8:	cf 91       	pop	r28
     1ba:	ff 91       	pop	r31
     1bc:	ef 91       	pop	r30
     1be:	bf 91       	pop	r27
     1c0:	af 91       	pop	r26
     1c2:	9f 91       	pop	r25
     1c4:	8f 91       	pop	r24
     1c6:	7f 91       	pop	r23
     1c8:	6f 91       	pop	r22
     1ca:	5f 91       	pop	r21
     1cc:	4f 91       	pop	r20
     1ce:	3f 91       	pop	r19
     1d0:	2f 91       	pop	r18
     1d2:	0f 90       	pop	r0
     1d4:	0f be       	out	0x3f, r0	; 63
     1d6:	0f 90       	pop	r0
     1d8:	1f 90       	pop	r1
     1da:	18 95       	reti

000001dc <decode>:
        }
 }

/*-----------------------------------------------------------
decode        :解码键码程序
输入参数 sc   :8bit原始代码数据
输出参数      :无
作者          :ken
日期          :2007-8-18
------------------------------------------------------------*/ 
void decode(unsigned char sc)
{
     1dc:	cf 93       	push	r28
     1de:	df 93       	push	r29
     1e0:	cd b7       	in	r28, 0x3d	; 61
     1e2:	de b7       	in	r29, 0x3e	; 62
     1e4:	26 97       	sbiw	r28, 0x06	; 6
     1e6:	0f b6       	in	r0, 0x3f	; 63
     1e8:	f8 94       	cli
     1ea:	de bf       	out	0x3e, r29	; 62
     1ec:	0f be       	out	0x3f, r0	; 63
     1ee:	cd bf       	out	0x3d, r28	; 61
     1f0:	89 83       	std	Y+1, r24	; 0x01
    static unsigned char is_up=0, shift = 0, mode = 0;
    unsigned char i;
 
    if (!is_up)              // Last data received was the up-key identifier
     1f2:	80 91 87 01 	lds	r24, 0x0187
     1f6:	88 23       	and	r24, r24
     1f8:	09 f0       	breq	.+2      	; 0x1fc <decode+0x20>
     1fa:	c2 c0       	rjmp	.+388    	; 0x380 <decode+0x1a4>
    {
        switch (sc)
     1fc:	89 81       	ldd	r24, Y+1	; 0x01

⌨️ 快捷键说明

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