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

📄 ks0108_12864lcd_m16.lst

📁 ks0108 avr单片机1284显示
💻 LST
📖 第 1 页 / 共 4 页
字号:
     585 9601      ADIW	R24,1
     586 018C      MOVW	R16,R24
     587 3080      CPI	R24,0
     588 0789      CPC	R24,R25
     589 F791      BNE	0x057C
(0241)       }
(0242)    LCD_DATA_PORT_DIR = OUTPUT; // Set data PORT direction back to an output
     58A EF8F      LDI	R24,0xFF
     58B BB8A      OUT	0x1A,R24
(0243)    LCD_INSTR_PORT &= ~LCD_EN;
     58C 9892      CBI	0x12,2
     58D 9508      RET
KS0108_12864LCD.C:LCD_Send_Byte:
_LCD_Send_Byte:
  IVERSE               --> Y,+2
  DATA_FLAG            --> R12
  DATA                 --> R10
     58E 92AA      ST	R10,-Y
     58F 92CA      ST	R12,-Y
     590 2EC2      MOV	R12,R18
     591 2EA0      MOV	R10,R16
(0244)    }     
(0245)    
(0246) /*----------------------------------------------------------------------------*-
(0247) 
(0248)    LCD_Send_Byte()
(0249) 
(0250)    This function writes a byte to the LCD panel.
(0251) 
(0252)    Parameters: 
(0253)    ---------------------------------------------------------------------------
(0254)    Data      : The byte to be written to the LCD
(0255)     
(0256)    DATA_FLAG : If DATA_FLAG == 1, a data byte is sent
(0257)                If DATA_FLAG == 0, a command byte is sent
(0258) 			  
(0259)    IVERSE    : If IVERSE == 1, inverse video mode			   
(0260)                If IVERSE == 0, normal video mode
(0261) 			  
(0262) -*----------------------------------------------------------------------------*/
(0263) static void LCD_Send_Byte(uInt8 DATA, uInt8 DATA_FLAG, uInt8 IVERSE)
(0264)    { 
(0265)    LCD_Read_Busy();
     592 DFDC      RCALL	KS0108_12864LCD.C:LCD_Read_Busy
(0266)      
(0267)    LCD_INSTR_PORT |=  LCD_EN;
     593 9A92      SBI	0x12,2
(0268)    asm("nop");	
     594 0000      NOP
(0269)    asm("nop");
     595 0000      NOP
(0270)    
(0271)    if (DATA_FLAG)
     596 20CC      TST	R12
     597 F011      BEQ	0x059A
(0272)       LCD_INSTR_PORT |=  LCD_DI; // Set data   
     598 9A90      SBI	0x12,0
     599 C001      RJMP	0x059B
(0273)    else
(0274)       LCD_INSTR_PORT &= ~LCD_DI; // Set instruction
     59A 9890      CBI	0x12,0
(0275) 
(0276)    LCD_INSTR_PORT &= ~LCD_RW; // Set write
     59B 9891      CBI	0x12,1
(0277)    
(0278)    if (IVERSE && DATA_FLAG)   
     59C 800A      LDD	R0,Y+2
     59D 2000      TST	R0
     59E F051      BEQ	0x05A9
     59F 20CC      TST	R12
     5A0 F041      BEQ	0x05A9
(0279)       LCD_DATA_PORT = 255 - DATA; // Send inverse data
     5A1 2C2A      MOV	R2,R10
     5A2 2433      CLR	R3
     5A3 EF8F      LDI	R24,0xFF
     5A4 E090      LDI	R25,0
     5A5 1982      SUB	R24,R2
     5A6 0993      SBC	R25,R3
     5A7 BB8B      OUT	0x1B,R24
     5A8 C001      RJMP	0x05AA
(0280)    else
(0281)       LCD_DATA_PORT = DATA; // Send data or instruction
     5A9 BAAB      OUT	0x1B,R10
(0282)    
(0283)    LCD_INSTR_PORT &= ~LCD_EN; // Toggle enable
     5AA 9892      CBI	0x12,2
(0284)    asm("nop");	
     5AB 0000      NOP
(0285)    asm("nop");
     5AC 0000      NOP
     5AD 90C9      LD	R12,Y+
     5AE 90A9      LD	R10,Y+
     5AF 9508      RET
_LCD_Set_XY:
  Y                    --> R20
  X                    --> R22
KS0108_12864LCD.C:LCD_Set_XY:
     5B0 934A      ST	R20,-Y
     5B1 936A      ST	R22,-Y
     5B2 2F42      MOV	R20,R18
     5B3 2F60      MOV	R22,R16
     5B4 9721      SBIW	R28,1
(0286)    }
(0287) 
(0288) /*----------------------------------------------------------------------------*-
(0289)   
(0290)    LCD_Set_XY()
(0291) 
(0292)    Set the DDRAM to a particular address.
(0293) 
(0294)    Used to determine where we write to in the LCD RAM and - thus -
(0295)    whether the text appears on Page 0, page 1, Column 0, Column 1, etc.
(0296) 
(0297)    Params (X, Y) : The DDRAM address we wish to write to. 
(0298)    
(0299)    X range : (Page 0 ~ Page 7), Y range : (0 ~ 127)
(0300) 
(0301) -*----------------------------------------------------------------------------*/
(0302) static void LCD_Set_XY(uInt8 X, uInt8 Y)
(0303)    {
(0304)    if (Y >= 64)
     5B5 3440      CPI	R20,0x40
     5B6 F080      BCS	0x05C7
(0305)       {
(0306)       LCD_INSTR_PORT &= ~LCD_CS1; // Select right side
     5B7 9894      CBI	0x12,4
(0307)       LCD_INSTR_PORT |=  LCD_CS2;
     5B8 9A95      SBI	0x12,5
(0308)       LCD_Send_Byte((DISPLAY_PAGE_SET + X), COMMAND, NORMAL); // Set page 
     5B9 2422      CLR	R2
     5BA 8228      STD	Y+0,R2
     5BB 2722      CLR	R18
     5BC 2F06      MOV	R16,R22
     5BD 5408      SUBI	R16,0x48
     5BE DFCF      RCALL	KS0108_12864LCD.C:LCD_Send_Byte
(0309)       LCD_Send_Byte((DISPLAY_COLUMN_SET + Y - 64), COMMAND, NORMAL); // Set column
     5BF 2422      CLR	R2
     5C0 8228      STD	Y+0,R2
     5C1 2722      CLR	R18
     5C2 2F04      MOV	R16,R20
     5C3 5C00      SUBI	R16,0xC0
     5C4 5400      SUBI	R16,0x40
     5C5 DFC8      RCALL	KS0108_12864LCD.C:LCD_Send_Byte
(0310) 	  }
     5C6 C00E      RJMP	0x05D5
(0311)    else
(0312)       {
(0313)       LCD_INSTR_PORT |=  LCD_CS1; // Select left side
     5C7 9A94      SBI	0x12,4
(0314)       LCD_INSTR_PORT &= ~LCD_CS2;
     5C8 9895      CBI	0x12,5
(0315) 	  LCD_Send_Byte((DISPLAY_PAGE_SET + X), COMMAND, NORMAL); // Set page 
     5C9 2422      CLR	R2
     5CA 8228      STD	Y+0,R2
     5CB 2722      CLR	R18
     5CC 2F06      MOV	R16,R22
     5CD 5408      SUBI	R16,0x48
     5CE DFBF      RCALL	KS0108_12864LCD.C:LCD_Send_Byte
(0316)       LCD_Send_Byte((DISPLAY_COLUMN_SET + Y), COMMAND, NORMAL); // Set column
     5CF 2422      CLR	R2
     5D0 8228      STD	Y+0,R2
     5D1 2722      CLR	R18
     5D2 2F04      MOV	R16,R20
     5D3 5C00      SUBI	R16,0xC0
     5D4 DFB9      RCALL	KS0108_12864LCD.C:LCD_Send_Byte
(0317) 	  }	  	  
     5D5 9621      ADIW	R28,1
     5D6 9169      LD	R22,Y+
     5D7 9149      LD	R20,Y+
     5D8 9508      RET
_LCD_Disp_a_Char:
  cl                   --> R20
  Video_Mode           --> Y,+11
  Char_Value           --> R22
  Y                    --> R10
  X                    --> R12
KS0108_12864LCD.C:LCD_Disp_a_Char:
     5D9 940E 0719 CALL	push_xgsetF03C
     5DB 2EA2      MOV	R10,R18
     5DC 2EC0      MOV	R12,R16
     5DD 9721      SBIW	R28,1
     5DE 8569      LDD	R22,Y+9
(0318)    }
(0319)   
(0320) /*----------------------------------------------------------------------------*-
(0321) 
(0322)    LCD_Disp_a_Char()    
(0323)  
(0324)    Used to determine where we want to dispaly a char on the LCD panel 
(0325)    and - thus - whether the text appears on Page 0, page 1, Column 0, 
(0326)    Column 1, etc.
(0327) 
(0328)    Parameters:  
(0329)    ---------------------------------------------------------------------------
(0330)    X : range (Page 0 ~ Page 7)    
(0331)    Y : range (0 ~ 127)
(0332)    Params (X, Y) : The DDRAM address we wish to write to.
(0333) 
(0334)    Char_Value : The character value which's going to be displayed 
(0335)                 on the LCD panel 
(0336) 			   
(0337)    Video_Mode : If Video_Mode == INVERSE(1), inverse video mode			   
(0338)                 If Video_Mode == NORMAL(0), normal video mode
(0339) 			   
(0340) -*----------------------------------------------------------------------------*/
(0341) static void LCD_Disp_a_Char(uInt8 X, uInt8 Y, uInt8 Char_Value, 
(0342)                             uInt8 Video_Mode)
(0343)    {
(0344)    uInt8 cl;
(0345)    
(0346)    // Fine the char in the lookup table
(0347)    // See "FONT6x8.C" for details
(0348)    Char_Value -= 32;
     5DF 5260      SUBI	R22,0x20
(0349)      
(0350)    for (cl = 0; cl < 6; cl++)
     5E0 2744      CLR	R20
     5E1 C015      RJMP	0x05F7
(0351)       {
(0352) 	  LCD_Set_XY(X, Y + cl);
     5E2 2D2A      MOV	R18,R10
     5E3 0F24      ADD	R18,R20
     5E4 2D0C      MOV	R16,R12
     5E5 DFCA      RCALL	_LCD_Set_XY
(0353)       LCD_Send_Byte(FONT6x8[Char_Value][cl], D_DATA, Video_Mode);
     5E6 840B      LDD	R0,Y+11
     5E7 8208      STD	Y+0,R0
     5E8 E021      LDI	R18,1
     5E9 E086      LDI	R24,6
     5EA 9F86      MUL	R24,R22
     5EB 0110      MOVW	R2,R0
     5EC E880      LDI	R24,0x80
     5ED E090      LDI	R25,0
     5EE 0E28      ADD	R2,R24
     5EF 1E39      ADC	R3,R25
     5F0 2FE4      MOV	R30,R20
     5F1 27FF      CLR	R31
     5F2 0DE2      ADD	R30,R2
     5F3 1DF3      ADC	R31,R3
     5F4 9104      LPM	R16,0(Z)
     5F5 DF98      RCALL	KS0108_12864LCD.C:LCD_Send_Byte
     5F6 9543      INC	R20
     5F7 3046      CPI	R20,6
     5F8 F348      BCS	0x05E2
     5F9 9621      ADIW	R28,1
     5FA 940C 0722 JMP	pop_xgsetF03C
KS0108_12864LCD.C:LCD_Disp_String:
_LCD_Disp_String:
  Video_Mode           --> Y,+11
  pString              --> R20
  Y                    --> R22
  X                    --> R10
     5FC 940E 070B CALL	push_xgsetF00C
     5FE 2F62      MOV	R22,R18
     5FF 2EA0      MOV	R10,R16
     600 9723      SBIW	R28,3
     601 8549      LDD	R20,Y+9
     602 855A      LDD	R21,Y+10
(0354) 	  }
(0355)    }
(0356) 
(0357) /*----------------------------------------------------------------------------*-
(0358)    
(0359)    LCD_Disp_String()
(0360) 
(0361)    Used to determine where we want to dispaly a string on the LCD panel 
(0362)    and - thus - whether the text appears on Page 0, page 1, Column 0, 
(0363)    Column 1, etc.
(0364) 
(0365)    Parameters: 
(0366)    ---------------------------------------------------------------------------
(0367)    X : range (Page 0 ~ Page 7)    
(0368)    Y : range (0 ~ 127)
(0369)    Params (X, Y) : The DDRAM address we wish to write to.
(0370) 
(0371)    pString    : The string pointer point out the string which's going to 
(0372)                 be displayed on the LCD panel
(0373) 
(0374)    Video_Mode : If Video_Mode == INVERSE(1), inverse video mode			   
(0375)                 If Video_Mode == NORMAL(0), normal video mode
(0376) 				   		
(0377) -*----------------------------------------------------------------------------*/
(0378) static void LCD_Disp_String(uInt8 X, uInt8 Y, flash uInt8 * pString, 
(0379)                             uInt8 Video_Mode)
(0380)    {
     603 C00B      RJMP	0x060F
(0381)    while (* pString) 
(0382)       {
(0383)       LCD_Disp_a_Char(X, Y, * pString, Video_Mode);
     604 840B      LDD	R0,Y+11
     605 820A      STD	Y+2,R0
     606 01FA      MOVW	R30,R20
     607 9024      LPM	R2,2(Z)
     608 8228      STD	Y+0,R2
     609 2F26      MOV	R18,R22
     60A 2D0A      MOV	R16,R10
     60B DFCD      RCALL	_LCD_Disp_a_Char
(0384) 	  Y += 6; // Characters are 6x8 pixel
     60C 5F6A      SUBI	R22,0xFA
(0385) 	  pString++;	  
     60D 5F4F      SUBI	R20,0xFF
     60E 4F5F      SBCI	R21,0xFF
     60F 01FA      MOVW	R30,R20
     610 9024      LPM	R2,255(Z)
     611 2022      TST	R2
     612 F789      BNE	0x0604
     613 9623      ADIW	R28,3
     614 940C 0712 JMP	pop_xgsetF00C
_LCD_Disp_Chinese_String:
  nm                   --> R10
  cl                   --> R22
  Video_Mode           --> Y,+21
  pCN_String           --> Y,+19
  Char_Gap             --> Y,+17
  Start_Char           --> Y,+15
  Char_Amount          --> Y,+13
  Char_Length          --> R12
  Y                    --> R14
  X                    --> R20
KS0108_12864LCD.C:LCD_Disp_Chinese_String:
     616 940E 06F6 CALL	push_xgsetF0FC
     618 2EE2      MOV	R14,R18
     619 2F40      MOV	R20,R16
     61A 9721      SBIW	R28,1
     61B 84CB      LDD	R12,Y+11
(0386)       }
(0387)    }   
(0388) 
(0389) /*----------------------------------------------------------------------------*-
(0390) 
(0391)    LCD_Disp_Chinese_String()
(0392)   
(0393)    Display a Chinese String on the LCD panel.
(0394)   
(0395)    Parameters: 
(0396)    ---------------------------------------------------------------------------
(0397)    X, Y        : The Chinese String start coordinates on the LCD panel
(0398)     
(0399)    Char_Length : The Chinese character's length (in pixel)
(0400)    Char_Amount : The amount of Chinese characters 
(0401)    Start_Char  : Which Chinese character should be display first in the array
(0402)    Char_Gap    : The space between on characters to another (in pixel)
(0403)    
(0404)    Video_Mode  : If Video_Mode == INVERSE(1), inverse video mode			   
(0405)                  If Video_Mode == NORMAL(0), normal video mode
(0406) 	
(0407) -*----------------------------------------------------------------------------*/                        
(0408) static void LCD_Disp_Chinese_String (uInt8 X, uInt8 Y, 
(0409)                                      uInt8 Char_Length, uInt8 Char_Amount,
(0410)                                      uInt8 Start_Char, uInt8 Char_Gap,
(0411) 									 flash uInt8 (* pCN_String)[32], 
(0412) 									 uInt8 Video_Mode)
(0413)    {
(0414)    uInt8 cl, nm; 
(0415)     
(0416)    for (nm = 0; nm < Char_Amount; )
     61C 24AA      CLR	R10
     61D C02F      RJMP	0x064D
(0417)       {
(0418)       for (cl = 0; cl < Char_Length * 2; cl++) // Send a Chinese character
     61E 2766      CLR	R22
     61F C023      RJMP	0x0643
(0419)          { 
(0420)       	 if (cl >= Char_Length)  
     620 156C      CP	R22,R12
     621 F038      BCS	0x0629
(0421)             { 
(0422) 			// Send below part of a Chinese character
(0423) 			LCD_Set_XY(X + 1, Y + cl - Char_Length);
     622 2D2E      MOV	R18,R14
     623 0F26      ADD	R18,R22
     624 192C      SUB	R18,R12
     625 2F04      MOV	R16,R20
     626 5F0F      SUBI	R16,0xFF
     627 DF88      RCALL	_LCD_Set_XY
(0424) 			}
     628 C004      RJMP	0x062D
(0425)          else
(0426) 		    {
(0427) 		    // Set coordinates    
(0428)             LCD_Set_XY(X, Y + cl);
     629 2D2E      MOV	R18,R14
     62A 0F26      ADD	R18,R22
     62B 2F04      MOV	R16,R20
     62C DF83      RCALL	_LCD_Set_XY
(0429) 			}
(0430)  
(0431)       	 LCD_Send_Byte(* (* (pCN_String + Start_Char + nm)+ cl), 
     62D 880D      LDD	R0,Y+21
     62E 8208      STD	Y+0,R0
     62F E021      LDI	R18,1
     630 E280      LDI	R24,0x20

⌨️ 快捷键说明

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