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

📄 lcd_icc.lst

📁 用AVR及1602LCD在PROTEUS环境下仿真
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0040 E5CF      LDI	R28,0x5F
    0041 E0D4      LDI	R29,4
    0042 BFCD      OUT	0x3D,R28
    0043 BFDE      OUT	0x3E,R29
    0044 51C0      SUBI	R28,0x10
    0045 40D0      SBCI	R29,0
    0046 EA0A      LDI	R16,0xAA
    0047 8308      STD	Y+0,R16
    0048 2400      CLR	R0
    0049 E8EC      LDI	R30,0x8C
    004A E0F0      LDI	R31,0
    004B E010      LDI	R17,0
    004C 39EA      CPI	R30,0x9A
    004D 07F1      CPC	R31,R17
    004E F011      BEQ	0x0051
    004F 9201      ST	R0,Z+
    0050 CFFB      RJMP	0x004C
    0051 8300      STD	Z+0,R16
    0052 E5E4      LDI	R30,0x54
    0053 E0F0      LDI	R31,0
    0054 E6A0      LDI	R26,0x60
    0055 E0B0      LDI	R27,0
    0056 E010      LDI	R17,0
    0057 38E0      CPI	R30,0x80
    0058 07F1      CPC	R31,R17
    0059 F021      BEQ	0x005E
    005A 95C8      LPM
    005B 9631      ADIW	R30,1
    005C 920D      ST	R0,X+
    005D CFF9      RJMP	0x0057
    005E 940E01CF  CALL	_main
_exit:
    0060 CFFF      RJMP	_exit
