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

📄 lcd_c.lst

📁 上载的是LCD TS1602 的C语言版本驱动程序。可用PROTEUS进行仿真调试。
💻 LST
字号:
__start:
__text_start:
    0032 E5CF      LDI	R28,0x5F
    0033 E0D4      LDI	R29,4
    0034 BFCD      OUT	0x3D,R28
    0035 BFDE      OUT	0x3E,R29
    0036 51C0      SUBI	R28,0x10
    0037 40D0      SBCI	R29,0
    0038 EA0A      LDI	R16,0xAA
    0039 8308      STD	Y+0,R16
    003A 2400      CLR	R0
    003B E7E0      LDI	R30,0x70
    003C E0F0      LDI	R31,0
    003D E010      LDI	R17,0
    003E 37E0      CPI	R30,0x70
    003F 07F1      CPC	R31,R17
    0040 F011      BEQ	0x0043
    0041 9201      ST	R0,Z+
    0042 CFFB      RJMP	0x003E
    0043 8300      STD	Z+0,R16
    0044 E5E4      LDI	R30,0x54
    0045 E0F0      LDI	R31,0
    0046 E6A0      LDI	R26,0x60
    0047 E0B0      LDI	R27,0
    0048 E010      LDI	R17,0
    0049 36E4      CPI	R30,0x64
    004A 07F1      CPC	R31,R17
    004B F021      BEQ	0x0050
    004C 95C8      LPM
    004D 9631      ADIW	R30,1
    004E 920D      ST	R0,X+
    004F CFF9      RJMP	0x0049
    0050 940E0086  CALL	_main
_exit:
    0052 CFFF      RJMP	_exit
