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

📄 ps2_lcm1602.lss

📁 WINAVR编写的PS2键盘驱动
💻 LSS
📖 第 1 页 / 共 5 页
字号:
     8a2:	f8 94       	cli
     8a4:	de bf       	out	0x3e, r29	; 62
     8a6:	0f be       	out	0x3f, r0	; 63
     8a8:	cd bf       	out	0x3d, r28	; 61
     8aa:	89 83       	std	Y+1, r24	; 0x01
     8ac:	6a 83       	std	Y+2, r22	; 0x02
	if(Busy)
     8ae:	8a 81       	ldd	r24, Y+2	; 0x02
     8b0:	88 23       	and	r24, r24
     8b2:	11 f0       	breq	.+4      	; 0x8b8 <LCM1602WriteCommand+0x22>
	{
		LCM1602BusyWait();                 //根据需要检测忙
     8b4:	0e 94 23 04 	call	0x846 <LCM1602BusyWait>
	}
	RS_CLR;    
     8b8:	80 91 32 00 	lds	r24, 0x0032
     8bc:	8f 7e       	andi	r24, 0xEF	; 239
     8be:	80 93 32 00 	sts	0x0032, r24
	RW_CLR;                              //当RS和RW共同为低电平时可以写入指令或者显示地址
     8c2:	80 91 32 00 	lds	r24, 0x0032
     8c6:	8f 7d       	andi	r24, 0xDF	; 223
     8c8:	80 93 32 00 	sts	0x0032, r24
	DB_PORT=com;
     8cc:	89 81       	ldd	r24, Y+1	; 0x01
     8ce:	80 93 38 00 	sts	0x0038, r24
	E_SET;
     8d2:	80 91 32 00 	lds	r24, 0x0032
     8d6:	80 68       	ori	r24, 0x80	; 128
     8d8:	80 93 32 00 	sts	0x0032, r24
	E_CLR;
     8dc:	9f e7       	ldi	r25, 0x7F	; 127
     8de:	80 91 32 00 	lds	r24, 0x0032
     8e2:	89 23       	and	r24, r25
     8e4:	80 93 32 00 	sts	0x0032, r24
     8e8:	22 96       	adiw	r28, 0x02	; 2
     8ea:	0f b6       	in	r0, 0x3f	; 63
     8ec:	f8 94       	cli
     8ee:	de bf       	out	0x3e, r29	; 62
     8f0:	0f be       	out	0x3f, r0	; 63
     8f2:	cd bf       	out	0x3d, r28	; 61
     8f4:	df 91       	pop	r29
     8f6:	cf 91       	pop	r28
     8f8:	08 95       	ret

000008fa <LCM1602WriteData>:
}

//向1602写入数据
void LCM1602WriteData(uchar dat)
{
     8fa:	cf 93       	push	r28
     8fc:	df 93       	push	r29
     8fe:	cd b7       	in	r28, 0x3d	; 61
     900:	de b7       	in	r29, 0x3e	; 62
     902:	21 97       	sbiw	r28, 0x01	; 1
     904:	0f b6       	in	r0, 0x3f	; 63
     906:	f8 94       	cli
     908:	de bf       	out	0x3e, r29	; 62
     90a:	0f be       	out	0x3f, r0	; 63
     90c:	cd bf       	out	0x3d, r28	; 61
     90e:	89 83       	std	Y+1, r24	; 0x01
	LCM1602BusyWait();
     910:	0e 94 23 04 	call	0x846 <LCM1602BusyWait>
	RS_SET;   
     914:	80 91 32 00 	lds	r24, 0x0032
     918:	80 61       	ori	r24, 0x10	; 16
     91a:	80 93 32 00 	sts	0x0032, r24
	RW_CLR;                             //当RS为高电平RW为低电平时可以写入数据
     91e:	80 91 32 00 	lds	r24, 0x0032
     922:	8f 7d       	andi	r24, 0xDF	; 223
     924:	80 93 32 00 	sts	0x0032, r24
	DB_PORT=dat;
     928:	89 81       	ldd	r24, Y+1	; 0x01
     92a:	80 93 38 00 	sts	0x0038, r24
	E_SET;
     92e:	80 91 32 00 	lds	r24, 0x0032
     932:	80 68       	ori	r24, 0x80	; 128
     934:	80 93 32 00 	sts	0x0032, r24
	E_CLR;
     938:	9f e7       	ldi	r25, 0x7F	; 127
     93a:	80 91 32 00 	lds	r24, 0x0032
     93e:	89 23       	and	r24, r25
     940:	80 93 32 00 	sts	0x0032, r24
     944:	21 96       	adiw	r28, 0x01	; 1
     946:	0f b6       	in	r0, 0x3f	; 63
     948:	f8 94       	cli
     94a:	de bf       	out	0x3e, r29	; 62
     94c:	0f be       	out	0x3f, r0	; 63
     94e:	cd bf       	out	0x3d, r28	; 61
     950:	df 91       	pop	r29
     952:	cf 91       	pop	r28
     954:	08 95       	ret

00000956 <LCD_set_xy>:
}