FILE: D:\练习\LCD显示1602\lcd1602.h
(0001) /**************************************************************************
(0002)   
(0003)                    		THE 1602 CHAR LCD LIB
(0004)   
(0005)              		COPYRIGHT (c)   2007 BY zyg.
(0006)                        		--  ALL RIGHTS RESERVED  --
(0007)   
(0008)    File Name:       LCD.h
(0009)    Author:          zhuyiguo
(0010)    Created:         2007/4/23
(0011)    Modified:		NO
(0012)    Revision: 		1.0
(0013)   
(0014) ***************************************************************************/
(0015) 
(0016) #ifndef LCD_CHAR_1602_2007_4_23
(0017) #define LCD_CHAR_1602_2007_4_23
(0018) //控制脚定义
(0019) #define RS_D asm("sbi 0x15,2")
(0020) #define RS_I asm("cbi 0x15,2")
(0021) #define	RW_R asm("sbi 0x15,3")
(0022) #define RW_W asm("cbi 0x15,3")
(0023) #define E_1 asm("sbi 0x15,4")
(0024) #define E_0 asm("cbi 0x15,4")
(0025) 
(0026) //**************************************************************************
(0027) //ATMEGA16初始化
(0028) void port_init(void)
(0029) {
(0030)  PORTA = 0x00;
_port_init:
    0061 2422      CLR	R2
    0062 BA2B      OUT	0x1B,R2
(0031)  DDRA  = 0x00;
    0063 BA2A      OUT	0x1A,R2
(0032)  PORTB = 0x00;
    0064 BA28      OUT	0x18,R2
(0033)  DDRB  = 0x00;
    0065 BA27      OUT	0x17,R2
(0034)  PORTC = 0x10; //m103 output only
    0066 E180      LDI	R24,0x10
    0067 BB85      OUT	0x15,R24
(0035)  DDRC  = 0x1C;
    0068 E18C      LDI	R24,0x1C
    0069 BB84      OUT	0x14,R24
(0036)  PORTD = 0x00;
    006A BA22      OUT	0x12,R2
(0037)  DDRD  = 0x00;
    006B BA21      OUT	0x11,R2
    006C 9508      RET
(0038) }
(0039) //******************************************************************
(0040) 
(0041) //Watchdog initialize
(0042) // prescale: 2048K 
(0043) void watchdog_init(void)
(0044) {
(0045)  WDR(); //this prevents a timout on enabling
_watchdog_init:
    006D 95A8      WDR
(0046)  WDTCR = 0x0f; //WATCHDOG ENABLED - dont forget to issue WDRs
    006E E08F      LDI	R24,0xF
    006F BD81      OUT	0x21,R24
    0070 9508      RET
(0047) }
(0048) //******************************************************************
(0049) //TIMER1 initialize - prescale:256
(0050) // WGM: 0) Normal, TOP=0xFFFF
(0051) // desired value: 500mSec
(0052) // actual value: 500.000mSec (0.0%)
(0053) void timer1_init(void)
(0054) {
(0055)  TCCR1B = 0x00; //stop
_timer1_init:
    0071 2422      CLR	R2
    0072 BC2E      OUT	0x2E,R2
(0056)  TCNT1H = 0xC2; //setup
    0073 EC82      LDI	R24,0xC2
    0074 BD8D      OUT	0x2D,R24
(0057)  TCNT1L = 0xF7;
    0075 EF87      LDI	R24,0xF7
    0076 BD8C      OUT	0x2C,R24
(0058)  //OCR1AH = 0x3D;
(0059)  //OCR1AL = 0x09;
(0060)  //OCR1BH = 0x3D;
(0061)  //OCR1BL = 0x09;
(0062)  //OCR1CH = $OCR1CH$;
(0063)  //OCR1CL = $OCR1CL$;
(0064)  //ICR1H  = 0x3D;
(0065)  //ICR1L  = 0x09;
(0066)  TCCR1A = 0x00;
    0077 BC2F      OUT	0x2F,R2
(0067)  TCCR1B = 0x04; //start Timer
    0078 E084      LDI	R24,4
    0079 BD8E      OUT	0x2E,R24
    007A 9508      RET
(0068) }
(0069) //******************************************************************
(0070) //call this routine to initialize all peripherals
(0071) void init_devices(void)
(0072) {
(0073)  //stop errant interrupts until set up
(0074)  CLI(); //disable all interrupts
_init_devices:
    007B 94F8      BCLR	7
(0075)  port_init();
    007C DFE4      RCALL	_port_init
(0076)  watchdog_init();
    007D DFEF      RCALL	_watchdog_init
(0077)  timer1_init();
    007E DFF2      RCALL	_timer1_init
(0078) 
(0079)  MCUCR = 0x00;
    007F 2422      CLR	R2
    0080 BE25      OUT	0x35,R2
(0080)  GICR  = 0xc0;//interrupt int0,int1 enable
    0081 EC80      LDI	R24,0xC0
    0082 BF8B      OUT	0x3B,R24
(0081)  TIMSK = 0x04; //timer interrupt sources
    0083 E084      LDI	R24,4
    0084 BF89      OUT	0x39,R24
(0082)  SEI(); //re-enable interrupts
    0085 9478      BSET	7
    0086 9508      RET
(0083)  //all peripherals are now initialized
(0084) }
(0085) //******************************************************************
(0086) //延时函数
(0087) void delay_us(int time)//微妙级延时函数
(0088) {
(0089)  WDR();
_delay_us:
  time                 --> R16
    0087 95A8      WDR
    0088 C008      RJMP	0x0091
(0090)  while(time--)
(0091)  {
(0092)   NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
    0089 0000      NOP
    008A 0000      NOP
    008B 0000      NOP
    008C 0000      NOP
    008D 0000      NOP
    008E 0000      NOP
    008F 0000      NOP
    0090 0000      NOP
    0091 0118      MOVW	R2,R16
    0092 5001      SUBI	R16,1
    0093 4010      SBCI	R17,0
    0094 2022      TST	R2
    0095 F799      BNE	0x0089
    0096 2033      TST	R3
    0097 F789      BNE	0x0089
    0098 9508      RET
_delay_ms:
  time                 --> R20
    0099 940E05DF  CALL	push_gset1
    009B 01A8      MOVW	R20,R16
(0093)  }
(0094) }
(0095) void delay_ms(int time)//毫秒级延时函数
(0096) {
    009C C003      RJMP	0x00A0
(0097)  while(time--)
(0098)   {
(0099)    delay_us(1000);
    009D EE08      LDI	R16,0xE8
    009E E013      LDI	R17,3
    009F DFE7      RCALL	_delay_us
    00A0 011A      MOVW	R2,R20
    00A1 5041      SUBI	R20,1
    00A2 4050      SBCI	R21,0
    00A3 2022      TST	R2
    00A4 F7C1      BNE	0x009D
    00A5 2033      TST	R3
    00A6 F7B1      BNE	0x009D
    00A7 940E05E2  CALL	pop_gset1
    00A9 9508      RET
_lcd_read_code:
  code                 --> R20
    00AA 940E05DF  CALL	push_gset1
(0100)   }
(0101) }
(0102) 
(0103) //********************************************************************
(0104) //读LCD1602状态字
(0105) unsigned char lcd_read_code(void)
(0106) {
(0107)  unsigned char code;
(0108)  DDRA=0x00;
    00AC 2422      CLR	R2
    00AD BA2A      OUT	0x1A,R2
(0109)  RS_I;
    00AE 98AA      CBI	0x15,2
(0110)  RW_R;
    00AF 9AAB      SBI	0x15,3
(0111)  E_1;
    00B0 9AAC      SBI	0x15,4
(0112)  delay_ms(1);
    00B1 E001      LDI	R16,1
    00B2 E010      LDI	R17,0
    00B3 DFE5      RCALL	_delay_ms
(0113)  code=PINA;
    00B4 B349      IN	R20,0x19
(0114)  E_0;
    00B5 98AC      CBI	0x15,4
(0115)  RW_W; 
    00B6 98AB      CBI	0x15,3
(0116)  DDRA=0xff;
    00B7 EF8F      LDI	R24,0xFF
    00B8 BB8A      OUT	0x1A,R24
(0117)  return code;
    00B9 2F04      MOV	R16,R20
    00BA 940E05E2  CALL	pop_gset1
    00BC 9508      RET
(0118) }
(0119) 
(0120) //*******************************************************************
(0121) //判断LCD是否为忙状态
(0122) void judgebusy(void)
(0123) {
(0124)  //unsigned char t;
(0125)  //t=lcd_read_code();
(0126)  while(((lcd_read_code())&0x80)==0x80)
_judgebusy:
    00BD DFEC      RCALL	_lcd_read_code
    00BE 2E20      MOV	R2,R16
    00BF 2433      CLR	R3
    00C0 FC27      SBRC	R2,7
    00C1 CFFB      RJMP	_judgebusy
    00C2 9508      RET
_lcd_write_data:
  data                 --> R20
    00C3 940E05DF  CALL	push_gset1
    00C5 2F40      MOV	R20,R16
(0127)  {
(0128)   //t=lcd_read_code();
(0129)   //if((t&0x80)!=0x80) break;
(0130)   
(0131)  }
(0132) }
(0133) 
(0134) //写显示数据*******************************************************************
(0135) void lcd_write_data(unsigned char data)
(0136) {
(0137)  WDR();
    00C6 95A8      WDR
(0138)  DDRA=0xff;
    00C7 EF8F      LDI	R24,0xFF
    00C8 BB8A      OUT	0x1A,R24
(0139)  RS_D;
    00C9 9AAA      SBI	0x15,2
(0140)  delay_us(1);
    00CA E001      LDI	R16,1
    00CB E010      LDI	R17,0
    00CC DFBA      RCALL	_delay_us
(0141)  RW_W;
    00CD 98AB      CBI	0x15,3
(0142)  delay_us(1);
    00CE E001      LDI	R16,1
    00CF E010      LDI	R17,0
    00D0 DFB6      RCALL	_delay_us
(0143)  E_1;
    00D1 9AAC      SBI	0x15,4
(0144)  //judgebusy();
(0145)  delay_ms(1);
    00D2 E001      LDI	R16,1
    00D3 E010      LDI	R17,0
    00D4 DFC4      RCALL	_delay_ms
(0146)  PORTA=data;
    00D5 BB4B      OUT	0x1B,R20
(0147)  E_0;
    00D6 98AC      CBI	0x15,4
(0148)  delay_us(1);
    00D7 E001      LDI	R16,1
    00D8 E010      LDI	R17,0
    00D9 DFAD      RCALL	_delay_us
(0149)  //E_0;
(0150)  RW_R;
    00DA 9AAB      SBI	0x15,3
(0151)  DDRA=0x00;
    00DB 2422      CLR	R2
    00DC BA2A      OUT	0x1A,R2
(0152)  WDR();
    00DD 95A8      WDR
    00DE 940E05E2  CALL	pop_gset1
    00E0 9508      RET
_lcd_write_code:
  code                 --> R20
    00E1 940E05DF  CALL	push_gset1
    00E3 2F40      MOV	R20,R16
(0153) }
(0154) 
(0155) //写状态字********************************************************************
(0156) void lcd_write_code(unsigned char code)
(0157) {
(0158)  WDR();
    00E4 95A8      WDR
(0159)  DDRA=0xff;
    00E5 EF8F      LDI	R24,0xFF
    00E6 BB8A      OUT	0x1A,R24
(0160)  RS_I;
    00E7 98AA      CBI	0x15,2
(0161)  delay_us(1);
    00E8 E001      LDI	R16,1
    00E9 E010      LDI	R17,0
    00EA DF9C      RCALL	_delay_us
(0162)  RW_W;
    00EB 98AB      CBI	0x15,3
(0163)  delay_us(1);
    00EC E001      LDI	R16,1
    00ED E010      LDI	R17,0
    00EE DF98      RCALL	_delay_us
(0164)  E_1;
    00EF 9AAC      SBI	0x15,4
(0165)  //judgebusy();
(0166)  delay_ms(1);
    00F0 E001      LDI	R16,1
    00F1 E010      LDI	R17,0
    00F2 DFA6      RCALL	_delay_ms
(0167)  
(0168)  PORTA=code;
    00F3 BB4B      OUT	0x1B,R20
(0169)  E_0;
    00F4 98AC      CBI	0x15,4
(0170)  delay_us(1);
    00F5 E001      LDI	R16,1
    00F6 E010      LDI	R17,0
    00F7 DF8F      RCALL	_delay_us
(0171)  //E_0;
(0172)  RW_R;
    00F8 9AAB      SBI	0x15,3
(0173)  DDRA=0x00;
    00F9 2422      CLR	R2
    00FA BA2A      OUT	0x1A,R2
(0174)  WDR();
    00FB 95A8      WDR
    00FC 940E05E2  CALL	pop_gset1
    00FE 9508      RET
_Print:
  str                  --> R20
    00FF 940E05DF  CALL	push_gset1
    0101 01A8      MOVW	R20,R16
(0175) }
(0176) 
(0177) //显示字符串******************************************************************
(0178) void Print(unsigned char *str)
(0179) {
    0102 C006      RJMP	0x0109
(0180) 	while(*str!='\0')
(0181) 	{   
(0182) 	    WDR();
    0103 95A8      WDR
(0183) 		lcd_write_data(*str);
    0104 01FA      MOVW	R30,R20
    0105 8100      LDD	R16,Z+0
    0106 DFBC      RCALL	_lcd_write_data
(0184) 		//delay_ms(100);
(0185) 		str++;
    0107 5F4F      SUBI	R20,0xFF
    0108 4F5F      SBCI	R21,0xFF
    0109 01FA      MOVW	R30,R20
    010A 8020      LDD	R2,Z+0
    010B 2022      TST	R2
    010C F7B1      BNE	0x0103
    010D 940E05E2  CALL	pop_gset1
    010F 9508      RET
_GotoXY:
  y                    --> R22
  x                    --> R20
    0110 940E05DD  CALL	push_gset2
    0112 2F62      MOV	R22,R18
    0113 2F40      MOV	R20,R16
(0186) 	}
(0187) }
(0188) 
(0189) //显示位置************************************************************************
(0190) void GotoXY(unsigned char x,unsigned char y)
(0191) {
(0192) 	if(y==0)
    0114 2366      TST	R22
    0115 F419      BNE	0x0119
(0193) 		lcd_write_code(0x80|x);
    0116 2F04      MOV	R16,R20
    0117 6800      ORI	R16,0x80
    0118 DFC8      RCALL	_lcd_write_code
(0194) 	if(y==1)
    0119 3061      CPI	R22,1
    011A F421      BNE	0x011F
(0195) 		lcd_write_code(0x80|(x-0x40));
    011B 2F04      MOV	R16,R20
    011C 5400      SUBI	R16,0x40
    011D 6800      ORI	R16,0x80
    011E DFC2      RCALL	_lcd_write_code
    011F 940E05D4  CALL	pop_gset2
    0121 9508      RET
(0196) }
(0197) 
(0198) void lcd_init(void)
(0199) {
(0200)  WDR();
_lcd_init:
    0122 95A8      WDR
(0201)  delay_ms(400);//等待LCD稳定
    0123 E900      LDI	R16,0x90
    0124 E011      LDI	R17,1
    0125 DF73      RCALL	_delay_ms
(0202)  E_1;
    0126 9AAC      SBI	0x15,4
(0203)  //lcd_write_code(0x01);
(0204)  delay_ms(15);
    0127 E00F      LDI	R16,0xF
    0128 E010      LDI	R17,0
    0129 DF6F      RCALL	_delay_ms
(0205)  lcd_write_code(0x38);//显示模式:8位数据端口,2行显示,5*7点阵
    012A E308      LDI	R16,0x38
    012B DFB5      RCALL	_lcd_write_code
(0206)  delay_ms(5);
    012C E005      LDI	R16,5
    012D E010      LDI	R17,0
    012E DF6A      RCALL	_delay_ms
(0207)  lcd_write_code(0x38);
    012F E308      LDI	R16,0x38
    0130 DFB0      RCALL	_lcd_write_code
(0208)  delay_ms(5);
    0131 E005      LDI	R16,5
    0132 E010      LDI	R17,0
    0133 DF65      RCALL	_delay_ms
(0209)  lcd_write_code(0x38);
    0134 E308      LDI	R16,0x38
    0135 DFAB      RCALL	_lcd_write_code
(0210)  delay_ms(5);
    0136 E005      LDI	R16,5
    0137 E010      LDI	R17,0
    0138 DF60      RCALL	_delay_ms
(0211)  lcd_write_code(0x0C);//开启显示, 无光标
    0139 E00C      LDI	R16,0xC
    013A DFA6      RCALL	_lcd_write_code
(0212)  delay_ms(5);
    013B E005      LDI	R16,5
    013C E010      LDI	R17,0
    013D DF5B      RCALL	_delay_ms
(0213)  lcd_write_code(0x06);//读写一个字符后光标加1,地址加1
    013E E006      LDI	R16,6
    013F DFA1      RCALL	_lcd_write_code
(0214)  delay_ms(5);
    0140 E005      LDI	R16,5
    0141 E010      LDI	R17,0
    0142 DF56      RCALL	_delay_ms
(0215)  lcd_write_code(0x01);//清屏:数据指针清0,显示清0
    0143 E001      LDI	R16,1
    0144 DF9C      RCALL	_lcd_write_code
(0216)  delay_ms(5);
    0145 E005      LDI	R16,5
    0146 E010      LDI	R17,0
    0147 DF51      RCALL	_delay_ms
(0217)  lcd_write_code(0X02);//数据指针清0
    0148 E002      LDI	R16,2
    0149 DF97      RCALL	_lcd_write_code
(0218)  WDR();
    014A 95A8      WDR
    014B 9508      RET
_IntToStr:
  a                    --> Y+0
  i                    --> R20
  str                  --> R22
  t                    --> R20
    014C 940E05DD  CALL	push_gset2
    014E 01B9      MOVW	R22,R18

⌨️ 快捷键说明

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