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

📄 12864.lst

📁 ICCAVR编写128*64液晶程序测试已经通过
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    01C5 E5CF      LDI	R28,0x5F
    01C6 E0D4      LDI	R29,4
    01C7 BFCD      OUT	0x3D,R28
    01C8 BFDE      OUT	0x3E,R29
    01C9 51C0      SUBI	R28,0x10
    01CA 40D0      SBCI	R29,0
    01CB EA0A      LDI	R16,0xAA
    01CC 8308      STD	Y+0,R16
    01CD 2400      CLR	R0
    01CE E6E0      LDI	R30,0x60
    01CF E0F0      LDI	R31,0
    01D0 E010      LDI	R17,0
    01D1 36E4      CPI	R30,0x64
    01D2 07F1      CPC	R31,R17
    01D3 F011      BEQ	0x01D6
    01D4 9201      ST	R0,Z+
    01D5 CFFB      RJMP	0x01D1
    01D6 8300      STD	Z+0,R16
    01D7 E8EA      LDI	R30,0x8A
    01D8 E0F3      LDI	R31,3
    01D9 E6A0      LDI	R26,0x60
    01DA E0B0      LDI	R27,0
    01DB E013      LDI	R17,3
    01DC 38EA      CPI	R30,0x8A
    01DD 07F1      CPC	R31,R17
    01DE F021      BEQ	0x01E3
    01DF 95C8      LPM
    01E0 9631      ADIW	R30,1
    01E1 920D      ST	R0,X+
    01E2 CFF9      RJMP	0x01DC
    01E3 940E061E  CALL	_main
_exit:
    01E5 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\12864-ICC\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 4.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_1ms(void);