/*-----------------------------------------------------------------------
LCD_set_xy        : 设置LCD显示的起始位置
输入参数x、y      : 显示字符串的位置,X:0-15,Y:0-1
                    LCD第一行显示寄存器地址:0X80-0X8F
                    LCD第一行显示寄存器地址:0XC0-0XCF
-----------------------------------------------------------------------*/
void LCD_set_xy(uchar x,uchar y ) 
{
     956:	cf 93       	push	r28
     958:	df 93       	push	r29
     95a:	cd b7       	in	r28, 0x3d	; 61
     95c:	de b7       	in	r29, 0x3e	; 62
     95e:	23 97       	sbiw	r28, 0x03	; 3
     960:	0f b6       	in	r0, 0x3f	; 63
     962:	f8 94       	cli
     964:	de bf       	out	0x3e, r29	; 62
     966:	0f be       	out	0x3f, r0	; 63
     968:	cd bf       	out	0x3d, r28	; 61
     96a:	89 83       	std	Y+1, r24	; 0x01
     96c:	6a 83       	std	Y+2, r22	; 0x02
    uchar address;
    if (y == 0) address = 0x80 + x;  //第一行
     96e:	8a 81       	ldd	r24, Y+2	; 0x02
     970:	88 23       	and	r24, r24
     972:	29 f4       	brne	.+10     	; 0x97e <LCD_set_xy+0x28>
     974:	80 e8       	ldi	r24, 0x80	; 128
     976:	99 81       	ldd	r25, Y+1	; 0x01
     978:	89 0f       	add	r24, r25
     97a:	8b 83       	std	Y+3, r24	; 0x03
     97c:	04 c0       	rjmp	.+8      	; 0x986 <LCD_set_xy+0x30>
    else   address = 0xc0 + x;       //第二行
     97e:	80 ec       	ldi	r24, 0xC0	; 192
     980:	99 81       	ldd	r25, Y+1	; 0x01
     982:	89 0f       	add	r24, r25
     984:	8b 83       	std	Y+3, r24	; 0x03
    LCM1602WriteCommand(address,1);
     986:	61 e0       	ldi	r22, 0x01	; 1
     988:	8b 81       	ldd	r24, Y+3	; 0x03
     98a:	0e 94 4b 04 	call	0x896 <LCM1602WriteCommand>
     98e:	23 96       	adiw	r28, 0x03	; 3
     990:	0f b6       	in	r0, 0x3f	; 63
     992:	f8 94       	cli
     994:	de bf       	out	0x3e, r29	; 62
     996:	0f be       	out	0x3f, r0	; 63
     998:	cd bf       	out	0x3d, r28	; 61
     99a:	df 91       	pop	r29
     99c:	cf 91       	pop	r28
     99e:	08 95       	ret

000009a0 <LCM1602Write_String>:
}


