lcd-16sm.lis
来自「大量ATMEGA16实例, 都可以运行,包括驱动LCD1602, 上位机显示等多」· LIS 代码 · 共 1,093 行 · 第 1/3 页
LIS
1,093 行
008C ; data -> R10
.even
008C _wr_data::
008C AA92 st -y,R10
008E A02E mov R10,R16
0090 .dbline -1
0090 .dbline 115
0090 ; }
0090 ;
0090 ; void wr_data(unsigned char data)
0090 ; {
0090 .dbline 116
0090 ; DDRA=0xff;
0090 8FEF ldi R24,255
0092 8ABB out 0x1a,R24
0094 .dbline 117
0094 ; PORTA=0b00000001; //PA0 <-- 1, Select data register
0094 81E0 ldi R24,1
0096 8BBB out 0x1b,R24
0098 .dbline 118
0098 ; PORTB=data; //Send out data
0098 A8BA out 0x18,R10
009A .dbline 119
009A ; delay(1);
009A 01E0 ldi R16,1
009C 10E0 ldi R17,0
009E BEDF xcall _delay
00A0 .dbline 120
00A0 ; PORTA=0b00000101; //Enable write to Data register
00A0 85E0 ldi R24,5
00A2 8BBB out 0x1b,R24
00A4 .dbline 121
00A4 ; delay(2);
00A4 02E0 ldi R16,2
00A6 10E0 ldi R17,0
00A8 B9DF xcall _delay
00AA .dbline 122
00AA ; PORTA=0b00000000; //disable ????
00AA 2224 clr R2
00AC 2BBA out 0x1b,R2
00AE .dbline 123
00AE ; delay(1);
00AE 01E0 ldi R16,1
00B0 10E0 ldi R17,0
00B2 B4DF xcall _delay
00B4 .dbline -2
00B4 L14:
00B4 .dbline 0 ; func end
00B4 A990 ld R10,y+
00B6 0895 ret
00B8 .dbsym r data 10 c
00B8 .dbend
00B8 .dbfunc e wr_instruction2 _wr_instruction2 fV
00B8 ; flags -> <dead>
00B8 ; instr -> R10
.even
00B8 _wr_instruction2::
00B8 AA92 st -y,R10
00BA A02E mov R10,R16
00BC .dbline -1
00BC .dbline 130
00BC ; }
00BC ;
00BC ; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00BC ; // Following functions for LCD panel control
00BC ;
00BC ; void wr_instruction2(unsigned char instr)
00BC ; {
00BC .dbline 132
00BC ; unsigned char flags;
00BC ; delay(10);
00BC 0AE0 ldi R16,10
00BE 10E0 ldi R17,0
00C0 ADDF xcall _delay
00C2 .dbline 133
00C2 ; wr_instruction(instr);
00C2 0A2D mov R16,R10
00C4 CADF xcall _wr_instruction
00C6 .dbline 134
00C6 ; delay(10);
00C6 0AE0 ldi R16,10
00C8 10E0 ldi R17,0
00CA A8DF xcall _delay
00CC .dbline -2
00CC L15:
00CC .dbline 0 ; func end
00CC A990 ld R10,y+
00CE 0895 ret
00D0 .dbsym l flags 1 c
00D0 .dbsym r instr 10 c
00D0 .dbend
00D0 .dbfunc e wr_data2 _wr_data2 fV
00D0 ; flags -> <dead>
00D0 ; data -> R10
.even
00D0 _wr_data2::
00D0 AA92 st -y,R10
00D2 A02E mov R10,R16
00D4 .dbline -1
00D4 .dbline 138
00D4 ; }
00D4 ;
00D4 ; void wr_data2(unsigned char data)
00D4 ; {
00D4 .dbline 140
00D4 ; unsigned char flags;
00D4 ; if(cursor_index==0x10)
00D4 80910A00 lds R24,_cursor_index
00D8 90910B00 lds R25,_cursor_index+1
00DC 8031 cpi R24,16
00DE E0E0 ldi R30,0
00E0 9E07 cpc R25,R30
00E2 11F4 brne L17
00E4 X2:
00E4 .dbline 141
00E4 ; cursor_line2();
00E4 37D0 xcall _cursor_line2
00E6 09C0 xjmp L18
00E8 L17:
00E8 .dbline 142
00E8 ; else if(cursor_index==0x50)
00E8 80910A00 lds R24,_cursor_index
00EC 90910B00 lds R25,_cursor_index+1
00F0 8035 cpi R24,80
00F2 E0E0 ldi R30,0
00F4 9E07 cpc R25,R30
00F6 09F4 brne L19
00F8 X3:
00F8 .dbline 143
00F8 ; cursor_line1();
00F8 21D0 xcall _cursor_line1
00FA L19:
00FA L18:
00FA .dbline 144
00FA ; wr_data(data);
00FA 0A2D mov R16,R10
00FC C7DF xcall _wr_data
00FE .dbline 145
00FE ; cursor_index++;
00FE 80910A00 lds R24,_cursor_index
0102 90910B00 lds R25,_cursor_index+1
0106 0196 adiw R24,1
0108 90930B00 sts _cursor_index+1,R25
010C 80930A00 sts _cursor_index,R24
0110 .dbline 146
0110 ; delay(50);
0110 02E3 ldi R16,50
0112 10E0 ldi R17,0
0114 83DF xcall _delay
0116 .dbline -2
0116 L16:
0116 .dbline 0 ; func end
0116 A990 ld R10,y+
0118 0895 ret
011A .dbsym l flags 1 c
011A .dbsym r data 10 c
011A .dbend
011A .dbfunc e cursor_home _cursor_home fV
.even
011A _cursor_home::
011A .dbline -1
011A .dbline 150
011A ; }
011A ;
011A ; void cursor_home(void) //Move cursor to Home
011A ; {
011A .dbline 151
011A ; wr_instruction2(0x01);
011A 01E0 ldi R16,1
011C CDDF xcall _wr_instruction2
011E .dbline 152
011E ; delay(10);
011E 0AE0 ldi R16,10
0120 10E0 ldi R17,0
0122 7CDF xcall _delay
0124 .dbline 153
0124 ; wr_instruction2(0x80);
0124 00E8 ldi R16,128
0126 C8DF xcall _wr_instruction2
0128 .dbline 154
0128 ; ldelay(5);
0128 05E0 ldi R16,5
012A 10E0 ldi R17,0
012C 86DF xcall _ldelay
012E .dbline 155
012E ; cursor_index=0;
012E 2224 clr R2
0130 3324 clr R3
0132 30920B00 sts _cursor_index+1,R3
0136 20920A00 sts _cursor_index,R2
013A .dbline -2
013A L21:
013A .dbline 0 ; func end
013A 0895 ret
013C .dbend
013C .dbfunc e cursor_line1 _cursor_line1 fV
.even
013C _cursor_line1::
013C .dbline -1
013C .dbline 159
013C ; }
013C ;
013C ; void cursor_line1(void) //Move cursor to the first line
013C ; {
013C .dbline 160
013C ; wr_instruction2(0x80);
013C 00E8 ldi R16,128
013E BCDF xcall _wr_instruction2
0140 .dbline 161
0140 ; cursor_index=0;
0140 2224 clr R2
0142 3324 clr R3
0144 30920B00 sts _cursor_index+1,R3
0148 20920A00 sts _cursor_index,R2
014C .dbline 162
014C ; ldelay(5);
014C 05E0 ldi R16,5
014E 10E0 ldi R17,0
0150 74DF xcall _ldelay
0152 .dbline -2
0152 L22:
0152 .dbline 0 ; func end
0152 0895 ret
0154 .dbend
0154 .dbfunc e cursor_line2 _cursor_line2 fV
.even
0154 _cursor_line2::
0154 .dbline -1
0154 .dbline 166
0154 ; }
0154 ;
0154 ; void cursor_line2(void) //Move cursor to the second line
0154 ; {
0154 .dbline 167
0154 ; wr_instruction2(0b11000000);
0154 00EC ldi R16,192
0156 B0DF xcall _wr_instruction2
0158 .dbline 168
0158 ; cursor_index=0x40;
0158 80E4 ldi R24,64
015A 90E0 ldi R25,0
015C 90930B00 sts _cursor_index+1,R25
0160 80930A00 sts _cursor_index,R24
0164 .dbline 169
0164 ; ldelay(2);
0164 02E0 ldi R16,2
0166 10E0 ldi R17,0
0168 68DF xcall _ldelay
016A .dbline -2
016A L23:
016A .dbline 0 ; func end
016A 0895 ret
016C .dbend
016C .dbfunc e space _space fV
.even
016C _space::
016C .dbline -1
016C .dbline 173
016C ; }
016C ;
016C ; void space(void) //Write space, ' ', on the panel
016C ; {
016C .dbline 174
016C ; wr_data2(' ');
016C 00E2 ldi R16,32
016E B0DF xcall _wr_data2
0170 .dbline -2
0170 L24:
0170 .dbline 0 ; func end
0170 0895 ret
0172 .dbend
0172 .dbfunc e out_string _out_string fV
0172 ; onechar -> R12
0172 ; i -> R20,R21
0172 ; array -> R10,R11
.even
0172 _out_string::
0172 0E940000 xcall push_xgset303C
0176 5801 movw R10,R16
0178 .dbline -1
0178 .dbline 178
0178 ; }
0178 ;
0178 ; void out_string(const char array[]) //Send a string stored in array to LCD panel
0178 ; {
0178 .dbline 179
0178 ; int i=0;
0178 4427 clr R20
017A 5527 clr R21
017C .dbline 181
017C ; unsigned char onechar;
017C ; i=0;
017C 09C0 xjmp L27
017E L26:
017E .dbline 183
017E ; while(array[i])
017E ; {
017E .dbline 184
017E ; onechar=array[i++];
017E 1A01 movw R2,R20
0180 4F5F subi R20,255 ; offset = 1
0182 5F4F sbci R21,255
0184 F101 movw R30,R2
0186 EA0D add R30,R10
0188 FB1D adc R31,R11
018A C690 elpm R12,Z
018C .dbline 185
018C ; wr_data2(onechar);
018C 0C2D mov R16,R12
018E A0DF xcall _wr_data2
0190 .dbline 186
0190 ; }
0190 L27:
0190 .dbline 182
0190 FA01 movw R30,R20
0192 EA0D add R30,R10
0194 FB1D adc R31,R11
0196 2690 elpm R2,Z
0198 2220 tst R2
019A 89F7 brne L26
019C X4:
019C .dbline -2
019C L25:
019C .dbline 0 ; func end
019C 0C940000 xjmp pop_xgset303C
01A0 .dbsym r onechar 12 c
01A0 .dbsym r i 20 I
01A0 .dbsym r array 10 pkc
01A0 .dbend
01A0 .dbfunc e lcd_on _lcd_on fV
01A0 ; ctrl_data -> <dead>
01A0 ; i -> <dead>
.even
01A0 _lcd_on::
01A0 .dbline -1
01A0 .dbline 190
01A0 ; }
01A0 ;
01A0 ; void lcd_on(void)
01A0 ; {
01A0 .dbline 192
01A0 ; unsigned char i, ctrl_data;
01A0 ; ldelay(20);
01A0 04E1 ldi R16,20
01A2 10E0 ldi R17,0
01A4 4ADF xcall _ldelay
01A6 .dbline 193
01A6 ; PORTD=0x01;
01A6 81E0 ldi R24,1
01A8 82BB out 0x12,R24
01AA .dbline 194
01AA ; ldelay(40);
01AA 08E2 ldi R16,40
01AC 10E0 ldi R17,0
01AE 45DF xcall _ldelay
01B0 .dbline 195
01B0 ; wr_instruction(0b00110000); //Function Set:set 8-bit, 2line, 5x7 fonts
01B0 00E3 ldi R16,48
01B2 53DF xcall _wr_instruction
01B4 .dbline 196
01B4 ; ldelay(2);
01B4 02E0 ldi R16,2
01B6 10E0 ldi R17,0
01B8 40DF xcall _ldelay
01BA .dbline 197
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?