(0010) void delay_nus(unsigned char n);
(0011) void delay_nms(unsigned int n);
(0012) /*******************************************************************
(0013) 
(0014)                              微秒级精确延时(ICC)
(0015) 
(0016) *******************************************************************/
(0017) 
(0018) /*======================================
(0019)  微秒级精确延时函数,晶振8M:           
(0020)  Delay = 0.125 *((tt*4-1)+9)微秒
(0021)  其中9包括了调用方的 r16 赋值 1t
(0022)  rcall 3t    nop 1t   ret 4t
(0023)  brne指令在当判断条件不成立时是单周期
(0024)  最后一次判断只有1个周期,补一个nop
(0025)  简化计算 = 0.5tt + 1 (us)
(0026) ======================================*/
(0027) void delay_nus(unsigned char tt)
(0028) {
(0029)         asm("_L2: subi R16,1");  
_delay_nus:
  tt                   --> R16
    01E6 5001      SUBI	R16,1
(0030)         asm(" nop") 
    01E7 0000      NOP
    01E8 F7E9      BNE	0x01E6
(0031)         asm(" brne _L2");
(0032)         asm(" nop");
    01E9 0000      NOP
(0033)         asm(" ret");
    01EA 9508      RET
    01EB 9508      RET
(0034) }
(0035) /*************************************************************************
(0036) 
(0037)                                         毫秒级精确延时(ICC)
(0038) 
(0039) *************************************************************************/
(0040) 
(0041) #define xtal 4 //以MHz为单位,不同的系统时钟要修改。
(0042) 
(0043) void delay_1ms(void)
(0044) {
(0045) unsigned int i;
(0046) for(i=0;i<(unsigned int)(xtal*143-2);i++);
_delay_1ms:
  i                    --> R16
    01EC 2700      CLR	R16
    01ED 2711      CLR	R17
    01EE C002      RJMP	0x01F1
    01EF 5F0F      SUBI	R16,0xFF
    01F0 4F1F      SBCI	R17,0xFF
    01F1 330A      CPI	R16,0x3A
    01F2 E0E2      LDI	R30,2
    01F3 071E      CPC	R17,R30
    01F4 F3D0      BCS	0x01EF
    01F5 9508      RET
_delay_nms:
  i                    --> R20
  num                  --> R22
    01F6 940E1812  CALL	push_gset2
    01F8 01B8      MOVW	R22,R16
(0047) }
(0048) 
(0049) void delay_nms(unsigned int num)
(0050) {
(0051) unsigned int i;
(0052) for(i=0;i<num;i++) delay_1ms();
    01F9 2744      CLR	R20
    01FA 2755      CLR	R21
    01FB C003      RJMP	0x01FF
    01FC DFEF      RCALL	_delay_1ms
    01FD 5F4F      SUBI	R20,0xFF
    01FE 4F5F      SBCI	R21,0xFF
    01FF 1746      CP	R20,R22
    0200 0757      CPC	R21,R23
    0201 F3D0      BCS	0x01FC
    0202 940E1800  CALL	pop_gset2
    0204 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\12864-ICC\lcd.c
(0001) #include <iom16v.h>
(0002) #include "lcd.h"
(0003) #include "delay.h"
(0004) #include "font.h"
(0005) unsigned char CurOffset,CurRow,CurPage,CurCol;//当前指针位置
(0006) 
(0007) //--------------复位函数---------------------
(0008) void LCD_reset(void)
(0009) {
(0010)    LCD_RST_DDR    |=  LCD_RST_BIT;
_LCD_reset:
    0205 9ABD      SBI	0x17,5
(0011)    CLEAR_LCD_RST;
    0206 98C5      CBI	0x18,5
(0012)    delay_nms(10);
    0207 E00A      LDI	R16,0xA
    0208 E010      LDI	R17,0
    0209 DFEC      RCALL	_delay_nms
(0013)    SET_LCD_RST;
    020A 9AC5      SBI	0x18,5
    020B 9508      RET
_LCD_BUSY:
  lr                   --> R20
    020C 940E1814  CALL	push_gset1
    020E 2F40      MOV	R20,R16
(0014) }
(0015) 
(0016) //-------------忙信号检测函数----------------
(0017) void LCD_BUSY(unsigned char lr) //判断忙标志
(0018) {
(0019)    //unsigned char status;
(0020)    asm("cli");
    020F 94F8      BCLR	7
(0021)    if(lr==RIGHT)
    0210 3041      CPI	R20,1
    0211 F419      BNE	0x0215
(0022)    {
(0023)       CLEAR_LCD_CS2; //cs2=0
    0212 98C4      CBI	0x18,4
(0024)       SET_LCD_CS1;   //cs1=1
    0213 9AC3      SBI	0x18,3
(0025)    }
    0214 C002      RJMP	0x0217
(0026)    else
(0027)    {
(0028)       SET_LCD_CS2;   //cs2=1
    0215 9AC4      SBI	0x18,4
(0029)       CLEAR_LCD_CS1; //cs1=0
    0216 98C3      CBI	0x18,3
(0030)    }
(0031)    SET_LCD_CMD;
    0217 98C0      CBI	0x18,0
(0032)    LCD_DIR_PORT = 0x00;
    0218 2422      CLR	R2
    0219 BA2A      OUT	0x1A,R2
(0033)    LCD_OP_PORT = 0xff;
    021A EF8F      LDI	R24,0xFF
    021B BB8B      OUT	0x1B,R24
(0034)    SET_LCD_READ;
    021C 9AC1      SBI	0x18,1
(0035)    SET_LCD_E;
    021D 9AC2      SBI	0x18,2
(0036)    delay_nus(250);
    021E EF0A      LDI	R16,0xFA
    021F DFC6      RCALL	_delay_nus
(0037)    delay_nus(250);
    0220 EF0A      LDI	R16,0xFA
    0221 DFC4      RCALL	_delay_nus
    0222 C00A      RJMP	0x022D
(0038)    while((LCD_IP_PORT) & LCD_STATUS_BUSY)
(0039)    {
(0040)       CLEAR_LCD_E;
    0223 98C2      CBI	0x18,2
(0041)       delay_nus(250);
    0224 EF0A      LDI	R16,0xFA
    0225 DFC0      RCALL	_delay_nus
(0042) 	  delay_nus(250);
    0226 EF0A      LDI	R16,0xFA
    0227 DFBE      RCALL	_delay_nus
(0043)       SET_LCD_E;
    0228 9AC2      SBI	0x18,2
(0044)       delay_nus(250);
    0229 EF0A      LDI	R16,0xFA
    022A DFBB      RCALL	_delay_nus
(0045) 	  delay_nus(250);
    022B EF0A      LDI	R16,0xFA
    022C DFB9      RCALL	_delay_nus
    022D 99CF      SBIC	0x19,7
    022E CFF4      RJMP	0x0223
(0046)    }
(0047)    CLEAR_LCD_E;
    022F 98C2      CBI	0x18,2
(0048)    SET_LCD_WRITE;
    0230 98C1      CBI	0x18,1
(0049)    LCD_OP_PORT = 0xff;
    0231 EF8F      LDI	R24,0xFF
    0232 BB8B      OUT	0x1B,R24
(0050)    asm("sei");
    0233 9478      BSET	7
    0234 940E1817  CALL	pop_gset1
    0236 9508      RET
_write_LCD:
  data                 --> Y+4
  cd                   --> R20
  lr                   --> R22
    0237 940E1812  CALL	push_gset2
    0239 2F42      MOV	R20,R18
    023A 2F60      MOV	R22,R16
(0051)   
(0052) }
(0053) 
(0054) //------------写指令(数据)函数---------------------
(0055) void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) 
(0056) {	
(0057)   asm("cli");
    023B 94F8      BCLR	7
(0058)    LCD_BUSY(lr);
    023C 2F06      MOV	R16,R22
    023D DFCE      RCALL	_LCD_BUSY
(0059)    if(cd==CMD)
    023E 2344      TST	R20
    023F F411      BNE	0x0242
(0060)       SET_LCD_CMD;
    0240 98C0      CBI	0x18,0
    0241 C001      RJMP	0x0243
(0061)    else
(0062)       SET_LCD_DATA;
    0242 9AC0      SBI	0x18,0
(0063)    SET_LCD_WRITE;
    0243 98C1      CBI	0x18,1
(0064)    SET_LCD_E;
    0244 9AC2      SBI	0x18,2
(0065)    LCD_DIR_PORT = 0xff;
    0245 EF8F      LDI	R24,0xFF
    0246 BB8A      OUT	0x1A,R24
(0066)    LCD_OP_PORT = data;
    0247 800C      LDD	R0,Y+4
    0248 BA0B      OUT	0x1B,R0
(0067)    delay_nus(250);
    0249 EF0A      LDI	R16,0xFA
    024A DF9B      RCALL	_delay_nus
(0068)    delay_nus(250);
    024B EF0A      LDI	R16,0xFA
    024C DF99      RCALL	_delay_nus
(0069)    CLEAR_LCD_E;
    024D 98C2      CBI	0x18,2
(0070)    LCD_OP_PORT = 0xff;
    024E EF8F      LDI	R24,0xFF
    024F BB8B      OUT	0x1B,R24
(0071)    asm("sei");
    0250 9478      BSET	7
    0251 940E1800  CALL	pop_gset2
    0253 9508      RET
_read_LCD:
  data                 --> R20
  lr                   --> R22
    0254 940E1812  CALL	push_gset2
    0256 2F60      MOV	R22,R16
(0072)   
(0073) }
(0074) 
(0075) //--------------读数据函数-------------------
(0076) unsigned char read_LCD(unsigned char lr)	  
(0077) {
(0078)    unsigned char data;
(0079)    
(0080)    asm("cli");
    0257 94F8      BCLR	7
(0081)    LCD_BUSY(lr);
    0258 2F06      MOV	R16,R22
    0259 DFB2      RCALL	_LCD_BUSY
(0082)    SET_LCD_DATA;
    025A 9AC0      SBI	0x18,0
(0083)    LCD_DIR_PORT = 0x00;
    025B 2422      CLR	R2
    025C BA2A      OUT	0x1A,R2
(0084)    LCD_OP_PORT = 0xff;
    025D EF8F      LDI	R24,0xFF
    025E BB8B      OUT	0x1B,R24
(0085)    SET_LCD_READ;
    025F 9AC1      SBI	0x18,1
(0086)    SET_LCD_E;
    0260 9AC2      SBI	0x18,2
(0087)    delay_nms(1);
    0261 E001      LDI	R16,1
    0262 E010      LDI	R17,0
    0263 DF92      RCALL	_delay_nms
(0088)    data=LCD_IP_PORT;
    0264 B349      IN	R20,0x19
(0089)    CLEAR_LCD_E;
    0265 98C2      CBI	0x18,2
(0090)    SET_LCD_WRITE;
    0266 98C1      CBI	0x18,1
(0091)    
(0092)    LCD_BUSY(lr);
    0267 2F06      MOV	R16,R22
    0268 DFA3      RCALL	_LCD_BUSY
(0093)    SET_LCD_DATA;
    0269 9AC0      SBI	0x18,0
(0094)    LCD_DIR_PORT = 0x00;
    026A 2422      CLR	R2
    026B BA2A      OUT	0x1A,R2
(0095)    LCD_OP_PORT = 0xff;
    026C EF8F      LDI	R24,0xFF
    026D BB8B      OUT	0x1B,R24
(0096)    SET_LCD_READ;
    026E 9AC1      SBI	0x18,1
(0097)    SET_LCD_E;
    026F 9AC2      SBI	0x18,2
(0098)    delay_nus(250);
    0270 EF0A      LDI	R16,0xFA
    0271 DF74      RCALL	_delay_nus
(0099)    delay_nus(250);
    0272 EF0A      LDI	R16,0xFA
    0273 DF72      RCALL	_delay_nus
(0100)    data=LCD_IP_PORT;
    0274 B349      IN	R20,0x19
(0101)    CLEAR_LCD_E;
    0275 98C2      CBI	0x18,2
(0102)    SET_LCD_WRITE;
    0276 98C1      CBI	0x18,1
(0103)    delay_nus(250);
    0277 EF0A      LDI	R16,0xFA
    0278 DF6D      RCALL	_delay_nus
(0104)    delay_nus(250);
    0279 EF0A      LDI	R16,0xFA
    027A DF6B      RCALL	_delay_nus
(0105)    asm("sei");
    027B 9478      BSET	7
(0106)    return data;
    027C 2F04      MOV	R16,R20
    027D 940E1800  CALL	pop_gset2
    027F 9508      RET
_set_start_line_L:
  line                 --> R20
    0280 940E1814  CALL	push_gset1
    0282 2F40      MOV	R20,R16
    0283 9721      SBIW	R28,1
(0107) }
(0108) 
(0109) //-----------------行列页选择函数------------------ 
(0110) void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
(0111) {
(0112)    write_LCD(LEFT,CMD,0xc0|line);
    0284 2F84      MOV	R24,R20
    0285 6C80      ORI	R24,0xC0
    0286 8388      STD	Y+0,R24
    0287 2722      CLR	R18
    0288 2700      CLR	R16
    0289 DFAD      RCALL	_write_LCD
    028A 9621      ADIW	R28,1
    028B 940E1817  CALL	pop_gset1
    028D 9508      RET
_set_start_line_R:
  line                 --> R20
    028E 940E1814  CALL	push_gset1
    0290 2F40      MOV	R20,R16
    0291 9721      SBIW	R28,1
(0113) }
(0114) 
(0115) void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
(0116) {
(0117)    write_LCD(RIGHT,CMD,0xc0|line);
    0292 2F84      MOV	R24,R20
    0293 6C80      ORI	R24,0xC0
    0294 8388      STD	Y+0,R24
    0295 2722      CLR	R18
    0296 E001      LDI	R16,1
    0297 DF9F      RCALL	_write_LCD
    0298 9621      ADIW	R28,1
    0299 940E1817  CALL	pop_gset1
    029B 9508      RET
_set_page_L:
  page                 --> R20
    029C 940E1814  CALL	push_gset1
    029E 2F40      MOV	R20,R16
    029F 9721      SBIW	R28,1
(0118) }
(0119) 
(0120) void set_page_L(unsigned char page)	/*设置X地址 设置页*/  //0-7
(0121) {
(0122)    write_LCD(LEFT,CMD,0xb8|page);
    02A0 2F84      MOV	R24,R20
    02A1 6B88      ORI	R24,0xB8
    02A2 8388      STD	Y+0,R24
    02A3 2722      CLR	R18

⌨️ 快捷键说明

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