//英文字符串显示函数
void LCM1602Write_String(uchar x,uchar y,uchar *string)
{
     9a0:	cf 93       	push	r28
     9a2:	df 93       	push	r29
     9a4:	cd b7       	in	r28, 0x3d	; 61
     9a6:	de b7       	in	r29, 0x3e	; 62
     9a8:	24 97       	sbiw	r28, 0x04	; 4
     9aa:	0f b6       	in	r0, 0x3f	; 63
     9ac:	f8 94       	cli
     9ae:	de bf       	out	0x3e, r29	; 62
     9b0:	0f be       	out	0x3f, r0	; 63
     9b2:	cd bf       	out	0x3d, r28	; 61
     9b4:	89 83       	std	Y+1, r24	; 0x01
     9b6:	6a 83       	std	Y+2, r22	; 0x02
     9b8:	5c 83       	std	Y+4, r21	; 0x04
     9ba:	4b 83       	std	Y+3, r20	; 0x03
	if(x>=XSIZE||y>=YSIZE||string==NULL)return;
     9bc:	89 81       	ldd	r24, Y+1	; 0x01
     9be:	80 31       	cpi	r24, 0x10	; 16
     9c0:	18 f5       	brcc	.+70     	; 0xa08 <LCM1602Write_String+0x68>
     9c2:	8a 81       	ldd	r24, Y+2	; 0x02
     9c4:	82 30       	cpi	r24, 0x02	; 2
     9c6:	00 f5       	brcc	.+64     	; 0xa08 <LCM1602Write_String+0x68>
     9c8:	8b 81       	ldd	r24, Y+3	; 0x03
     9ca:	9c 81       	ldd	r25, Y+4	; 0x04
     9cc:	00 97       	sbiw	r24, 0x00	; 0
     9ce:	09 f4       	brne	.+2      	; 0x9d2 <LCM1602Write_String+0x32>
     9d0:	1b c0       	rjmp	.+54     	; 0xa08 <LCM1602Write_String+0x68>
	LCD_set_xy(x, y);
     9d2:	6a 81       	ldd	r22, Y+2	; 0x02
     9d4:	89 81       	ldd	r24, Y+1	; 0x01
     9d6:	0e 94 ab 04 	call	0x956 <LCD_set_xy>
	while(x<XSIZE&&*string>=0x20)
     9da:	89 81       	ldd	r24, Y+1	; 0x01
     9dc:	80 31       	cpi	r24, 0x10	; 16
     9de:	a0 f4       	brcc	.+40     	; 0xa08 <LCM1602Write_String+0x68>
     9e0:	eb 81       	ldd	r30, Y+3	; 0x03
     9e2:	fc 81       	ldd	r31, Y+4	; 0x04
     9e4:	80 81       	ld	r24, Z
     9e6:	80 32       	cpi	r24, 0x20	; 32
     9e8:	78 f0       	brcs	.+30     	; 0xa08 <LCM1602Write_String+0x68>
	{
	LCM1602WriteData(*string++);
     9ea:	de 01       	movw	r26, r28
     9ec:	13 96       	adiw	r26, 0x03	; 3
     9ee:	ed 91       	ld	r30, X+
     9f0:	fc 91       	ld	r31, X
     9f2:	11 97       	sbiw	r26, 0x01	; 1
     9f4:	80 81       	ld	r24, Z
     9f6:	31 96       	adiw	r30, 0x01	; 1
     9f8:	ed 93       	st	X+, r30
     9fa:	fc 93       	st	X, r31
     9fc:	0e 94 7d 04 	call	0x8fa <LCM1602WriteData>
	x++;
     a00:	89 81       	ldd	r24, Y+1	; 0x01
     a02:	8f 5f       	subi	r24, 0xFF	; 255
     a04:	89 83       	std	Y+1, r24	; 0x01
     a06:	e9 cf       	rjmp	.-46     	; 0x9da <LCM1602Write_String+0x3a>
     a08:	24 96       	adiw	r28, 0x04	; 4
     a0a:	0f b6       	in	r0, 0x3f	; 63
     a0c:	f8 94       	cli
     a0e:	de bf       	out	0x3e, r29	; 62
     a10:	0f be       	out	0x3f, r0	; 63
     a12:	cd bf       	out	0x3d, r28	; 61
     a14:	df 91       	pop	r29
     a16:	cf 91       	pop	r28
     a18:	08 95       	ret

00000a1a <LCM1602Write_number>:
  }
}


