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

📄 lcd1602.lst

📁 mega8的1602液晶驱动。。。。。。。。
💻 LST
字号:
__start:
__text_start:
    001B E5CF      LDI	R28,0x5F
    001C E0D4      LDI	R29,4
    001D BFCD      OUT	0x3D,R28
    001E BFDE      OUT	0x3E,R29
    001F 51C0      SUBI	R28,0x10
    0020 40D0      SBCI	R29,0
    0021 EA0A      LDI	R16,0xAA
    0022 8308      STD	Y+0,R16
    0023 2400      CLR	R0
    0024 E7E0      LDI	R30,0x70
    0025 E0F0      LDI	R31,0
    0026 E010      LDI	R17,0
    0027 37E0      CPI	R30,0x70
    0028 07F1      CPC	R31,R17
    0029 F011      BEQ	0x002C
    002A 9201      ST	R0,Z+
    002B CFFB      RJMP	0x0027
    002C 8300      STD	Z+0,R16
    002D E2E6      LDI	R30,0x26
    002E E0F0      LDI	R31,0
    002F E6A0      LDI	R26,0x60
    0030 E0B0      LDI	R27,0
    0031 E010      LDI	R17,0
    0032 33E6      CPI	R30,0x36
    0033 07F1      CPC	R31,R17
    0034 F021      BEQ	0x0039
    0035 95C8      LPM
    0036 9631      ADIW	R30,1
    0037 920D      ST	R0,X+
    0038 CFF9      RJMP	0x0032
    0039 D039      RCALL	_main
_exit:
    003A CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Myers\桌面\2121\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) 
