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

📄 test.lst

📁 mage16,LCM1604驱动8线,调试成功
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0022) /**********************************************************
(0023) TC16xxB LCD DISPLAY
(0024) 建立时间:2006年08月30日
(0025) 修改日期:2006年08月30日
(0026) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0027)                    入命令
(0028) LCD第一行显示寄存器地址:0x80-0x8F
(0029) LCD第二行显示寄存器地址:0xC0-0xCF
(0030) **********************************************************/
(0031) void LCD16xx_init(void)
(0032) {
(0033)     LCD_DATA_DDR |=  LCD_DATA;
_LCD16xx_init:
    010C B384      IN	R24,0x14
    010D 6F8F      ORI	R24,0xFF
    010E BB84      OUT	0x14,R24
(0034)     LCD_EN_DDR   |=  LCD_EN;
    010F 9A8F      SBI	0x11,7
(0035)     LCD_RS_DDR   |=  LCD_RS;
    0110 9A8E      SBI	0x11,6
(0036) 
(0037) 	
(0038)     LCD_DATA_PORT = 0xff;
    0111 EF8F      LDI	R24,0xFF
    0112 BB85      OUT	0x15,R24
(0039)     LCD16xx_en_write();
    0113 D011      RCALL	_LCD16xx_en_write
(0040) 	delay_nus(100);
    0114 E604      LDI	R16,0x64
    0115 E010      LDI	R17,0
    0116 940E00EA  CALL	_delay_nus
(0041) 
(0042)     LCD16xx_write_char(0,0x38);      //4bit test
    0118 E328      LDI	R18,0x38
    0119 2700      CLR	R16
    011A D015      RCALL	_LCD16xx_write_char
(0043)     LCD16xx_write_char(0,0x0c);      //显示开
    011B E02C      LDI	R18,0xC
    011C 2700      CLR	R16
    011D D012      RCALL	_LCD16xx_write_char
(0044)     LCD16xx_write_char(0,0x01);      //显示清屏
    011E E021      LDI	R18,1
    011F 2700      CLR	R16
    0120 D00F      RCALL	_LCD16xx_write_char
(0045)     LCD16xx_write_char(0,0x06);      //显示光标移动设置
    0121 E026      LDI	R18,6
    0122 2700      CLR	R16
    0123 D00C      RCALL	_LCD16xx_write_char
    0124 9508      RET
(0046) }
(0047) 
(0048) void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
(0049) {
(0050)     LCD_EN_PORT |= LCD_EN;
_LCD16xx_en_write:
    0125 9A97      SBI	0x12,7
(0051)     delay_nus(30);                    //如果晶振频率太高,则可相应提高延时
    0126 E10E      LDI	R16,0x1E
    0127 E010      LDI	R17,0
    0128 940E00EA  CALL	_delay_nus
(0052)     LCD_EN_PORT &= ~LCD_EN;           //时间短的话,数据发不权,出现乱码
    012A 9897      CBI	0x12,7
    012B 9508      RET
(0053) }
(0054) 
(0055) /************************************************************************/
(0056) /* LCD16xx清屏                                                          */
(0057) /************************************************************************/
(0058) void LCD16xx_clr(void)
(0059) {
(0060)     LCD16xx_write_char(1,0x01);
_LCD16xx_clr:
    012C E021      LDI	R18,1
    012D E001      LDI	R16,1
    012E D001      RCALL	_LCD16xx_write_char
    012F 9508      RET
_LCD16xx_write_char:
  data                 --> R20
  command              --> R22
    0130 940E019A  CALL	push_gset2
    0132 2F42      MOV	R20,R18
    0133 2F60      MOV	R22,R16
(0061) }
(0062) 
(0063) /*-----------------------------------------------------------------------
(0064) LCD16xx_write_char    : 英文字符串显示函数
(0065) 
(0066) 输入参数:*s      :英文字符串指针;
(0067)           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0068)                     LCD第一行显示寄存器地址:0x80-0x8F
(0069)                     LCD第一行显示寄存器地址:0xC0-0xCF
(0070) 					LCD第三行显示寄存器地址:0x90-0x9F
(0071) 					LCD第四行显示寄存器地址:0xD0-0xDF
(0072) 编写日期          :2006年08月30日
(0073) 最后修改日期      :2006年08月30日
(0074) -----------------------------------------------------------------------*/
(0075) void LCD16xx_write_char(unsigned char command,unsigned char data)
(0076) {
(0077)    
(0078)     //LCD16xx_wait_Ready();
(0079)    
(0080)                
(0081)     if (command == 0)                       //data
    0134 2366      TST	R22
    0135 F411      BNE	0x0138
(0082)        LCD_RS_PORT |= LCD_RS;               //RS=1
    0136 9A96      SBI	0x12,6
    0137 C001      RJMP	0x0139
(0083)     else                                    //command
(0084)        LCD_RS_PORT &= ~LCD_RS;              //RS=0
    0138 9896      CBI	0x12,6
(0085)        
(0086)   
(0087)     LCD_DATA_PORT &= command;
    0139 B225      IN	R2,0x15
    013A 2226      AND	R2,R22
    013B BA25      OUT	0x15,R2
(0088)     LCD_DATA_PORT |= data&0xff;            //send low 4bit
    013C 2F84      MOV	R24,R20
    013D 7F8F      ANDI	R24,0xFF
    013E B225      IN	R2,0x15
    013F 2A28      OR	R2,R24
    0140 BA25      OUT	0x15,R2
(0089)     LCD16xx_en_write();
    0141 DFE3      RCALL	_LCD16xx_en_write
    0142 940E018E  CALL	pop_gset2
    0144 9508      RET
(0090) 
(0091) }
(0092) 
(0093) void LCD16xx_wait_Ready(void)              //等待LCD空闲
(0094) {
(0095)     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
_LCD16xx_wait_Ready:
    0145 98A7      CBI	0x14,7
(0096)     LCD_RS_PORT &= ~LCD_RS;                //RS=0
    0146 9896      CBI	0x12,6
(0097)     LCD_EN_PORT |= LCD_EN;                 //EN=1
    0147 9A97      SBI	0x12,7
(0098)     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
    0148 999F      SBIC	0x13,7
    0149 C003      RJMP	0x014D
    014A E001      LDI	R16,1
    014B E010      LDI	R17,0
    014C C002      RJMP	0x014F
    014D 2700      CLR	R16
    014E 2711      CLR	R17
    014F 3000      CPI	R16,0
    0150 0701      CPC	R16,R17
    0151 F3B1      BEQ	0x0148
(0099)     LCD_EN_PORT &= ~LCD_EN;                //EN=0
    0152 9897      CBI	0x12,7
(0100)     LCD_DATA_DDR |= LCD_DATA;
    0153 B384      IN	R24,0x14
    0154 6F8F      ORI	R24,0xFF
    0155 BB84      OUT	0x14,R24
    0156 9508      RET
_LCD16xx_set_xy:
  address              --> R20
  y                    --> R10
  x                    --> R22
    0157 940E0198  CALL	push_gset3
    0159 2EA2      MOV	R10,R18
    015A 2F60      MOV	R22,R16
(0101) }
(0102) 
(0103) /*-----------------------------------------------------------------------
(0104) LCD_set_xy        : 设置LCD显示的起始位置
(0105) 
(0106) 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0107)                     LCD第一行显示寄存器地址:0x80-0x8F
(0108)                     LCD第一行显示寄存器地址:0xC0-0xCF
(0109) 编写日期          :2006年08月30日
(0110) 最后修改日期      :2006年08月30日
(0111) -----------------------------------------------------------------------*/
(0112) void LCD16xx_set_xy( unsigned char x, unsigned char y )
(0113) {
(0114)     unsigned char address;
(0115)     if (y == 0)
    015B 20AA      TST	R10
    015C F419      BNE	0x0160
(0116)        address = 0x81 + x;
    015D 2F46      MOV	R20,R22
    015E 574F      SUBI	R20,0x7F
    015F C011      RJMP	0x0171
(0117)     else if(y == 1)
    0160 2D8A      MOV	R24,R10
    0161 3081      CPI	R24,1
    0162 F419      BNE	0x0166
(0118)        address = 0xc1 + x;
    0163 2F46      MOV	R20,R22
    0164 534F      SUBI	R20,0x3F
    0165 C00B      RJMP	0x0171
(0119)     else if(y == 2)
    0166 2D8A      MOV	R24,R10
    0167 3082      CPI	R24,2
    0168 F419      BNE	0x016C
(0120)        address = 0x91 + x;
    0169 2F46      MOV	R20,R22
    016A 564F      SUBI	R20,0x6F
    016B C005      RJMP	0x0171
(0121)     else if(y == 3)
    016C 2D8A      MOV	R24,R10
    016D 3083      CPI	R24,3
    016E F411      BNE	0x0171
(0122)        address = 0xd1 + x;
    016F 2F46      MOV	R20,R22
    0170 524F      SUBI	R20,0x2F
(0123)     LCD16xx_write_char( 1,address );
    0171 2F24      MOV	R18,R20
    0172 E001      LDI	R16,1
    0173 DFBC      RCALL	_LCD16xx_write_char
    0174 940E0191  CALL	pop_gset3
    0176 9508      RET
_LCD16xx_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    0177 940E0198  CALL	push_gset3
    0179 2EA2      MOV	R10,R18
    017A 2F60      MOV	R22,R16
    017B 814E      LDD	R20,Y+6
    017C 815F      LDD	R21,Y+7
(0124) }
(0125) /*-----------------------------------------------------------------------
(0126) LCD16xx_write_string  : 英文字符串显示函数
(0127) 
(0128) 输入参数:*s      :英文字符串指针;
(0129)           X、Y    : 显示字符串的位置
(0130) 编写日期          :2006年08月30日
(0131) 最后修改日期      :2006年08月30日 		
(0132) -----------------------------------------------------------------------*/
(0133) void LCD16xx_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0134) {
(0135)     LCD16xx_set_xy( X, Y );
    017D 2D2A      MOV	R18,R10
    017E 2F06      MOV	R16,R22
    017F DFD7      RCALL	_LCD16xx_set_xy
    0180 C006      RJMP	0x0187
(0136)     while (*s) 
(0137)     {
(0138)         LCD16xx_write_char( 0, *s );
    0181 01FA      MOVW	R30,R20
    0182 8120      LDD	R18,Z+0
    0183 2700      CLR	R16
    0184 DFAB      RCALL	_LCD16xx_write_char
(0139)         s++;
FILE: <library>
    0185 5F4F      SUBI	R20,0xFF
    0186 4F5F      SBCI	R21,0xFF
    0187 01FA      MOVW	R30,R20
    0188 8020      LDD	R2,Z+0
    0189 2022      TST	R2
    018A F7B1      BNE	0x0181
    018B 940E0191  CALL	pop_gset3
    018D 9508      RET
pop_gset2:
    018E E0E2      LDI	R30,2
    018F 940C01A0  JMP	pop
pop_gset3:
    0191 E0E4      LDI	R30,4
    0192 940C01A0  JMP	pop
push_gset5:
    0194 92FA      ST	R15,-Y
    0195 92EA      ST	R14,-Y
push_gset4:
    0196 92DA      ST	R13,-Y
    0197 92CA      ST	R12,-Y
push_gset3:
    0198 92BA      ST	R11,-Y
    0199 92AA      ST	R10,-Y
push_gset2:
    019A 937A      ST	R23,-Y
    019B 936A      ST	R22,-Y
push_gset1:
    019C 935A      ST	R21,-Y
    019D 934A      ST	R20,-Y
    019E 9508      RET
pop_gset1:
    019F E0E1      LDI	R30,1
pop:
    01A0 9149      LD	R20,Y+
    01A1 9159      LD	R21,Y+
    01A2 FDE0      SBRC	R30,0
    01A3 9508      RET
    01A4 9169      LD	R22,Y+
    01A5 9179      LD	R23,Y+
    01A6 FDE1      SBRC	R30,1
    01A7 9508      RET
    01A8 90A9      LD	R10,Y+
    01A9 90B9      LD	R11,Y+
    01AA FDE2      SBRC	R30,2
    01AB 9508      RET
    01AC 90C9      LD	R12,Y+
    01AD 90D9      LD	R13,Y+
    01AE FDE3      SBRC	R30,3
    01AF 9508      RET
    01B0 90E9      LD	R14,Y+
    01B1 90F9      LD	R15,Y+
    01B2 9508      RET

⌨️ 快捷键说明

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