//两位数字显示函数
void LCM1602Write_number(uchar number)
{
     a1a:	cf 93       	push	r28
     a1c:	df 93       	push	r29
     a1e:	cd b7       	in	r28, 0x3d	; 61
     a20:	de b7       	in	r29, 0x3e	; 62
     a22:	23 97       	sbiw	r28, 0x03	; 3
     a24:	0f b6       	in	r0, 0x3f	; 63
     a26:	f8 94       	cli
     a28:	de bf       	out	0x3e, r29	; 62
     a2a:	0f be       	out	0x3f, r0	; 63
     a2c:	cd bf       	out	0x3d, r28	; 61
     a2e:	89 83       	std	Y+1, r24	; 0x01
	uchar x,y;
	x=number/10;
     a30:	89 81       	ldd	r24, Y+1	; 0x01
     a32:	9a e0       	ldi	r25, 0x0A	; 10
     a34:	69 2f       	mov	r22, r25
     a36:	0e 94 b1 08 	call	0x1162 <__udivmodqi4>
     a3a:	8a 83       	std	Y+2, r24	; 0x02
	y=number-10*x;
     a3c:	9a 81       	ldd	r25, Y+2	; 0x02
     a3e:	8a e0       	ldi	r24, 0x0A	; 10
     a40:	98 9f       	mul	r25, r24
     a42:	c0 01       	movw	r24, r0
     a44:	11 24       	eor	r1, r1
     a46:	29 81       	ldd	r18, Y+1	; 0x01
     a48:	28 1b       	sub	r18, r24
     a4a:	82 2f       	mov	r24, r18
     a4c:	8b 83       	std	Y+3, r24	; 0x03
	LCM1602WriteData(x+0x30);
     a4e:	8a 81       	ldd	r24, Y+2	; 0x02
     a50:	80 5d       	subi	r24, 0xD0	; 208
     a52:	0e 94 7d 04 	call	0x8fa <LCM1602WriteData>
	LCM1602WriteData(y+0x30);
     a56:	8b 81       	ldd	r24, Y+3	; 0x03
     a58:	80 5d       	subi	r24, 0xD0	; 208
     a5a:	0e 94 7d 04 	call	0x8fa <LCM1602WriteData>
     a5e:	23 96       	adiw	r28, 0x03	; 3
     a60:	0f b6       	in	r0, 0x3f	; 63
     a62:	f8 94       	cli
     a64:	de bf       	out	0x3e, r29	; 62
     a66:	0f be       	out	0x3f, r0	; 63
     a68:	cd bf       	out	0x3d, r28	; 61
     a6a:	df 91       	pop	r29
     a6c:	cf 91       	pop	r28
     a6e:	08 95       	ret

00000a70 <RunString>:
}



/***************************************************************************
  函数说明:滚屏字幕效果                               
  输入:    (需要滚屏的字符串, x起始位置,x终止位置,y坐标,方向)                
***************************************************************************/
void RunString(uchar *String,uchar StartX,uchar EndX,uchar Y,uchar Direction)
{   
     a70:	0f 93       	push	r16
     a72:	cf 93       	push	r28
     a74:	df 93       	push	r29
     a76:	cd b7       	in	r28, 0x3d	; 61
     a78:	de b7       	in	r29, 0x3e	; 62
     a7a:	a6 97       	sbiw	r28, 0x26	; 38
     a7c:	0f b6       	in	r0, 0x3f	; 63
     a7e:	f8 94       	cli
     a80:	de bf       	out	0x3e, r29	; 62
     a82:	0f be       	out	0x3f, r0	; 63
     a84:	cd bf       	out	0x3d, r28	; 61
     a86:	9a 83       	std	Y+2, r25	; 0x02
     a88:	89 83       	std	Y+1, r24	; 0x01
     a8a:	6b 83       	std	Y+3, r22	; 0x03
     a8c:	4c 83       	std	Y+4, r20	; 0x04
     a8e:	2d 83       	std	Y+5, r18	; 0x05
     a90:	0e 83       	std	Y+6, r16	; 0x06
	static uchar StringHead = 0;//StringHead为每次滚动后第一个要显示的字符号
	uchar Screen[17];
	uchar a = 0 ;
     a92:	18 8e       	std	Y+24, r1	; 0x18
	uchar Point = StringHead;//Point当前这次显示的字符串的第一个字符
     a94:	80 91 8a 01 	lds	r24, 0x018A
     a98:	89 8f       	std	Y+25, r24	; 0x19
	uchar StringLong = StringLength(String);//字符串的长度
     a9a:	89 81       	ldd	r24, Y+1	; 0x01
     a9c:	9a 81       	ldd	r25, Y+2	; 0x02
     a9e:	0e 94 89 06 	call	0xd12 <StringLength>
     aa2:	8a 8f       	std	Y+26, r24	; 0x1a
   The maximal possible delay is 262.14 ms / F_CPU in MHz.
 */
void
_delay_ms(double __ms)
{
     aa4:	80 e0       	ldi	r24, 0x00	; 0
     aa6:	90 e0       	ldi	r25, 0x00	; 0
     aa8:	a0 e0       	ldi	r26, 0x00	; 0
     aaa:	b1 e4       	ldi	r27, 0x41	; 65
     aac:	8b 8f       	std	Y+27, r24	; 0x1b
     aae:	9c 8f       	std	Y+28, r25	; 0x1c
     ab0:	ad 8f       	std	Y+29, r26	; 0x1d
     ab2:	be 8f       	std	Y+30, r27	; 0x1e
	uint16_t __ticks;
	double __tmp = ((F_CPU) / 4e3) * __ms;
     ab4:	26 e6       	ldi	r18, 0x66	; 102
     ab6:	36 e6       	ldi	r19, 0x66	; 102
     ab8:	46 ee       	ldi	r20, 0xE6	; 230

⌨️ 快捷键说明

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