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

📄 lcd_c.lst

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

⌨️ 快捷键说明

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