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

📄 1602.lst

📁 用AVR单片机Mega16控制的1602液晶屏显示
💻 LST
字号:
__start:
__text_start:
    0041 E5CF      LDI	R28,0x5F
    0042 E0D4      LDI	R29,4
    0043 BFCD      OUT	0x3D,R28
    0044 BFDE      OUT	0x3E,R29
    0045 51C0      SUBI	R28,0x10
    0046 40D0      SBCI	R29,0
    0047 EA0A      LDI	R16,0xAA
    0048 8308      STD	Y+0,R16
    0049 2400      CLR	R0
    004A E8ED      LDI	R30,0x8D
    004B E0F0      LDI	R31,0
    004C E010      LDI	R17,0
    004D 38ED      CPI	R30,0x8D
    004E 07F1      CPC	R31,R17
    004F F011      BEQ	0x0052
    0050 9201      ST	R0,Z+
    0051 CFFB      RJMP	0x004D
    0052 8300      STD	Z+0,R16
    0053 E5E4      LDI	R30,0x54
    0054 E0F0      LDI	R31,0
    0055 E6A0      LDI	R26,0x60
    0056 E0B0      LDI	R27,0
    0057 E010      LDI	R17,0
    0058 38E1      CPI	R30,0x81
    0059 07F1      CPC	R31,R17
    005A F021      BEQ	0x005F
    005B 95C8      LPM
    005C 9631      ADIW	R30,1
    005D 920D      ST	R0,X+
    005E CFF9      RJMP	0x0058
    005F 940E00EA  CALL	_main
_exit:
    0061 CFFF      RJMP	_exit