FILE: D:\xiaorenren09\LCD_C\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008) 
(0009) void delay_1us(void)                 //1us延时函数
(0010)   {
(0011)    asm("nop");
_delay_1us:
    0053 0000      NOP
    0054 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0055 940E013F  CALL	push_gset2
    0057 01B8      MOVW	R22,R16
(0012)   }
(0013) 
(0014) void delay_nus(unsigned int n)       //N us延时函数
(0015)   {
(0016)    unsigned int i=0;
    0058 2744      CLR	R20
    0059 2755      CLR	R21
(0017)    for (i=0;i<n;i++)
    005A C003      RJMP	0x005E
(0018)    delay_1us();
    005B DFF7      RCALL	_delay_1us
    005C 5F4F      SUBI	R20,0xFF
    005D 4F5F      SBCI	R21,0xFF
    005E 1746      CP	R20,R22
    005F 0757      CPC	R21,R23
    0060 F3D0      BCS	0x005B
    0061 940E0133  CALL	pop_gset2
    0063 9508      RET
(0019)   }
(0020)   
(0021) void delay_1ms(void)                 //1ms延时函数
(0022)   {
(0023)    unsigned int i;
(0024)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    0064 2700      CLR	R16
    0065 2711      CLR	R17
    0066 C002      RJMP	0x0069
    0067 5F0F      SUBI	R16,0xFF
    0068 4F1F      SBCI	R17,0xFF
    0069 3704      CPI	R16,0x74
    006A E0E4      LDI	R30,4
    006B 071E      CPC	R17,R30
    006C F3D0      BCS	0x0067
    006D 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    006E 940E013F  CALL	push_gset2
    0070 01B8      MOVW	R22,R16
(0025)   }
(0026)   
(0027) void delay_nms(unsigned int n)       //N ms延时函数
(0028)   {
(0029)    unsigned int i=0;
    0071 2744      CLR	R20
    0072 2755      CLR	R21
(0030)    for (i=0;i<n;i++)
    0073 C003      RJMP	0x0077
(0031)    delay_1ms();
    0074 DFEF      RCALL	_delay_1ms
    0075 5F4F      SUBI	R20,0xFF
    0076 4F5F      SBCI	R21,0xFF
    0077 1746      CP	R20,R22
    0078 0757      CPC	R21,R23
    0079 F3D0      BCS	0x0074
    007A 940E0133  CALL	pop_gset2
    007C 9508      RET
FILE: D:\xiaorenren09\LCD_C\lcd_c.c
(0001) /*----------------------------------------------------
(0002) 主函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008) 
(0009) #include "LCD.h"
(0010) 
(0011) 
(0012) void init_devices(void)
(0013) {
(0014)   CLI(); //disable all interrupts
_init_devices:
    007D 94F8      BCLR	7
(0015)   LCD_init();
    007E 940E00A1  CALL	_LCD_init
(0016)   MCUCR = 0x00;
    0080 2422      CLR	R2
    0081 BE25      OUT	0x35,R2
(0017)   GICR  = 0x00;
    0082 BE2B      OUT	0x3B,R2
(0018)   TIMSK = 0x00; //timer interrupt sources
    0083 BE29      OUT	0x39,R2
(0019)   SEI(); //re-enable interrupts
    0084 9478      BSET	7
    0085 9508      RET
_main:
    0086 9722      SBIW	R28,2
(0020) }
(0021) 
(0022) void main(void)
(0023) {
(0024)    init_devices();
    0087 DFF5      RCALL	_init_devices
(0025)    LCD_write_string(1,0,"Hi!!");
    0088 E68B      LDI	R24,0x6B
    0089 E090      LDI	R25,0
    008A 8399      STD	Y+1,R25
    008B 8388      STD	Y+0,R24
    008C 2722      CLR	R18
    008D E001      LDI	R16,1
    008E 940E0111  CALL	_LCD_write_string
(0026)    for(;;)
(0027)    {
(0028)    LCD_write_string(0,1,"archeng504");
    0090 E680      LDI	R24,0x60
    0091 E090      LDI	R25,0
    0092 8399      STD	Y+1,R25
    0093 8388      STD	Y+0,R24
    0094 E021      LDI	R18,1
    0095 2700      CLR	R16
    0096 940E0111  CALL	_LCD_write_string
(0029)    LCD_write_char(6,0,'8');   
    0098 E388      LDI	R24,0x38
    0099 8388      STD	Y+0,R24
    009A 2722      CLR	R18
    009B E006      LDI	R16,6
    009C 940E0127  CALL	_LCD_write_char
    009E CFF1      RJMP	0x0090
    009F 9622      ADIW	R28,2
    00A0 9508      RET
FILE: D:\xiaorenren09\LCD_C\LCD_init.c
(0001) /*----------------------------------------------------
(0002) 液晶LCD1602C  使用4条数据线(D4~D7)
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008) #include "LCD.h"
(0009) 
(0010) void LCD_init(void)         //液晶初始化
(0011) {
(0012)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
    00A1 B38A      IN	R24,0x1A
    00A2 6F80      ORI	R24,0xF0
    00A3 BB8A      OUT	0x1A,R24
(0013)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
    00A4 9AD3      SBI	0x1A,3
(0014)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
    00A5 9AD2      SBI	0x1A,2
(0015)   LCD_write_command(0x28); 
    00A6 E208      LDI	R16,0x28
    00A7 D017      RCALL	_LCD_write_command
(0016)   LCD_en_write();
    00A8 D00F      RCALL	_LCD_en_write
(0017)   delay_nus(40);
    00A9 E208      LDI	R16,0x28
    00AA E010      LDI	R17,0
    00AB 940E0055  CALL	_delay_nus
(0018)   LCD_write_command(0x28);  //4位显示
    00AD E208      LDI	R16,0x28
    00AE D010      RCALL	_LCD_write_command
(0019)   LCD_write_command(0x0c);  //显示开
    00AF E00C      LDI	R16,0xC
    00B0 D00E      RCALL	_LCD_write_command
(0020)   LCD_write_command(0x01);  //清屏
    00B1 E001      LDI	R16,1
    00B2 D00C      RCALL	_LCD_write_command
(0021)   delay_nms(2);
    00B3 E002      LDI	R16,2
    00B4 E010      LDI	R17,0
    00B5 940E006E  CALL	_delay_nms
    00B7 9508      RET
(0022) }
(0023) 
(0024) void LCD_en_write(void)  //液晶使能
(0025) {
(0026)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    00B8 9ADB      SBI	0x1B,3
(0027)   delay_nus(1);
    00B9 E001      LDI	R16,1
    00BA E010      LDI	R17,0
    00BB 940E0055  CALL	_delay_nus
(0028)   LCD_EN_PORT&=~LCD_EN;
    00BD 98DB      CBI	0x1B,3
    00BE 9508      RET
_LCD_write_command:
  command              --> R20
    00BF 940E0141  CALL	push_gset1
    00C1 2F40      MOV	R20,R16
(0029) }
(0030) 
(0031) void LCD_write_command(unsigned char command) //写指令
(0032) {
(0033)   delay_nus(16);
    00C2 E100      LDI	R16,0x10
    00C3 E010      LDI	R17,0
    00C4 940E0055  CALL	_delay_nus
(0034)   LCD_RS_PORT&=~LCD_RS;        //RS=0
    00C6 98DA      CBI	0x1B,2
(0035)   LCD_DATA_PORT&=0X0f;         //清高四位
    00C7 B38B      IN	R24,0x1B
    00C8 708F      ANDI	R24,0xF
    00C9 BB8B      OUT	0x1B,R24
(0036)   LCD_DATA_PORT|=command&0xf0; //写高四位
    00CA 2F84      MOV	R24,R20
    00CB 7F80      ANDI	R24,0xF0
    00CC B22B      IN	R2,0x1B
    00CD 2A28      OR	R2,R24
    00CE BA2B      OUT	0x1B,R2
(0037)   LCD_en_write();
    00CF DFE8      RCALL	_LCD_en_write
(0038)   command=command<<4;          //低四位移到高四位
    00D0 2F84      MOV	R24,R20
    00D1 708F      ANDI	R24,0xF
    00D2 9582      SWAP	R24
    00D3 2F48      MOV	R20,R24
(0039)   LCD_DATA_PORT&=0x0f;         //清高四位
    00D4 B38B      IN	R24,0x1B
    00D5 708F      ANDI	R24,0xF
    00D6 BB8B      OUT	0x1B,R24
(0040)   LCD_DATA_PORT|=command&0xf0; //写低四位
    00D7 2F84      MOV	R24,R20
    00D8 7F80      ANDI	R24,0xF0
    00D9 B22B      IN	R2,0x1B
    00DA 2A28      OR	R2,R24
    00DB BA2B      OUT	0x1B,R2
(0041)   LCD_en_write();
    00DC DFDB      RCALL	_LCD_en_write
    00DD 940E0144  CALL	pop_gset1
    00DF 9508      RET
_LCD_write_data:
  data                 --> R20
    00E0 940E0141  CALL	push_gset1
    00E2 2F40      MOV	R20,R16
(0042)   
(0043) }
(0044) 
(0045) void LCD_write_data(unsigned char data) //写数据
(0046) {
(0047)   delay_nus(16);
    00E3 E100      LDI	R16,0x10
    00E4 E010      LDI	R17,0
    00E5 940E0055  CALL	_delay_nus
(0048)   LCD_RS_PORT|=LCD_RS;       //RS=1
    00E7 9ADA      SBI	0x1B,2
(0049)   LCD_DATA_PORT&=0X0f;       //清高四位
    00E8 B38B      IN	R24,0x1B
    00E9 708F      ANDI	R24,0xF
    00EA BB8B      OUT	0x1B,R24
(0050)   LCD_DATA_PORT|=data&0xf0;  //写高四位
    00EB 2F84      MOV	R24,R20
    00EC 7F80      ANDI	R24,0xF0
    00ED B22B      IN	R2,0x1B
    00EE 2A28      OR	R2,R24
    00EF BA2B      OUT	0x1B,R2
(0051)   LCD_en_write();
    00F0 DFC7      RCALL	_LCD_en_write
(0052)   data=data<<4;               //低四位移到高四位
    00F1 2F84      MOV	R24,R20
    00F2 708F      ANDI	R24,0xF
    00F3 9582      SWAP	R24
    00F4 2F48      MOV	R20,R24
(0053)   LCD_DATA_PORT&=0X0f;        //清高四位
    00F5 B38B      IN	R24,0x1B
    00F6 708F      ANDI	R24,0xF
    00F7 BB8B      OUT	0x1B,R24
(0054)   LCD_DATA_PORT|=data&0xf0;   //写低四位
    00F8 2F84      MOV	R24,R20
    00F9 7F80      ANDI	R24,0xF0
    00FA B22B      IN	R2,0x1B
    00FB 2A28      OR	R2,R24
    00FC BA2B      OUT	0x1B,R2
(0055)   LCD_en_write();
    00FD DFBA      RCALL	_LCD_en_write
    00FE 940E0144  CALL	pop_gset1
    0100 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    0101 940E013F  CALL	push_gset2
    0103 2F42      MOV	R20,R18
    0104 2F60      MOV	R22,R16
(0056) }
(0057) 
(0058) 
(0059) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0060) {
(0061)     unsigned char address;
(0062)     if (y == 0) address = 0x80 + x;
    0105 2344      TST	R20
    0106 F419      BNE	0x010A
    0107 2F46      MOV	R20,R22
    0108 5840      SUBI	R20,0x80
    0109 C002      RJMP	0x010C
(0063)     else   address = 0xc0 + x;
    010A 2F46      MOV	R20,R22
    010B 5440      SUBI	R20,0x40
(0064)     LCD_write_command( address);
    010C 2F04      MOV	R16,R20
    010D DFB1      RCALL	_LCD_write_command
    010E 940E0133  CALL	pop_gset2
    0110 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    0111 940E013D  CALL	push_gset3
    0113 2EA2      MOV	R10,R18
    0114 2F60      MOV	R22,R16
    0115 814E      LDD	R20,Y+6
    0116 815F      LDD	R21,Y+7
(0065) }
(0066)   
(0067) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0068) {
(0069)     LCD_set_xy( X, Y ); //写地址    
    0117 2D2A      MOV	R18,R10
    0118 2F06      MOV	R16,R22
    0119 DFE7      RCALL	_LCD_set_xy
    011A C005      RJMP	0x0120
(0070)     while (*s)  // 写显示字符
(0071)     {
(0072)       LCD_write_data( *s );
    011B 01FA      MOVW	R30,R20
    011C 8100      LDD	R16,Z+0
    011D DFC2      RCALL	_LCD_write_data
(0073)       s ++;
    011E 5F4F      SUBI	R20,0xFF
    011F 4F5F      SBCI	R21,0xFF
    0120 01FA      MOVW	R30,R20
    0121 8020      LDD	R2,Z+0
    0122 2022      TST	R2
    0123 F7B9      BNE	0x011B
    0124 940E0136  CALL	pop_gset3
    0126 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    0127 940E013F  CALL	push_gset2
    0129 2F62      MOV	R22,R18
    012A 2F40      MOV	R20,R16
(0074)     }
(0075)       
(0076) }
(0077) 
(0078) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0079) {
(0080)   LCD_set_xy( X, Y ); //写地址
    012B 2F26      MOV	R18,R22
    012C 2F04      MOV	R16,R20
    012D DFD3      RCALL	_LCD_set_xy
(0081)   LCD_write_data( data);
FILE: <library>
    012E 810C      LDD	R16,Y+4
    012F DFB0      RCALL	_LCD_write_data
    0130 940E0133  CALL	pop_gset2
    0132 9508      RET
pop_gset2:
    0133 E0E2      LDI	R30,2
    0134 940C0145  JMP	pop
pop_gset3:
    0136 E0E4      LDI	R30,4
    0137 940C0145  JMP	pop
push_gset5:
    0139 92FA      ST	R15,-Y
    013A 92EA      ST	R14,-Y
push_gset4:
    013B 92DA      ST	R13,-Y
    013C 92CA      ST	R12,-Y
push_gset3:
    013D 92BA      ST	R11,-Y
    013E 92AA      ST	R10,-Y
push_gset2:
    013F 937A      ST	R23,-Y
    0140 936A      ST	R22,-Y
push_gset1:
    0141 935A      ST	R21,-Y
    0142 934A      ST	R20,-Y
    0143 9508      RET
pop_gset1:
    0144 E0E1      LDI	R30,1
pop:
    0145 9149      LD	R20,Y+
    0146 9159      LD	R21,Y+
    0147 FDE0      SBRC	R30,0
    0148 9508      RET
    0149 9169      LD	R22,Y+
    014A 9179      LD	R23,Y+
    014B FDE1      SBRC	R30,1
    014C 9508      RET
    014D 90A9      LD	R10,Y+
    014E 90B9      LD	R11,Y+
    014F FDE2      SBRC	R30,2
    0150 9508      RET
    0151 90C9      LD	R12,Y+
    0152 90D9      LD	R13,Y+
    0153 FDE3      SBRC	R30,3
    0154 9508      RET
    0155 90E9      LD	R14,Y+
    0156 90F9      LD	R15,Y+
    0157 9508      RET

⌨️ 快捷键说明

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