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

📄 lcd.lst

📁 本程序是基于avr单片机的atmega48的控制16*4点阵型液晶。其中main文件调用LCD.c和LCD.h文件。用户可以直接把工程中的LCD.c和LCD.h文件放到自己的程序目录下即可。
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0037 EFCF      LDI	R28,0xFF
    0038 E0D2      LDI	R29,2
    0039 BFCD      OUT	0x3D,R28
    003A BFDE      OUT	0x3E,R29
    003B 51C0      SUBI	R28,0x10
    003C 40D0      SBCI	R29,0
    003D EA0A      LDI	R16,0xAA
    003E 8308      STD	Y+0,R16
    003F 2400      CLR	R0
    0040 E3EA      LDI	R30,0x3A
    0041 E0F1      LDI	R31,1
    0042 E011      LDI	R17,1
    0043 33EE      CPI	R30,0x3E
    0044 07F1      CPC	R31,R17
    0045 F011      BEQ	0x0048
    0046 9201      ST	R0,Z+
    0047 CFFB      RJMP	0x0043
    0048 8300      STD	Z+0,R16
    0049 E3E4      LDI	R30,0x34
    004A E0F0      LDI	R31,0
    004B E0A0      LDI	R26,0
    004C E0B1      LDI	R27,1
    004D E010      LDI	R17,0
    004E 36EE      CPI	R30,0x6E
    004F 07F1      CPC	R31,R17
    0050 F021      BEQ	0x0055
    0051 95C8      LPM
    0052 9631      ADIW	R30,1
    0053 920D      ST	R0,X+
    0054 CFF9      RJMP	0x004E
    0055 D132      RCALL	_main
_exit:
    0056 CFFF      RJMP	_exit
