📄 ps2_lcm1602.lss
字号:
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 + -