FILE: E:\单片机\单片机程序\AVR程序\1602\1602.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include <stdio.h>			//标准输入输出头文件
(0004) #define uchar unsigned char
(0005) #define uint  unsigned int
(0006) 
(0007) //uchar DATA[16] = {'W','e','l','c','o','m','e',' ','t','o',' ','C','U','M','T','!'};
(0008) uchar DATA1[] = {"   Welcome to   "};
(0009) uchar DATA2[] = {"           CUMT!           "};
(0010) /********** LCD1602接线引脚定义 ***********/
(0011) //E  -- PD4
(0012) //RW -- PD5
(0013) //RS -- PD6
(0014) //DB0~7  --  PC0~7
(0015) 
(0016) /****************** 延时函数 *****************/
(0017) void delay(uint t)
(0018) {
(0019)   while(t--);
_delay:
  t                    --> R16
    0062 0118      MOVW	R2,R16
    0063 5001      SUBI	R16,1
    0064 4010      SBCI	R17,0
    0065 2022      TST	R2
    0066 F7D9      BNE	0x0062
    0067 2033      TST	R3
    0068 F7C9      BNE	0x0062
    0069 9508      RET
_delay_ms:
  i                    --> R20
  j                    --> R22
  t                    --> R16
    006A 940E013F  CALL	push_gset2
(0020) }
(0021) 
(0022) void delay_ms(uint t)
(0023) {
(0024)  uint i,j;
(0025)  for(i=t;i>0;i--)
    006C 01A8      MOVW	R20,R16
    006D C00B      RJMP	0x0079
(0026)     for(j=0;j<1140;j++);
    006E 2766      CLR	R22
    006F 2777      CLR	R23
    0070 C002      RJMP	0x0073
    0071 5F6F      SUBI	R22,0xFF
    0072 4F7F      SBCI	R23,0xFF
    0073 3764      CPI	R22,0x74
    0074 E0E4      LDI	R30,4
    0075 077E      CPC	R23,R30
    0076 F3D0      BCS	0x0071
    0077 5041      SUBI	R20,1
    0078 4050      SBCI	R21,0
    0079 3040      CPI	R20,0
    007A 0745      CPC	R20,R21
    007B F791      BNE	0x006E
    007C 940E0136  CALL	pop_gset2
    007E 9508      RET
(0027) }
(0028) 
(0029) /****************** 端口初始化 *****************/
(0030) void port_init(void)
(0031) {
(0032)  PORTA = 0x00;
_port_init:
    007F 2422      CLR	R2
    0080 BA2B      OUT	0x1B,R2
(0033)  DDRA  = 0xFF;
    0081 EF8F      LDI	R24,0xFF
    0082 BB8A      OUT	0x1A,R24
(0034)  PORTB = 0x00;
    0083 BA28      OUT	0x18,R2
(0035)  DDRB  = 0x00;
    0084 BA27      OUT	0x17,R2
(0036)  PORTC = 0x00;
    0085 BA25      OUT	0x15,R2
(0037)  DDRC  = 0xFF;
    0086 BB84      OUT	0x14,R24
(0038)  PORTD = 0x00;
    0087 BA22      OUT	0x12,R2
(0039)  DDRD  = 0xFF;
    0088 BB81      OUT	0x11,R24
    0089 9508      RET
(0040) }
(0041) 
(0042) /****************** mega16 初始化 *****************/
(0043) void init_devices(void)
(0044) {
(0045)  CLI();
_init_devices:
    008A 94F8      BCLR	7
(0046)  port_init();
    008B DFF3      RCALL	_port_init
(0047)  MCUCR = 0x00;
    008C 2422      CLR	R2
    008D BE25      OUT	0x35,R2
(0048)  GICR  = 0x00;
    008E BE2B      OUT	0x3B,R2
(0049)  TIMSK = 0x00;
    008F BE29      OUT	0x39,R2
(0050)  SEI();
    0090 9478      BSET	7
    0091 9508      RET
(0051) }
(0052) 
(0053) /****************** 检查忙信号 *****************/
(0054) void lcd_busy()
(0055) {
(0056)  DDRC = 0X00;  		   //PC 口改为输入
_lcd_busy:
    0092 2422      CLR	R2
    0093 BA24      OUT	0x14,R2
(0057)  PORTD = 0X20;
    0094 E280      LDI	R24,0x20
    0095 BB82      OUT	0x12,R24
(0058)  delay(10);
    0096 E00A      LDI	R16,0xA
    0097 E010      LDI	R17,0
    0098 DFC9      RCALL	_delay
(0059)  PORTD = 0X30;
    0099 E380      LDI	R24,0x30
    009A BB82      OUT	0x12,R24
(0060)  while(PINC & 0X80);  //lcd 忙,则在此循环
    009B 999F      SBIC	0x13,7
    009C CFFE      RJMP	0x009B
(0061)  PORTD = 0X20;
    009D E280      LDI	R24,0x20
    009E BB82      OUT	0x12,R24
(0062)  DDRC = 0XFF;  		   //PC 口改为输出
    009F EF8F      LDI	R24,0xFF
    00A0 BB84      OUT	0x14,R24
    00A1 9508      RET
_lcd_cmd:
  cmd                  --> R20
    00A2 940E0141  CALL	push_gset1
    00A4 2F40      MOV	R20,R16
(0063) }
(0064) 
(0065) /****************** 写命令函数 *****************/
(0066) void lcd_cmd(uchar cmd)
(0067) {
(0068)  lcd_busy();
    00A5 DFEC      RCALL	_lcd_busy
(0069)  PORTD = 0X00;
    00A6 2422      CLR	R2
    00A7 BA22      OUT	0x12,R2
(0070)  delay(1);
    00A8 E001      LDI	R16,1
    00A9 E010      LDI	R17,0
    00AA DFB7      RCALL	_delay
(0071)  PORTC = cmd; 	   	   //PC 口输出命令
    00AB BB45      OUT	0x15,R20
(0072)  delay(1);
    00AC E001      LDI	R16,1
    00AD E010      LDI	R17,0
    00AE DFB3      RCALL	_delay
(0073)  PORTD = 0X10;
    00AF E180      LDI	R24,0x10
    00B0 BB82      OUT	0x12,R24
(0074)  delay(1);	  		   //延时
    00B1 E001      LDI	R16,1
    00B2 E010      LDI	R17,0
    00B3 DFAE      RCALL	_delay
(0075)  PORTD = 0X00;
    00B4 2422      CLR	R2
    00B5 BA22      OUT	0x12,R2
    00B6 940E0144  CALL	pop_gset1
    00B8 9508      RET
_lcd_data:
  data                 --> R20
    00B9 940E0141  CALL	push_gset1
    00BB 2F40      MOV	R20,R16
(0076) }
(0077) 
(0078) /****************** 写数据函数 *****************/
(0079) void lcd_data(uchar data)
(0080) {
(0081)  lcd_busy();
    00BC DFD5      RCALL	_lcd_busy
(0082)  PORTD = 0X40;
    00BD E480      LDI	R24,0x40
    00BE BB82      OUT	0x12,R24
(0083)  delay(1);
    00BF E001      LDI	R16,1
    00C0 E010      LDI	R17,0
    00C1 DFA0      RCALL	_delay
(0084)  PORTC = data;		//写要显示的字
    00C2 BB45      OUT	0x15,R20
(0085)  delay(1);
    00C3 E001      LDI	R16,1
    00C4 E010      LDI	R17,0
    00C5 DF9C      RCALL	_delay
(0086)  PORTD = 0X50;
    00C6 E580      LDI	R24,0x50
    00C7 BB82      OUT	0x12,R24
(0087)  delay(1);
    00C8 E001      LDI	R16,1
    00C9 E010      LDI	R17,0
    00CA DF97      RCALL	_delay
(0088)  PORTD = 0X40;
    00CB E480      LDI	R24,0x40
    00CC BB82      OUT	0x12,R24
    00CD 940E0144  CALL	pop_gset1
    00CF 9508      RET
_lcd_DAT:
  DAT                  --> Y+4
  y                    --> R22
  x                    --> R20
    00D0 940E013F  CALL	push_gset2
    00D2 2F62      MOV	R22,R18
    00D3 2F40      MOV	R20,R16
(0089) }
(0090) 
(0091) /****************** 显示函数 *****************/
(0092) void lcd_DAT(uchar x,uchar y,uchar DAT)
(0093) {
(0094)  if(y) x += 0x40;
    00D4 2366      TST	R22
    00D5 F009      BEQ	0x00D7
    00D6 5C40      SUBI	R20,0xC0
(0095)  x |= 0x80;
    00D7 6840      ORI	R20,0x80
(0096)  lcd_cmd(x);	   //写要显示的地址
    00D8 2F04      MOV	R16,R20
    00D9 DFC8      RCALL	_lcd_cmd
(0097)  lcd_data(DAT);	   //写显示的内容
    00DA 810C      LDD	R16,Y+4
    00DB DFDD      RCALL	_lcd_data
    00DC 940E0136  CALL	pop_gset2
    00DE 9508      RET
(0098) }
(0099) 
(0100) /****************** lcd 初始化 *****************/
(0101) void lcd_init()
(0102) {
(0103)  lcd_cmd(0x38);
_lcd_init:
    00DF E308      LDI	R16,0x38
    00E0 DFC1      RCALL	_lcd_cmd
(0104)  lcd_cmd(0x08);
    00E1 E008      LDI	R16,0x8
    00E2 DFBF      RCALL	_lcd_cmd
(0105)  lcd_cmd(0x01);
    00E3 E001      LDI	R16,1
    00E4 DFBD      RCALL	_lcd_cmd
(0106)  lcd_cmd(0x06);
    00E5 E006      LDI	R16,6
    00E6 DFBB      RCALL	_lcd_cmd
(0107)  lcd_cmd(0x0c);
    00E7 E00C      LDI	R16,0xC
    00E8 DFB9      RCALL	_lcd_cmd
    00E9 9508      RET
_main:
  p                    --> R20
  m                    --> R22
  i                    --> R10
    00EA 9721      SBIW	R28,1
(0108) }
(0109) 
(0110) /****************** 主函数 *****************/
(0111) void main(void)
(0112) {
(0113)  uchar i,p=1;
    00EB E041      LDI	R20,1
(0114)  char m = 11;
    00EC E06B      LDI	R22,0xB
(0115)  init_devices();
    00ED DF9C      RCALL	_init_devices
(0116)  delay_ms(100);
    00EE E604      LDI	R16,0x64
    00EF E010      LDI	R17,0
    00F0 DF79      RCALL	_delay_ms
(0117)  lcd_init();
    00F1 DFED      RCALL	_lcd_init
(0118)  
(0119)  /*lcd_DAT(0,0,'G');
(0120)  lcd_DAT(1,0,'O');
(0121)  lcd_DAT(2,0,'O');
(0122)  lcd_DAT(3,0,'D');
(0123)  lcd_DAT(5,1,'B');
(0124)  lcd_DAT(6,1,'Y');
(0125)  lcd_DAT(7,1,'E');*/
(0126)  lcd_cmd(0x80);
    00F2 E800      LDI	R16,0x80
    00F3 DFAE      RCALL	_lcd_cmd
(0127)  for(i=0;DATA1[i] != '\0';i++)
    00F4 24AA      CLR	R10
    00F5 C00C      RJMP	0x0102
(0128)   {
(0129)    lcd_DAT(i,0,DATA1[i]);
    00F6 E680      LDI	R24,0x60
    00F7 E090      LDI	R25,0
    00F8 2DEA      MOV	R30,R10
    00F9 27FF      CLR	R31
    00FA 0FE8      ADD	R30,R24
    00FB 1FF9      ADC	R31,R25
    00FC 8020      LDD	R2,Z+0
    00FD 8228      STD	Y+0,R2
    00FE 2722      CLR	R18
    00FF 2D0A      MOV	R16,R10
    0100 DFCF      RCALL	_lcd_DAT
    0101 94A3      INC	R10
    0102 E680      LDI	R24,0x60
    0103 E090      LDI	R25,0
    0104 2DEA      MOV	R30,R10
    0105 27FF      CLR	R31
    0106 0FE8      ADD	R30,R24
    0107 1FF9      ADC	R31,R25
    0108 8020      LDD	R2,Z+0
    0109 2022      TST	R2
    010A F759      BNE	0x00F6
    010B C027      RJMP	0x0133
(0130)   }
(0131)  while(1)
(0132)  {  
(0133)   for(i=0;i<16;i++)
    010C 24AA      CLR	R10
    010D C010      RJMP	0x011E
(0134)   {
(0135)    lcd_DAT(i,1,DATA2[i+m]);
    010E 2E26      MOV	R2,R22
    010F 2433      CLR	R3
    0110 2DEA      MOV	R30,R10
    0111 27FF      CLR	R31
    0112 0DE2      ADD	R30,R2
    0113 1DF3      ADC	R31,R3
    0114 E781      LDI	R24,0x71
    0115 E090      LDI	R25,0
    0116 0FE8      ADD	R30,R24
    0117 1FF9      ADC	R31,R25
    0118 8020      LDD	R2,Z+0
    0119 8228      STD	Y+0,R2
    011A E021      LDI	R18,1
    011B 2D0A      MOV	R16,R10
    011C DFB3      RCALL	_lcd_DAT
    011D 94A3      INC	R10
    011E 2D8A      MOV	R24,R10
    011F 3180      CPI	R24,0x10
    0120 F368      BCS	0x010E
(0136)   }
(0137)   delay_ms(700);		   	  //滚动屏
    0121 EB0C      LDI	R16,0xBC
    0122 E012      LDI	R17,2
    0123 DF46      RCALL	_delay_ms
(0138)   if(p == 1) m --;
    0124 3041      CPI	R20,1
    0125 F411      BNE	0x0128
    0126 956A      DEC	R22
    0127 C003      RJMP	0x012B
(0139)   else if(p == 0) m++;
    0128 2344      TST	R20
    0129 F409      BNE	0x012B
    012A 9563      INC	R22
(0140)   if(m >= 11) p = 1;
    012B 306B      CPI	R22,0xB
    012C F010      BCS	0x012F
    012D E041      LDI	R20,1
    012E C004      RJMP	0x0133
(0141)   else if(m <= 0) p = 0;
FILE: <library>
    012F 2422      CLR	R2
    0130 1626      CP	R2,R22
    0131 F008      BCS	0x0133
    0132 2744      CLR	R20
    0133 CFD8      RJMP	0x010C
    0134 9621      ADIW	R28,1
    0135 9508      RET
pop_gset2:
    0136 E0E2      LDI	R30,2
    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 + -