FILE: F:\avrprojs\lcd_block\lcd.h
(0001) #include <iom48v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define LCD_DATA_PORT  PORTB
(0005) #define LCD_DATA_DDR   DDRB
(0006) #define LCD_EN_PORT  PORTD
(0007) #define LCD_RS_PORT  PORTD
(0008) #define LCD_EN  0x10
(0009) #define LCD_RS  0x08
(0010) 
(0011) void LCD_init         (void);
(0012) void LCD_en_write     (void);
(0013) void LCD_write_char   (unsigned command,unsigned data);
(0014) void LCD_set_xy       (int x, int y);
(0015) void LCD_write_string (int X,int Y,unsigned char *s);
(0016) void LCD_display_char (int X,int Y,unsigned char data);
(0017) void delay_nus        (unsigned int n);
(0018) void delay_nms        (unsigned int n);
(0019) 
(0020) 
(0021) void LCD_init(void)       //液晶初始化
(0022) {
(0023)  delay_nms(2);
_LCD_init:
    0057 E002      LDI	R16,2
    0058 E010      LDI	R17,0
    0059 D0D3      RCALL	_delay_nms
(0024)  LCD_write_char(0x38,0);  //8位显示
    005A 2722      CLR	R18
    005B 2733      CLR	R19
    005C E308      LDI	R16,0x38
    005D E010      LDI	R17,0
    005E D08B      RCALL	_LCD_write_char
(0025) 
(0026)   delay_nms(6);
    005F E006      LDI	R16,6
    0060 E010      LDI	R17,0
    0061 D0CB      RCALL	_delay_nms
(0027)  LCD_write_char(0x38,0);  //8位显示
    0062 2722      CLR	R18
    0063 2733      CLR	R19
    0064 E308      LDI	R16,0x38
    0065 E010      LDI	R17,0
    0066 D083      RCALL	_LCD_write_char
(0028) 
(0029)   delay_nms(2);
    0067 E002      LDI	R16,2
    0068 E010      LDI	R17,0
    0069 D0C3      RCALL	_delay_nms
(0030)  LCD_write_char(0x38,0);  //8位显示
    006A 2722      CLR	R18
    006B 2733      CLR	R19
    006C E308      LDI	R16,0x38
    006D E010      LDI	R17,0
    006E D07B      RCALL	_LCD_write_char
(0031) 
(0032)  LCD_write_char(0x38,0);  //8位显示
    006F 2722      CLR	R18
    0070 2733      CLR	R19
    0071 E308      LDI	R16,0x38
    0072 E010      LDI	R17,0
    0073 D076      RCALL	_LCD_write_char
(0033)   delay_nms(2);
    0074 E002      LDI	R16,2
    0075 E010      LDI	R17,0
    0076 D0B6      RCALL	_delay_nms
(0034)  LCD_write_char(0x01,0);  //8位显示
    0077 2722      CLR	R18
    0078 2733      CLR	R19
    0079 E001      LDI	R16,1
    007A E010      LDI	R17,0
    007B D06E      RCALL	_LCD_write_char
(0035)   delay_nms(2);
    007C E002      LDI	R16,2
    007D E010      LDI	R17,0
    007E D0AE      RCALL	_delay_nms
(0036)  LCD_write_char(0x08,0);  //8位显示
    007F 2722      CLR	R18
    0080 2733      CLR	R19
    0081 E008      LDI	R16,0x8
    0082 E010      LDI	R17,0
    0083 D066      RCALL	_LCD_write_char
(0037)   delay_nms(1);
    0084 E001      LDI	R16,1
    0085 E010      LDI	R17,0
    0086 D0A6      RCALL	_delay_nms
(0038)  
(0039)  LCD_write_char(0x06,0);  //8位显示
    0087 2722      CLR	R18
    0088 2733      CLR	R19
    0089 E006      LDI	R16,6
    008A E010      LDI	R17,0
    008B D05E      RCALL	_LCD_write_char
(0040)  delay_nms(1);
    008C E001      LDI	R16,1
    008D E010      LDI	R17,0
    008E D09E      RCALL	_delay_nms
(0041)  
(0042)  
(0043)  LCD_write_char(0x0c,0);  //显示开
    008F 2722      CLR	R18
    0090 2733      CLR	R19
    0091 E00C      LDI	R16,0xC
    0092 E010      LDI	R17,0
    0093 D056      RCALL	_LCD_write_char
(0044)  //delay_nms(100);
(0045)  LCD_write_char(0x01,0);  //清屏
    0094 2722      CLR	R18
    0095 2733      CLR	R19
    0096 E001      LDI	R16,1
    0097 E010      LDI	R17,0
    0098 D051      RCALL	_LCD_write_char
    0099 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    009A D182      RCALL	push_gset3
    009B 0159      MOVW	R10,R18
    009C 01B8      MOVW	R22,R16
    009D 814E      LDD	R20,Y+6
    009E 815F      LDD	R21,Y+7
(0046)  //delay_nms(3);
(0047) }
(0048) 
(0049) void LCD_write_string(int X,int Y,unsigned char *s)
(0050)   {
(0051)     LCD_set_xy( X, Y ); //写地址
    009F 0195      MOVW	R18,R10
    00A0 018B      MOVW	R16,R22
    00A1 D00F      RCALL	_LCD_set_xy
    00A2 C008      RJMP	0x00AB
(0052)     
(0053)     while (*s)  // 写显示字符
(0054)       {
(0055)         LCD_write_char( 0, *s );
    00A3 01FA      MOVW	R30,R20
    00A4 8120      LDD	R18,Z+0
    00A5 2733      CLR	R19
    00A6 2700      CLR	R16
    00A7 2711      CLR	R17
    00A8 D041      RCALL	_LCD_write_char
(0056) 	    s ++;
    00A9 5F4F      SUBI	R20,0xFF
    00AA 4F5F      SBCI	R21,0xFF
    00AB 01FA      MOVW	R30,R20
    00AC 8020      LDD	R2,Z+0
    00AD 2022      TST	R2
    00AE F7A1      BNE	0x00A3
    00AF D167      RCALL	pop_gset3
    00B0 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R22
  x                    --> R20
    00B1 D16D      RCALL	push_gset2
    00B2 01B9      MOVW	R22,R18
    00B3 01A8      MOVW	R20,R16
(0057)       }
(0058)   }
(0059) 
(0060) 
(0061) void LCD_set_xy( int x, int y )  //写地址函数
(0062)   {
(0063)     
(0064)     unsigned char address;
(0065) 	delay_nus(100);
    00B4 E604      LDI	R16,0x64
    00B5 E010      LDI	R17,0
    00B6 D05F      RCALL	_delay_nus
(0066) 	address=x&0x0f;
    00B7 704F      ANDI	R20,0xF
    00B8 7050      ANDI	R21,0
(0067)     switch(y)
    00B9 3060      CPI	R22,0
    00BA 0767      CPC	R22,R23
    00BB F069      BEQ	0x00C9
    00BC 3061      CPI	R22,1
    00BD E0E0      LDI	R30,0
    00BE 077E      CPC	R23,R30
    00BF F051      BEQ	0x00CA
    00C0 3062      CPI	R22,2
    00C1 E0E0      LDI	R30,0
    00C2 077E      CPC	R23,R30
    00C3 F041      BEQ	0x00CC
    00C4 3063      CPI	R22,3
    00C5 E0E0      LDI	R30,0
    00C6 077E      CPC	R23,R30
    00C7 F031      BEQ	0x00CE
    00C8 C006      RJMP	0x00CF
(0068)       {
(0069)       	case 0:
(0070) 			address+= 0x00;          //0x00 - 0x0f
(0071) 			break;
    00C9 C005      RJMP	0x00CF
(0072) 		case 1:
(0073) 			address+= 0x40;          //0x40 - 0x4f
    00CA 5C40      SUBI	R20,0xC0
(0074) 			break;
    00CB C003      RJMP	0x00CF
(0075) 		case 2:
(0076) 			address+= 0x10;          //0x10 - 0x1f
    00CC 5F40      SUBI	R20,0xF0
(0077) 			break;
    00CD C001      RJMP	0x00CF
(0078) 		case 3:
(0079) 			address+= 0x50;          //0x50 - 0x5f
    00CE 5B40      SUBI	R20,0xB0
(0080) 			break;
(0081) 		default :
(0082) 			break;
(0083)       }
(0084) 	address=address|0x80;
    00CF 6840      ORI	R20,0x80
(0085)     LCD_write_char( address, 0 );
    00D0 2722      CLR	R18
    00D1 2733      CLR	R19
    00D2 2F04      MOV	R16,R20
    00D3 2711      CLR	R17
    00D4 D015      RCALL	_LCD_write_char
    00D5 D13F      RCALL	pop_gset2
    00D6 9508      RET
(0086) 	//delay_nms(2);
(0087)   }
(0088) 
(0089) 
(0090) void LCD_en_write(void)  //液晶使能
(0091) {
(0092)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    00D7 9A5C      SBI	0x0B,4
(0093)   delay_nus(1);
    00D8 E001      LDI	R16,1
    00D9 E010      LDI	R17,0
    00DA D03B      RCALL	_delay_nus
(0094)   LCD_EN_PORT&=~LCD_EN;
    00DB 985C      CBI	0x0B,4
    00DC 9508      RET
_LCD_display_char:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    00DD D141      RCALL	push_gset2
    00DE 01B9      MOVW	R22,R18
    00DF 01A8      MOVW	R20,R16
(0095) }
(0096) void LCD_display_char(int x,int y,unsigned char data)
(0097) {
(0098)    LCD_set_xy(x,y);  //写地址函数
    00E0 019B      MOVW	R18,R22
    00E1 018A      MOVW	R16,R20
    00E2 DFCE      RCALL	_LCD_set_xy
(0099)    LCD_write_char(0,data);
    00E3 812C      LDD	R18,Y+4
    00E4 2733      CLR	R19
    00E5 2700      CLR	R16
    00E6 2711      CLR	R17
    00E7 D002      RCALL	_LCD_write_char
    00E8 D12C      RCALL	pop_gset2
    00E9 9508      RET
_LCD_write_char:
  data                 --> R22
  command              --> R20
    00EA D134      RCALL	push_gset2
    00EB 01B9      MOVW	R22,R18
    00EC 01A8      MOVW	R20,R16
(0100) }
(0101) 
(0102) void LCD_write_char(unsigned command,unsigned data) // 写数据
(0103) {
(0104) 
(0105)  delay_nus(16);
    00ED E100      LDI	R16,0x10
    00EE E010      LDI	R17,0
    00EF D026      RCALL	_delay_nus
(0106)  if(command==0)
    00F0 3040      CPI	R20,0
    00F1 0745      CPC	R20,R21
    00F2 F449      BNE	0x00FC
(0107)  {
(0108)   LCD_RS_PORT|=LCD_RS;  //RS=1
    00F3 9A5B      SBI	0x0B,3
(0109)   LCD_EN_PORT&=~LCD_EN;
    00F4 985C      CBI	0x0B,4
(0110)   LCD_DATA_PORT=data;
    00F5 B965      OUT	0x05,R22
(0111)   LCD_EN_PORT|=LCD_EN;
    00F6 9A5C      SBI	0x0B,4
(0112)   
(0113)   delay_nus(50);
    00F7 E302      LDI	R16,0x32
    00F8 E010      LDI	R17,0
    00F9 D01C      RCALL	_delay_nus
(0114)   LCD_EN_PORT&=~LCD_EN;
    00FA 985C      CBI	0x0B,4
(0115)  }
    00FB C008      RJMP	0x0104
(0116)  else
(0117)  {
(0118)   LCD_RS_PORT&=~LCD_RS;   //RS=0
    00FC 985B      CBI	0x0B,3
(0119)    LCD_EN_PORT&=~LCD_EN;
    00FD 985C      CBI	0x0B,4
(0120)   LCD_DATA_PORT=command;
    00FE B945      OUT	0x05,R20
(0121)   LCD_EN_PORT|=LCD_EN;
    00FF 9A5C      SBI	0x0B,4
(0122)   
(0123)   delay_nus(50);
    0100 E302      LDI	R16,0x32
    0101 E010      LDI	R17,0
    0102 D013      RCALL	_delay_nus
(0124)   LCD_EN_PORT&=~LCD_EN;
    0103 985C      CBI	0x0B,4
(0125)   }
    0104 D110      RCALL	pop_gset2
    0105 9508      RET
(0126) }
(0127) 
(0128) void port_init(void)
(0129) {
(0130)  PORTB = 0x1B;
_port_init:
    0106 E18B      LDI	R24,0x1B
    0107 B985      OUT	0x05,R24
(0131)  DDRB  = 0xFF;
    0108 EF8F      LDI	R24,0xFF
    0109 B984      OUT	0x04,R24
(0132)  PORTC = 0x03; //m103 output only
    010A E083      LDI	R24,3
    010B B988      OUT	0x08,R24
(0133)  DDRC  = 0x03;
    010C B987      OUT	0x07,R24
(0134)  PORTD = 0x00;
    010D 2422      CLR	R2
    010E B82B      OUT	0x0B,R2
(0135)  DDRD  = 0x18;
    010F E188      LDI	R24,0x18
    0110 B98A      OUT	0x0A,R24
    0111 9508      RET
(0136) }
(0137) 
(0138) //call this routine to initialize all peripherals
(0139) void init_devices(void)
(0140) {
(0141)  //stop errant interrupts until set up
(0142)  port_init();
_init_devices:
    0112 DFF3      RCALL	_port_init
    0113 9508      RET
(0143)  //all peripherals are now initialized
(0144) }
(0145) 
(0146) /*-----------------------------------------------------------------------
(0147) 延时函数
(0148) 系统时钟:8M
(0149) -----------------------------------------------------------------------*/
(0150) void delay_1us(void)                 //1us延时函数
(0151)   {
(0152)    asm("nop");
_delay_1us:
    0114 0000      NOP
    0115 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0116 D108      RCALL	push_gset2
    0117 01B8      MOVW	R22,R16

⌨️ 快捷键说明

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