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

📄 main.lis

📁 一个关于AVR单片机的例程
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 00E6           ; 
 00E6           ;     //  Set output bits on port B,设置输出口;
 00E6           ;     DDRB |= LCD_RST_PIN | LCD_DC_PIN | LCD_CE_PIN | SPI_MOSI_PIN | SPI_CLK_PIN;
 00E6 87B3              in R24,0x17
 00E8 876A              ori R24,167
 00EA 87BB              out 0x17,R24
 00EC                   .dbline 143
 00EC           ; 
 00EC           ;     Delay();
 00EC 4BD0              xcall _Delay
 00EE                   .dbline 146
 00EE           ; 
 00EE           ;     //  Toggle display reset pin.
 00EE           ;     PORTB &= ~LCD_RST_PIN; //上电复位;
 00EE C098              cbi 0x18,0
 00F0                   .dbline 147
 00F0           ;     Delay();
 00F0 49D0              xcall _Delay
 00F2                   .dbline 148
 00F2           ;     PORTB |= LCD_RST_PIN;  //复位完;
 00F2 C09A              sbi 0x18,0
 00F4                   .dbline 151
 00F4           ; 
 00F4           ;     //  SPI初始化;Enable SPI port: No interrupt, MSBit first, Master mode, CPOL->0, CPHA->0, Clk/4
 00F4           ;     SPCR = BIT(SPE)|BIT(MSTR); //使能SPI,主机模式;
 00F4 80E5              ldi R24,80
 00F6 8DB9              out 0xd,R24
 00F8                   .dbline 156
 00F8           ;     //SPSR = 0x00;  //似乎不用这几句也能正常运行;
 00F8           ;     //Clear= SPSR;
 00F8           ;     //Clear= SPDR;
 00F8           ;     //  Disable LCD controller
 00F8           ;     PORTB |= LCD_CE_PIN;       
 00F8 C19A              sbi 0x18,1
 00FA                   .dbline 158
 00FA           ; 
 00FA           ;     LcdSend( 0x21, 0 );  // LCD Extended Commands.
 00FA 2227              clr R18
 00FC 01E2              ldi R16,33
 00FE 37D0              xcall _LcdSend
 0100                   .dbline 159
 0100           ;     LcdSend( 0xC8, 0 );  // Set LCD Vop (Contrast).
 0100 2227              clr R18
 0102 08EC              ldi R16,200
 0104 34D0              xcall _LcdSend
 0106                   .dbline 160
 0106           ;     LcdSend( 0x06, 0 );  // Set Temp coefficent.
 0106 2227              clr R18
 0108 06E0              ldi R16,6
 010A 31D0              xcall _LcdSend
 010C                   .dbline 161
 010C           ;     LcdSend( 0x13, 0 );  // LCD bias mode 1:48.
 010C 2227              clr R18
 010E 03E1              ldi R16,19
 0110 2ED0              xcall _LcdSend
 0112                   .dbline 162
 0112           ;     LcdSend( 0x20, 0 );  // LCD Standard Commands, Horizontal addressing mode.
 0112 2227              clr R18
 0114 00E2              ldi R16,32
 0116 2BD0              xcall _LcdSend
 0118                   .dbline 163
 0118           ;     LcdSend( 0x0C, 0 );  // LCD in normal mode.
 0118 2227              clr R18
 011A 0CE0              ldi R16,12
 011C 28D0              xcall _LcdSend
 011E                   .dbline 165
 011E           ; 
 011E           ;     LcdClear();
 011E 01D0              xcall _LcdClear
 0120                   .dbline -2
 0120           L32:
 0120                   .dbline 0 ; func end
 0120 0895              ret
 0122                   .dbend
 0122                   .dbfunc e LcdClear _LcdClear fV
 0122           ;              i -> R20,R21
                        .even
 0122           _LcdClear::
 0122 0E940000          xcall push_gset1
 0126                   .dbline -1
 0126                   .dbline 177
 0126           ;    
 0126           ; }
 0126           ; 
 0126           ; 
 0126           ; /*--------------------------------------------------------------------------------------------------
 0126           ;   Name         :  LcdClear
 0126           ;   Description  :  Clears the display.
 0126           ;   Argument(s)  :  None.
 0126           ;   Return value :  None.
 0126           ; --------------------------------------------------------------------------------------------------*/
 0126           ; void LcdClear(void)
 0126           ; {
 0126                   .dbline 180
 0126           ; unsigned int i;
 0126           ; 
 0126           ; LcdSend(0x0c, 0); 
 0126 2227              clr R18
 0128 0CE0              ldi R16,12
 012A 21D0              xcall _LcdSend
 012C                   .dbline 181
 012C           ; LcdSend(0x80, 0); //此时默认操作为清屏
 012C 2227              clr R18
 012E 00E8              ldi R16,128
 0130 1ED0              xcall _LcdSend
 0132                   .dbline 183
 0132           ; 
 0132           ; for (i=0; i<504; i++)
 0132 4427              clr R20
 0134 5527              clr R21
 0136 05C0              xjmp L37
 0138           L34:
 0138                   .dbline 184
 0138 21E0              ldi R18,1
 013A 0027              clr R16
 013C 18D0              xcall _LcdSend
 013E           L35:
 013E                   .dbline 183
 013E 4F5F              subi R20,255  ; offset = 1
 0140 5F4F              sbci R21,255
 0142           L37:
 0142                   .dbline 183
 0142 483F              cpi R20,248
 0144 E1E0              ldi R30,1
 0146 5E07              cpc R21,R30
 0148 B8F3              brlo L34
 014A                   .dbline -2
 014A           L33:
 014A 0E940000          xcall pop_gset1
 014E                   .dbline 0 ; func end
 014E 0895              ret
 0150                   .dbsym r i 20 i
 0150                   .dbend
 0150                   .dbfunc e LcdGotoXY _LcdGotoXY fV
 0150           ;              Y -> R22
 0150           ;              X -> R20
                        .even
 0150           _LcdGotoXY::
 0150 0E940000          xcall push_gset2
 0154 622F              mov R22,R18
 0156 402F              mov R20,R16
 0158                   .dbline -1
 0158                   .dbline 196
 0158           ; LcdSend(0, 1); 
 0158           ; }
 0158           ; 
 0158           ; 
 0158           ; 
 0158           ; /*--------------------------------------------------------------------------------------------------
 0158           ;   Name         :  LcdGotoXY 设置块坐标
 0158           ;   Description  :  Sets cursor location to xy location corresponding to basic font size.
 0158           ;   Argument(s)  :  x, y -> Coordinate for new cursor position. Range: 1,1 .. 14,6
 0158           ;   Return value :  None.
 0158           ; --------------------------------------------------------------------------------------------------*/
 0158           ; void LcdGotoXY(unsigned char X, unsigned char Y)
 0158           ; {
 0158                   .dbline 197
 0158           ; LcdSend(0x40 | Y, 0); // column
 0158 2227              clr R18
 015A 062F              mov R16,R22
 015C 0064              ori R16,64
 015E 07D0              xcall _LcdSend
 0160                   .dbline 198
 0160           ; LcdSend(0x80 | X, 0); // row
 0160 2227              clr R18
 0162 042F              mov R16,R20
 0164 0068              ori R16,128
 0166 03D0              xcall _LcdSend
 0168                   .dbline -2
 0168           L38:
 0168 0E940000          xcall pop_gset2
 016C                   .dbline 0 ; func end
 016C 0895              ret
 016E                   .dbsym r Y 22 c
 016E                   .dbsym r X 20 c
 016E                   .dbend
 016E                   .dbfunc s LcdSend _LcdSend fV
 016E           ;        command -> R18
 016E           ;           data -> R16
                        .even
 016E           _LcdSend:
 016E                   .dbline -1
 016E                   .dbline 209
 016E           ; }
 016E           ; 
 016E           ; /*--------------------------------------------------------------------------------------------------
 016E           ;   Name         :  LcdSend
 016E           ;   Description  :  Sends data to display controller.
 016E           ;   Argument(s)  :  data -> Data to be sent
 016E           ;                   cd   -> Command or data (see/use enum)
 016E           ;   Return value :  None.
 016E           ; --------------------------------------------------------------------------------------------------*/
 016E           ; static void LcdSend (unsigned char data, unsigned char command)
 016E           ; {
 016E                   .dbline 210
 016E           ; PORTB &= ~LCD_CE_PIN ; // 使能LCD
 016E C198              cbi 0x18,1
 0170                   .dbline 211
 0170           ; if (command == 0)
 0170 2223              tst R18
 0172 11F4              brne L40
 0174                   .dbline 212
 0174           ; PORTB &= ~LCD_DC_PIN ; // 传送命令
 0174 C298              cbi 0x18,2
 0176 01C0              xjmp L41
 0178           L40:
 0178                   .dbline 214
 0178           ; else
 0178           ; PORTB |= LCD_DC_PIN ; // 传送数据
 0178 C29A              sbi 0x18,2
 017A           L41:
 017A                   .dbline 216
 017A           ; 
 017A           ; SPDR = data; // 传送数据到SPI寄存器
 017A 0FB9              out 0xf,R16
 017C           L42:
 017C                   .dbline 218
 017C           L43:
 017C                   .dbline 218
 017C           ; 
 017C           ; while ((SPSR & 0x80) == 0); // 等待数据传送完毕
 017C 779B              sbis 0xe,7
 017E FECF              rjmp L42
 0180                   .dbline 220
 0180           ; 
 0180           ; PORTB |= LCD_CE_PIN ; // 关闭LCD
 0180 C19A              sbi 0x18,1
 0182                   .dbline -2
 0182           L39:
 0182                   .dbline 0 ; func end
 0182 0895              ret
 0184                   .dbsym r command 18 c
 0184                   .dbsym r data 16 c
 0184                   .dbend
 0184                   .dbfunc s Delay _Delay fV
 0184           ;              i -> R16,R17
                        .even
 0184           _Delay:
 0184                   .dbline -1
 0184                   .dbline 229
 0184           ; }
 0184           ; /*--------------------------------------------------------------------------------------------------
 0184           ;   Name         :  Delay
 0184           ;   Description  :  Uncalibrated delay for LCD init routine.
 0184           ;   Argument(s)  :  None.
 0184           ;   Return value :  None.
 0184           ; --------------------------------------------------------------------------------------------------*/
 0184           ; static void Delay ( void )
 0184           ; {
 0184                   .dbline 231
 0184 00E2              ldi R16,-12000
 0186 11ED              ldi R17,-47
 0188           L46:
 0188                   .dbline 231
 0188           L47:
 0188                   .dbline 231
 0188           ;     int i;
 0188           ;     for ( i = -12000; i < 12000; i++ );
 0188 0F5F              subi R16,255  ; offset = 1
 018A 1F4F              sbci R17,255
 018C                   .dbline 231
 018C 003E              cpi R16,224
 018E EEE2              ldi R30,46
 0190 1E07              cpc R17,R30
 0192 D4F3              brlt L46
 0194                   .dbline -2
 0194           L45:
 0194                   .dbline 0 ; func end
 0194 0895              ret
 0196                   .dbsym r i 16 I
 0196                   .dbend
 0196                   .dbfunc e lcd_show _lcd_show fV
 0196           ;            tmp -> R20
 0196           ;              i -> R22
 0196           ;            DOT -> R10,R11
 0196           ;              r -> R12,R13
                        .even
 0196           _lcd_show::
 0196 0E940000          xcall push_gset4
 019A 5901              movw R10,R18
 019C 6801              movw R12,R16
 019E                   .dbline -1
 019E                   .dbline 235
 019E           ; }
 019E           ; 
 019E           ; void lcd_show(unsigned int r,unsigned int DOT)
 019E           ; {
 019E                   .dbline 236
 019E           ;  unsigned char tmp=0,i=0;
 019E 4427              clr R20
 01A0                   .dbline 236
 01A0 6627              clr R22
 01A2                   .dbline 237
 01A2           ;  if(r >1000)
 01A2 88EE              ldi R24,1000
 01A4 93E0              ldi R25,3
 01A6 8C15              cp R24,R12
 01A8 9D05              cpc R25,R13
 01AA C0F4              brsh L51
 01AC                   .dbline 238
 01AC           ;  {
 01AC                   .dbline 239
 01AC           ;   tmp=r/1000;
 01AC 28EE              ldi R18,1000
 01AE 33E0              ldi R19,3
 01B0 8601              movw R16,R12
 01B2 0E940000          xcall div16u
 01B6 402F              mov R20,R16
 01B8                   .dbline 240
 01B8           ;   for(i=0;i<5;i++)
 01B8 0FC0              xjmp L56
 01BA           L53:
 01BA                   .dbline 241
 01BA 21E0              ldi R18,1
 01BC 85E0              ldi R24,5
 01BE 849F              mul R24,R20
 01C0 1001              movw R2,R0
 01C2 80E0              ldi R24,<_FontLookup
 01C4 90E0              ldi R25,>_FontLookup
 01C6 280E              add R2,R24
 01C8 391E              adc R3,R25
 01CA E62F              mov R30,R22
 01CC FF27              clr R31
 01CE E20D              add R30,R2
 01D0 F31D              adc R31,R3
 01D2 0491              lpm R16,Z
 01D4 CCDF              xcall _LcdSend
 01D6           L54:
 01D6                   .dbline 240
 01D6 6395              inc R22
 01D8           L56:
 01D8                   .dbline 240
 01D8 6530              cpi R22,5
 01DA 78F3              brlo L53
 01DC                   .dbline 242
 01DC           ;     LcdSend(FontLookup[tmp][i],1);
 01DC           ;  }
 01DC           L51:
 01DC                   .dbline 243
 01DC           ;  if(r >100)
 01DC 84E6              ldi R24,100

⌨️ 快捷键说明

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