(0008) void delay_1us(void)                 //1us延时函数
(0009)   {
(0010)    asm("nop");
_delay_1us:
    003B 0000      NOP
    003C 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    003D D0DA      RCALL	push_gset2
    003E 01B8      MOVW	R22,R16
(0011)   }
(0012) 
(0013) void delay_nus(unsigned int n)       //N us延时函数
(0014)   {
(0015)    unsigned int i=0;
    003F 2744      CLR	R20
    0040 2755      CLR	R21
(0016)    for (i=0;i<n;i++)
    0041 C003      RJMP	0x0045
(0017)    delay_1us();
    0042 DFF8      RCALL	_delay_1us
    0043 5F4F      SUBI	R20,0xFF
    0044 4F5F      SBCI	R21,0xFF
    0045 1746      CP	R20,R22
    0046 0757      CPC	R21,R23
    0047 F3D0      BCS	0x0042
    0048 D0C5      RCALL	pop_gset2
    0049 9508      RET
(0018)   }
(0019)   
(0020) void delay_1ms(void)                 //1ms延时函数
(0021)   {
(0022)    unsigned int i;
(0023)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    004A 2700      CLR	R16
    004B 2711      CLR	R17
    004C C002      RJMP	0x004F
    004D 5F0F      SUBI	R16,0xFF
    004E 4F1F      SBCI	R17,0xFF
    004F 3704      CPI	R16,0x74
    0050 E0E4      LDI	R30,4
    0051 071E      CPC	R17,R30
    0052 F3D0      BCS	0x004D
    0053 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0054 D0C3      RCALL	push_gset2
    0055 01B8      MOVW	R22,R16
(0024)   }
(0025)   
(0026) void delay_nms(unsigned int n)       //N ms延时函数
(0027)   {
(0028)    unsigned int i=0;
    0056 2744      CLR	R20
    0057 2755      CLR	R21
(0029)    for (i=0;i<n;i++)
    0058 C003      RJMP	0x005C
(0030)    delay_1ms();
    0059 DFF0      RCALL	_delay_1ms
    005A 5F4F      SUBI	R20,0xFF
    005B 4F5F      SBCI	R21,0xFF
    005C 1746      CP	R20,R22
    005D 0757      CPC	R21,R23
    005E F3D0      BCS	0x0059
    005F D0AE      RCALL	pop_gset2
    0060 9508      RET
FILE: C:\DOCUME~1\Myers\桌面\2121\LCD1602.c
(0001) /*----------------------------------------------------
(0002) 主函数
(0003) 编译器:ICC-AVR v6.31A 
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) ---------------------------------------------------*/
(0007) // Target : M8
(0008) // Crystal: 8.0000Mhz
(0009) 
(0010) #include "LCD1602.h"
(0011) 
(0012) void port_init(void)
(0013) {
(0014)  PORTB = 0x00;
_port_init:
    0061 2422      CLR	R2
    0062 BA28      OUT	0x18,R2
(0015)  DDRB  = 0x00;
    0063 BA27      OUT	0x17,R2
(0016)  PORTC = 0x00; //m103 output only
    0064 BA25      OUT	0x15,R2
(0017)  DDRC  = 0x00;
    0065 BA24      OUT	0x14,R2
(0018)  PORTD = 0x00;
    0066 BA22      OUT	0x12,R2
(0019)  DDRD  = 0x0F;
    0067 E08F      LDI	R24,0xF
    0068 BB81      OUT	0x11,R24
    0069 9508      RET
(0020) }
(0021) 
(0022) void init_devices(void)
(0023) {
(0024)   CLI(); //disable all interrupts
_init_devices:
    006A 94F8      BCLR	7
(0025)   port_init();
    006B DFF5      RCALL	_port_init
(0026)   LCD_init();
    006C D01E      RCALL	_LCD_init
(0027)   MCUCR = 0x00;
    006D 2422      CLR	R2
    006E BE25      OUT	0x35,R2
(0028)   GICR  = 0x00;
    006F BE2B      OUT	0x3B,R2
(0029)   TIMSK = 0x00; //timer interrupt sources
    0070 BE29      OUT	0x39,R2
(0030)   SEI(); //re-enable interrupts
    0071 9478      BSET	7
    0072 9508      RET
_main:
    0073 9722      SBIW	R28,2
(0031) }
(0032) 
(0033) void main(void)
(0034) {
(0035)    init_devices();
    0074 DFF5      RCALL	_init_devices
(0036)    LCD_write_string(1,0,"Hi!!");
    0075 E68B      LDI	R24,0x6B
    0076 E090      LDI	R25,0
    0077 8399      STD	Y+1,R25
    0078 8388      STD	Y+0,R24
    0079 2722      CLR	R18
    007A E001      LDI	R16,1
    007B D074      RCALL	_LCD_write_string
(0037)    for(;;)
(0038)    {
(0039)    LCD_write_string(0,1,"archeng504");
    007C E680      LDI	R24,0x60
    007D E090      LDI	R25,0
    007E 8399      STD	Y+1,R25
    007F 8388      STD	Y+0,R24
    0080 E021      LDI	R18,1
    0081 2700      CLR	R16
    0082 D06D      RCALL	_LCD_write_string
(0040)    LCD_write_char(6,0,'8');   
    0083 E388      LDI	R24,0x38
    0084 8388      STD	Y+0,R24
    0085 2722      CLR	R18
    0086 E006      LDI	R16,6
    0087 D07C      RCALL	_LCD_write_char
    0088 CFF3      RJMP	0x007C
    0089 9622      ADIW	R28,2
    008A 9508      RET
FILE: C:\DOCUME~1\Myers\桌面\2121\LCD1602_init.c
(0001) /*----------------------------------------------------
(0002) 液晶LCD1602C  使用4条数据线(D4~D7)
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) ---------------------------------------------------*/
(0007) #include "LCD1602.h"
(0008) 
(0009) void LCD_init(void)         //液晶初始化
(0010) {
(0011)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
    008B B381      IN	R24,0x11
    008C 6F80      ORI	R24,0xF0
    008D BB81      OUT	0x11,R24
(0012)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
    008E 9A8A      SBI	0x11,2
(0013)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
    008F 9A88      SBI	0x11,0
(0014)   LCD_write_command(0x28); 
    0090 E208      LDI	R16,0x28
    0091 D014      RCALL	_LCD_write_command
(0015)   LCD_en_write();
    0092 D00D      RCALL	_LCD_en_write
(0016)   delay_nus(40);
    0093 E208      LDI	R16,0x28
    0094 E010      LDI	R17,0
    0095 DFA7      RCALL	_delay_nus
(0017)   LCD_write_command(0x28);  //4位显示
    0096 E208      LDI	R16,0x28
    0097 D00E      RCALL	_LCD_write_command
(0018)   LCD_write_command(0x0c);  //显示开
    0098 E00C      LDI	R16,0xC
    0099 D00C      RCALL	_LCD_write_command
(0019)   LCD_write_command(0x01);  //清屏
    009A E001      LDI	R16,1
    009B D00A      RCALL	_LCD_write_command
(0020)   delay_nms(2);
    009C E002      LDI	R16,2
    009D E010      LDI	R17,0
    009E DFB5      RCALL	_delay_nms
    009F 9508      RET
(0021) }
(0022) 
(0023) void LCD_en_write(void)  //液晶使能
(0024) {
(0025)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    00A0 9A92      SBI	0x12,2
(0026)   delay_nus(1);
    00A1 E001      LDI	R16,1
    00A2 E010      LDI	R17,0
    00A3 DF99      RCALL	_delay_nus
(0027)   LCD_EN_PORT&=~LCD_EN;
    00A4 9892      CBI	0x12,2
    00A5 9508      RET
_LCD_write_command:
  command              --> R20
    00A6 D073      RCALL	push_gset1
    00A7 2F40      MOV	R20,R16
(0028) }
(0029) 
(0030) void LCD_write_command(unsigned char command) //写指令
(0031) {
(0032)   delay_nus(16);
    00A8 E100      LDI	R16,0x10
    00A9 E010      LDI	R17,0
    00AA DF92      RCALL	_delay_nus
(0033)   LCD_RS_PORT&=~LCD_RS;        //RS=0
    00AB 9890      CBI	0x12,0
(0034)   LCD_DATA_PORT&=0X0f;         //清高四位
    00AC B382      IN	R24,0x12
    00AD 708F      ANDI	R24,0xF
    00AE BB82      OUT	0x12,R24
(0035)   LCD_DATA_PORT|=command&0xf0; //写高四位
    00AF 2F84      MOV	R24,R20
    00B0 7F80      ANDI	R24,0xF0
    00B1 B222      IN	R2,0x12
    00B2 2A28      OR	R2,R24
    00B3 BA22      OUT	0x12,R2
(0036)   LCD_en_write();
    00B4 DFEB      RCALL	_LCD_en_write
(0037)   command=command<<4;          //低四位移到高四位
    00B5 2F84      MOV	R24,R20
    00B6 708F      ANDI	R24,0xF
    00B7 9582      SWAP	R24
    00B8 2F48      MOV	R20,R24
(0038)   LCD_DATA_PORT&=0x0f;         //清高四位
    00B9 B382      IN	R24,0x12
    00BA 708F      ANDI	R24,0xF
    00BB BB82      OUT	0x12,R24
(0039)   LCD_DATA_PORT|=command&0xf0; //写低四位
    00BC 2F84      MOV	R24,R20
    00BD 7F80      ANDI	R24,0xF0
    00BE B222      IN	R2,0x12
    00BF 2A28      OR	R2,R24
    00C0 BA22      OUT	0x12,R2
(0040)   LCD_en_write();
    00C1 DFDE      RCALL	_LCD_en_write
    00C2 D05A      RCALL	pop_gset1
    00C3 9508      RET
_LCD_write_data:
  data                 --> R20
    00C4 D055      RCALL	push_gset1
    00C5 2F40      MOV	R20,R16
(0041)   
(0042) }
(0043) 
(0044) void LCD_write_data(unsigned char data) //写数据
(0045) {
(0046)   delay_nus(16);
    00C6 E100      LDI	R16,0x10
    00C7 E010      LDI	R17,0
    00C8 DF74      RCALL	_delay_nus
(0047)   LCD_RS_PORT|=LCD_RS;       //RS=1
    00C9 9A90      SBI	0x12,0
(0048)   LCD_DATA_PORT&=0X0f;       //清高四位
    00CA B382      IN	R24,0x12
    00CB 708F      ANDI	R24,0xF
    00CC BB82      OUT	0x12,R24
(0049)   LCD_DATA_PORT|=data&0xf0;  //写高四位
    00CD 2F84      MOV	R24,R20
    00CE 7F80      ANDI	R24,0xF0
    00CF B222      IN	R2,0x12
    00D0 2A28      OR	R2,R24
    00D1 BA22      OUT	0x12,R2
(0050)   LCD_en_write();
    00D2 DFCD      RCALL	_LCD_en_write
(0051)   data=data<<4;               //低四位移到高四位
    00D3 2F84      MOV	R24,R20
    00D4 708F      ANDI	R24,0xF
    00D5 9582      SWAP	R24
    00D6 2F48      MOV	R20,R24
(0052)   LCD_DATA_PORT&=0X0f;        //清高四位
    00D7 B382      IN	R24,0x12
    00D8 708F      ANDI	R24,0xF
    00D9 BB82      OUT	0x12,R24
(0053)   LCD_DATA_PORT|=data&0xf0;   //写低四位
    00DA 2F84      MOV	R24,R20
    00DB 7F80      ANDI	R24,0xF0
    00DC B222      IN	R2,0x12
    00DD 2A28      OR	R2,R24
    00DE BA22      OUT	0x12,R2
(0054)   LCD_en_write();
    00DF DFC0      RCALL	_LCD_en_write
    00E0 D03C      RCALL	pop_gset1
    00E1 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00E2 D035      RCALL	push_gset2
    00E3 2F42      MOV	R20,R18
    00E4 2F60      MOV	R22,R16
(0055) }
(0056) 
(0057) 
(0058) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0059) {
(0060)     unsigned char address;
(0061)     if (y == 0) address = 0x80 + x;
    00E5 2344      TST	R20
    00E6 F419      BNE	0x00EA
    00E7 2F46      MOV	R20,R22
    00E8 5840      SUBI	R20,0x80
    00E9 C002      RJMP	0x00EC
(0062)     else   address = 0xc0 + x;
    00EA 2F46      MOV	R20,R22
    00EB 5440      SUBI	R20,0x40
(0063)     LCD_write_command( address);
    00EC 2F04      MOV	R16,R20
    00ED DFB8      RCALL	_LCD_write_command
    00EE D01F      RCALL	pop_gset2
    00EF 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    00F0 D025      RCALL	push_gset3
    00F1 2EA2      MOV	R10,R18
    00F2 2F60      MOV	R22,R16
    00F3 814E      LDD	R20,Y+6
    00F4 815F      LDD	R21,Y+7
(0064) }
(0065)   
(0066) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0067) {
(0068)     LCD_set_xy( X, Y ); //写地址    
    00F5 2D2A      MOV	R18,R10
    00F6 2F06      MOV	R16,R22
    00F7 DFEA      RCALL	_LCD_set_xy
    00F8 C005      RJMP	0x00FE
(0069)     while (*s)  // 写显示字符
(0070)     {
(0071)       LCD_write_data( *s );
    00F9 01FA      MOVW	R30,R20
    00FA 8100      LDD	R16,Z+0
    00FB DFC8      RCALL	_LCD_write_data
(0072)       s ++;
    00FC 5F4F      SUBI	R20,0xFF
    00FD 4F5F      SBCI	R21,0xFF
    00FE 01FA      MOVW	R30,R20
    00FF 8020      LDD	R2,Z+0
    0100 2022      TST	R2
    0101 F7B9      BNE	0x00F9
    0102 D00D      RCALL	pop_gset3
    0103 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    0104 D013      RCALL	push_gset2
    0105 2F62      MOV	R22,R18
    0106 2F40      MOV	R20,R16
(0073)     }
(0074)       
(0075) }
(0076) 
(0077) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0078) {
(0079)   LCD_set_xy( X, Y ); //写地址
    0107 2F26      MOV	R18,R22
    0108 2F04      MOV	R16,R20
    0109 DFD8      RCALL	_LCD_set_xy
(0080)   LCD_write_data( data);
FILE: <library>
    010A 810C      LDD	R16,Y+4
    010B DFB8      RCALL	_LCD_write_data
    010C D001      RCALL	pop_gset2
    010D 9508      RET
pop_gset2:
    010E E0E2      LDI	R30,2
    010F C00E      RJMP	pop
pop_gset3:
    0110 E0E4      LDI	R30,4
    0111 C00C      RJMP	pop
push_gset5:
    0112 92FA      ST	R15,-Y
    0113 92EA      ST	R14,-Y
push_gset4:
    0114 92DA      ST	R13,-Y
    0115 92CA      ST	R12,-Y
push_gset3:
    0116 92BA      ST	R11,-Y
    0117 92AA      ST	R10,-Y
push_gset2:
    0118 937A      ST	R23,-Y
    0119 936A      ST	R22,-Y
push_gset1:
    011A 935A      ST	R21,-Y
    011B 934A      ST	R20,-Y
    011C 9508      RET
pop_gset1:
    011D E0E1      LDI	R30,1
pop:
    011E 9149      LD	R20,Y+
    011F 9159      LD	R21,Y+
    0120 FDE0      SBRC	R30,0
    0121 9508      RET
    0122 9169      LD	R22,Y+
    0123 9179      LD	R23,Y+
    0124 FDE1      SBRC	R30,1
    0125 9508      RET
    0126 90A9      LD	R10,Y+
    0127 90B9      LD	R11,Y+
    0128 FDE2      SBRC	R30,2
    0129 9508      RET
    012A 90C9      LD	R12,Y+
    012B 90D9      LD	R13,Y+
    012C FDE3      SBRC	R30,3
    012D 9508      RET
    012E 90E9      LD	R14,Y+
    012F 90F9      LD	R15,Y+
    0130 9508      RET

⌨️ 快捷键说明

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