📄 st7920.lis
字号:
.module ST7920.c
.area text(rom, con, rel)
0000 .dbfile F:\毕业设计\LCM12864\ST7920.c
0000 .dbfunc e Delayus _Delayus fV
0000 ; i -> y+0
0000 ; x -> y+8
.even
0000 _Delayus::
0000 0E940000 xcall push_arg4
0004 2897 sbiw R28,8
0006 .dbline -1
0006 .dbline 10
0006 ; #include "ST7920.h"
0006 ; void Delayus(ulong x);
0006 ; void Delayms(uchar x);
0006 ; void BUSYLOOP(void);
0006 ; void WriteCommand(uchar command);
0006 ; void WriteData(uchar data);
0006 ;
0006 ; /**********************延时程序START********************************/
0006 ; void Delayus(ulong x)
0006 ; { ulong i;
0006 .dbline 11
0006 ; i = x<<4;
0006 84E0 ldi R24,4
0008 90E0 ldi R25,0
000A 0885 ldd R16,y+8
000C 1985 ldd R17,y+9
000E 2A85 ldd R18,y+10
0010 3B85 ldd R19,y+11
0012 8A93 st -y,R24
0014 0E940000 xcall lsl32
0018 0883 std y+0,R16
001A 1983 std y+1,R17
001C 2A83 std y+2,R18
001E 3B83 std y+3,R19
0020 L2:
0020 .dbline 12
0020 ; while(i--);
0020 L3:
0020 .dbline 12
0020 2880 ldd R2,y+0
0022 3980 ldd R3,y+1
0024 4A80 ldd R4,y+2
0026 5B80 ldd R5,y+3
0028 2C82 std y+4,R2
002A 3D82 std y+5,R3
002C 4E82 std y+6,R4
002E 5F82 std y+7,R5
0030 81E0 ldi R24,1
0032 90E0 ldi R25,0
0034 A0E0 ldi R26,0
0036 B0E0 ldi R27,0
0038 2C80 ldd R2,y+4
003A 3D80 ldd R3,y+5
003C 4E80 ldd R4,y+6
003E 5F80 ldd R5,y+7
0040 281A sub R2,R24
0042 390A sbc R3,R25
0044 4A0A sbc R4,R26
0046 5B0A sbc R5,R27
0048 2882 std y+0,R2
004A 3982 std y+1,R3
004C 4A82 std y+2,R4
004E 5B82 std y+3,R5
0050 2C80 ldd R2,y+4
0052 3D80 ldd R3,y+5
0054 4E80 ldd R4,y+6
0056 5F80 ldd R5,y+7
0058 00E0 ldi R16,0
005A 2016 cp R2,R16
005C 3006 cpc R3,R16
005E 4006 cpc R4,R16
0060 5006 cpc R5,R16
0062 F1F6 brne L2
0064 X0:
0064 .dbline -2
0064 L1:
0064 .dbline 0 ; func end
0064 2C96 adiw R28,12
0066 0895 ret
0068 .dbsym l i 0 l
0068 .dbsym l x 8 l
0068 .dbend
0068 .dbfunc e Delayms _Delayms fV
0068 ; i -> R20,R21
0068 ; x -> R10
.even
0068 _Delayms::
0068 0E940000 xcall push_xgset300C
006C A02E mov R10,R16
006E .dbline -1
006E .dbline 15
006E ; }
006E ; void Delayms(uchar x)
006E ; { uint i;
006E .dbline 16
006E ; i = x;
006E 4A2D mov R20,R10
0070 5527 clr R21
0072 05C0 xjmp L7
0074 L6:
0074 .dbline 17
0074 ; while(i--)Delayus(1000);
0074 08EE ldi R16,232
0076 13E0 ldi R17,3
0078 20E0 ldi R18,0
007A 30E0 ldi R19,0
007C C1DF xcall _Delayus
007E L7:
007E .dbline 17
007E 1A01 movw R2,R20
0080 4150 subi R20,1
0082 5040 sbci R21,0
0084 2220 tst R2
0086 B1F7 brne L6
0088 3320 tst R3
008A A1F7 brne L6
008C X1:
008C .dbline -2
008C L5:
008C .dbline 0 ; func end
008C 0C940000 xjmp pop_xgset300C
0090 .dbsym r i 20 i
0090 .dbsym r x 10 c
0090 .dbend
0090 .dbfunc e BUSYLOOP _BUSYLOOP fV
.even
0090 _BUSYLOOP::
0090 .dbline -1
0090 .dbline 20
0090 ; }
0090 ; void BUSYLOOP(void)
0090 ; {
0090 .dbline 21
0090 ; Delayus(10);
0090 0AE0 ldi R16,10
0092 10E0 ldi R17,0
0094 20E0 ldi R18,0
0096 30E0 ldi R19,0
0098 B3DF xcall _Delayus
009A .dbline -2
009A L9:
009A .dbline 0 ; func end
009A 0895 ret
009C .dbend
009C .dbfunc e lcm_out _lcm_out fV
009C ; d -> R22
009C ; i -> R20
009C ; a -> R16
.even
009C _lcm_out::
009C 4A93 st -y,R20
009E 6A93 st -y,R22
00A0 .dbline -1
00A0 .dbline 27
00A0 ; }
00A0 ; /**********************延时程序END********************************/
00A0 ;
00A0 ; /**********************串行方式相关程序START*********************/
00A0 ; void lcm_out(uchar a)
00A0 ; {
00A0 .dbline 29
00A0 ; char i,d;
00A0 ; for(i=0;i<8;i++)
00A0 4427 clr R20
00A2 0AC0 xjmp L14
00A4 L11:
00A4 .dbline 30
00A4 ; {
00A4 .dbline 31
00A4 ; clrbit(LCD_CTRL,E);
00A4 C798 cbi 0x18,7
00A6 .dbline 32
00A6 ; d=a&0x80;
00A6 602F mov R22,R16
00A8 6078 andi R22,128
00AA .dbline 33
00AA ; if(d)
00AA 11F0 breq L15
00AC X2:
00AC .dbline 34
00AC ; setbit(LCD_CTRL,RW);
00AC C69A sbi 0x18,6
00AE 01C0 xjmp L16
00B0 L15:
00B0 .dbline 36
00B0 ; else
00B0 ; clrbit(LCD_CTRL,RW);
00B0 C698 cbi 0x18,6
00B2 L16:
00B2 .dbline 37
00B2 ; a<<=1;
00B2 000F lsl R16
00B4 .dbline 38
00B4 ; setbit(LCD_CTRL,E); //上升弦发送
00B4 C79A sbi 0x18,7
00B6 .dbline 39
00B6 ; }
00B6 L12:
00B6 .dbline 29
00B6 4395 inc R20
00B8 L14:
00B8 .dbline 29
00B8 4830 cpi R20,8
00BA A0F3 brlo L11
00BC X3:
00BC .dbline -2
00BC L10:
00BC .dbline 0 ; func end
00BC 6991 ld R22,y+
00BE 4991 ld R20,y+
00C0 0895 ret
00C2 .dbsym r d 22 c
00C2 .dbsym r i 20 c
00C2 .dbsym r a 16 c
00C2 .dbend
00C2 .dbfunc e WriteCommand _WriteCommand fV
00C2 ; s -> R20
00C2 ; command -> R22
.even
00C2 _WriteCommand::
00C2 4A93 st -y,R20
00C4 6A93 st -y,R22
00C6 602F mov R22,R16
00C8 .dbline -1
00C8 .dbline 44
00C8 ; }
00C8 ;
00C8 ;
00C8 ; void WriteCommand(uchar command) //发送命令字
00C8 ; {
00C8 .dbline 46
00C8 ; uchar s; //,i;
00C8 ; s=command&0xf0;
00C8 462F mov R20,R22
00CA 407F andi R20,240
00CC .dbline 47
00CC ; lcm_out(0xf8); //送写命令指令 1111 1 RW=0 RS=0 0
00CC 08EF ldi R16,248
00CE E6DF xcall _lcm_out
00D0 .dbline 48
00D0 ; lcm_out(s); //发送高四位数据
00D0 042F mov R16,R20
00D2 E4DF xcall _lcm_out
00D4 .dbline 49
00D4 ; s=command&0x0f;
00D4 462F mov R20,R22
00D6 4F70 andi R20,15
00D8 .dbline 50
00D8 ; s<<=4;
00D8 842F mov R24,R20
00DA 8F70 andi R24,#0x0F
00DC 8295 swap R24
00DE 482F mov R20,R24
00E0 .dbline 51
00E0 ; lcm_out(s); //发送低四位数据
00E0 082F mov R16,R24
00E2 DCDF xcall _lcm_out
00E4 .dbline -2
00E4 L17:
00E4 .dbline 0 ; func end
00E4 6991 ld R22,y+
00E6 4991 ld R20,y+
00E8 0895 ret
00EA .dbsym r s 20 c
00EA .dbsym r command 22 c
00EA .dbend
00EA .dbfunc e WriteData _WriteData fV
00EA ; s -> R20
00EA ; data -> R22
.even
00EA _WriteData::
00EA 4A93 st -y,R20
00EC 6A93 st -y,R22
00EE 602F mov R22,R16
00F0 .dbline -1
00F0 .dbline 57
00F0 ; //for(i=1;i>0;i--)BUSYLOOP(); //延时10us 延时后写命令就消失?
00F0 ; }
00F0 ;
00F0 ;
00F0 ; void WriteData(uchar data)
00F0 ; {
00F0 .dbline 60
00F0 ;
00F0 ; uchar s; //,i;
00F0 ; s=data&0xf0;
00F0 462F mov R20,R22
00F2 407F andi R20,240
00F4 .dbline 61
00F4 ; lcm_out(0xfa); //送写数据指令 1111 1 RW=0 RS=1 0
00F4 0AEF ldi R16,250
00F6 D2DF xcall _lcm_out
00F8 .dbline 62
00F8 ; lcm_out(s);
00F8 042F mov R16,R20
00FA D0DF xcall _lcm_out
00FC .dbline 63
00FC ; s=data&0x0f;
00FC 462F mov R20,R22
00FE 4F70 andi R20,15
0100 .dbline 64
0100 ; s<<=4;
0100 842F mov R24,R20
0102 8F70 andi R24,#0x0F
0104 8295 swap R24
0106 482F mov R20,R24
0108 .dbline 65
0108 ; lcm_out(s);
0108 082F mov R16,R24
010A C8DF xcall _lcm_out
010C .dbline -2
010C L18:
010C .dbline 0 ; func end
010C 6991 ld R22,y+
010E 4991 ld R20,y+
0110 0895 ret
0112 .dbsym r s 20 c
0112 .dbsym r data 22 c
0112 .dbend
0112 .dbfunc e lcdSetXY _lcdSetXY fV
0112 ; position -> R20
0112 ; y -> R10
0112 ; x -> R22
.even
0112 _lcdSetXY::
0112 0E940000 xcall push_xgsetF00C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -