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

📄 lcd1602.lst

📁 avr mega16 驱动lcd1602显示屏
💻 LST
字号:
__text_start:
__start:
    0039 E5CF      LDI	R28,0x5F
    003A E0D4      LDI	R29,4
    003B BFCD      OUT	0x3D,R28
    003C BFDE      OUT	0x3E,R29
    003D 51C0      SUBI	R28,0x10
    003E 40D0      SBCI	R29,0
    003F EA0A      LDI	R16,0xAA
    0040 8308      STD	Y+0,R16
    0041 2400      CLR	R0
    0042 E7ED      LDI	R30,0x7D
    0043 E0F0      LDI	R31,0
    0044 E010      LDI	R17,0
    0045 37ED      CPI	R30,0x7D
    0046 07F1      CPC	R31,R17
    0047 F011      BEQ	0x004A
    0048 9201      ST	R0,Z+
    0049 CFFB      RJMP	0x0045
    004A 8300      STD	Z+0,R16
    004B E5E4      LDI	R30,0x54
    004C E0F0      LDI	R31,0
    004D E6A0      LDI	R26,0x60
    004E E0B0      LDI	R27,0
    004F E010      LDI	R17,0
    0050 37E1      CPI	R30,0x71
    0051 07F1      CPC	R31,R17
    0052 F021      BEQ	0x0057
    0053 95C8      LPM
    0054 9631      ADIW	R30,1
    0055 920D      ST	R0,X+
    0056 CFF9      RJMP	0x0050
    0057 940E00B6  CALL	_main
_exit:
    0059 CFFF      RJMP	_exit
FILE: C:\bak\YM200\lcd1602\lcd.c
(0001) #include <iom16v.h>
(0002) #include <macros.h> 
(0003) #define LCD_RS   (1 << 4)
(0004) #define LCD_RW   (1 << 5)
(0005) #define LCD_E    (1 << 7)
(0006) #define set_e()  (PORTD |= LCD_E)
(0007) #define set_rs() (PORTD |= LCD_RS)
(0008) #define set_rw() (PORTD |= LCD_RW)
(0009) #define clr_e()  (PORTD &= ~LCD_E)
(0010) #define clr_rs() (PORTD &= ~LCD_RS)
(0011) #define clr_rw() (PORTD &= ~LCD_RW)
(0012)   
(0013) /*-----------------------------------------------------------
(0014) delay       :短延时函数
(0015) 输入参数 x  :粗略延时,x越大,延时越长
(0016) 输出参数    :无
(0017) ------------------------------------------------------------*/
(0018) void delay(unsigned int dk)
(0019) {
(0020)   while(dk--);
_delay:
  dk                   --> R16
    005A 0118      MOVW	R2,R16
    005B 5001      SUBI	R16,1
    005C 4010      SBCI	R17,0
    005D 2022      TST	R2
    005E F7D9      BNE	0x005A
    005F 2033      TST	R3
    0060 F7C9      BNE	0x005A
    0061 9508      RET
(0021)  }
(0022) 
(0023) /*------------------------------------------------------------
(0024) lcdwait   :液晶延时函数
(0025) 输入参数  :无
(0026) 输出参数  :无
(0027) --------------------------------------------------------------*/
(0028) void lcdwait(void)
(0029) {
(0030)   delay(600);
_lcdwait:
    0062 E508      LDI	R16,0x58
    0063 E012      LDI	R17,2
    0064 DFF5      RCALL	_delay
    0065 9508      RET
(0031)  }
(0032) /*-----------------------------------------------------------
(0033) lcdpulse   :脉冲函数,把数据写入1602液晶
(0034) 输入参数   :无
(0035) 输出参数   :无
(0036) ---------------------------------------------------------------*/
(0037) void lcdpulse(void)
(0038) {
(0039)   set_e();
_lcdpulse:
    0066 9A97      SBI	0x12,7
(0040)   clr_e();
    0067 9897      CBI	0x12,7
    0068 9508      RET
_lcdsend:
  data                 --> R20
    0069 940E0101  CALL	push_gset1
    006B 2F40      MOV	R20,R16
(0041)  }
(0042) 
(0043) /*----------------------------------------------------------------
(0044) lcdsend       :发送一字节数据函数
(0045) 输入参数 data :要发送字节数据
(0046) 输出参数      :无
(0047) ------------------------------------------------------------------*/
(0048) void lcdsend(unsigned char data)
(0049) {
(0050)   lcdwait();
    006C DFF5      RCALL	_lcdwait
(0051)   PORTB=data;
    006D BB48      OUT	0x18,R20
(0052)   lcdpulse();
    006E DFF7      RCALL	_lcdpulse
    006F 940E0104  CALL	pop_gset1
    0071 9508      RET
_wcom:
  com                  --> R20
    0072 940E0101  CALL	push_gset1
    0074 2F40      MOV	R20,R16
(0053)  }
(0054) /*------------------------------------------------------------------
(0055) wcom          :写一字节控制字函数
(0056) 输入参数 com  :要写入控制字
(0057) 输出参数      :无
(0058) -----------------------------------------------------------------*/
(0059) void wcom(unsigned char com)
(0060) {
(0061)   clr_rs();
    0075 9894      CBI	0x12,4
(0062)   clr_rw();
    0076 9895      CBI	0x12,5
(0063)   lcdsend(com);
    0077 2F04      MOV	R16,R20
    0078 DFF0      RCALL	_lcdsend
(0064)   lcdwait();
    0079 DFE8      RCALL	_lcdwait
    007A 940E0104  CALL	pop_gset1
    007C 9508      RET
_wdat:
  dat                  --> R20
    007D 940E0101  CALL	push_gset1
    007F 2F40      MOV	R20,R16
(0065)  }
(0066) 
(0067) /*--------------------------------------------------------------
(0068) wdat          :显示一字节函数
(0069) 输入参数 com  :要显示字符ASCⅡ码
(0070) 输出参数      :无
(0071) ----------------------------------------------------------------*/
(0072) void wdat(unsigned char dat)
(0073) {
(0074)   set_rs();
    0080 9A94      SBI	0x12,4
(0075)   clr_rw();
    0081 9895      CBI	0x12,5
(0076)   lcdsend(dat);
    0082 2F04      MOV	R16,R20
    0083 DFE5      RCALL	_lcdsend
(0077)   lcdwait();
    0084 DFDD      RCALL	_lcdwait
    0085 940E0104  CALL	pop_gset1
    0087 9508      RET
(0078)  }
(0079) /*------------------------------------------------------------------
(0080) LCM1602Reset  :LCM1602复位
(0081) 输入参数      :无
(0082) 输出参数      :无
(0083) ------------------------------------------------------------------*/
(0084) void LCM1602Reset(void)
(0085) {
(0086)   delay(65000);
_LCM1602Reset:
    0088 EE08      LDI	R16,0xE8
    0089 EF1D      LDI	R17,0xFD
    008A DFCF      RCALL	_delay
(0087)   wcom(0x38);
    008B E308      LDI	R16,0x38
    008C DFE5      RCALL	_wcom
(0088)   delay(5000);
    008D E808      LDI	R16,0x88
    008E E113      LDI	R17,0x13
    008F DFCA      RCALL	_delay
(0089)   wcom(0x38);
    0090 E308      LDI	R16,0x38
    0091 DFE0      RCALL	_wcom
(0090)   delay(5000);
    0092 E808      LDI	R16,0x88
    0093 E113      LDI	R17,0x13
    0094 DFC5      RCALL	_delay
(0091)   wcom(0x38);
    0095 E308      LDI	R16,0x38
    0096 DFDB      RCALL	_wcom
(0092)   delay(5000);
    0097 E808      LDI	R16,0x88
    0098 E113      LDI	R17,0x13
    0099 DFC0      RCALL	_delay
(0093)   wcom(0x38);
    009A E308      LDI	R16,0x38
    009B DFD6      RCALL	_wcom
    009C 9508      RET
(0094)  }
(0095) 
(0096) /*------------------------------------------------------------------
(0097) lcdinit       :LCM1602初始化
(0098) 输入参数      :无
(0099) 输出参数      :无
(0100) -------------------------------------------------------------------*/
(0101) void lcdinit(void)
(0102) {
(0103)   wcom(0x01);           //清屏
_lcdinit:
    009D E001      LDI	R16,1
    009E DFD3      RCALL	_wcom
(0104)   wcom(0x3c);           //显示开关控制:8bit,2行显示,5x7
    009F E30C      LDI	R16,0x3C
    00A0 DFD1      RCALL	_wcom
(0105)   wcom(0x0c);           //光标开,闪烁关
    00A1 E00C      LDI	R16,0xC
    00A2 DFCF      RCALL	_wcom
(0106)   wcom(0x06);           //输入方式,增量方式,不移动
    00A3 E006      LDI	R16,6
    00A4 DFCD      RCALL	_wcom
    00A5 9508      RET
_disp_string:
  data                 --> R20
    00A6 940E0101  CALL	push_gset1
    00A8 01A8      MOVW	R20,R16
(0107)  }
(0108) 
(0109) /*-----------------------------------------------------------------
(0110) disp_string   :显示一字符串函数
(0111) 输入参数 data :字符串指针
(0112) 输出参数      :无
(0113) ------------------------------------------------------------------*/
(0114) void disp_string( unsigned char *data )
(0115) {
    00A9 C005      RJMP	0x00AF
(0116)   while(*data!=0) {wdat(*data);data++;}
    00AA 01FA      MOVW	R30,R20
    00AB 8100      LDD	R16,Z+0
    00AC DFD0      RCALL	_wdat
    00AD 5F4F      SUBI	R20,0xFF
    00AE 4F5F      SBCI	R21,0xFF
    00AF 01FA      MOVW	R30,R20
    00B0 8020      LDD	R2,Z+0
    00B1 2022      TST	R2
    00B2 F7B9      BNE	0x00AA
    00B3 940E0104  CALL	pop_gset1
    00B5 9508      RET
(0117)  }
(0118) 
(0119)                                            //设置显示坐标:X 0~39,Y:0~1
(0120) #define setxy(x,y) wcom(((x)|((y)<<6))|0x80) 
(0121) 
(0122) /*--------------------------------------------------------------
(0123) main       :主函数
(0124) 输入参数   :无
(0125) 输出参数   :无
(0126) --------------------------------------------------------------*/
(0127) void main()
(0128) {
(0129)   DDRD=0xff;
_main:
    00B6 EF8F      LDI	R24,0xFF
    00B7 BB81      OUT	0x11,R24
(0130)   DDRB=0xff;
    00B8 BB87      OUT	0x17,R24
(0131)   LCM1602Reset();
    00B9 DFCE      RCALL	_LCM1602Reset
(0132)   lcdinit();
    00BA DFE2      RCALL	_lcdinit
(0133)   setxy(0,0);
    00BB E800      LDI	R16,0x80
    00BC DFB5      RCALL	_wcom
(0134)   disp_string("Easy Learning..");
    00BD E60D      LDI	R16,0x6D
    00BE E010      LDI	R17,0
    00BF DFE6      RCALL	_disp_string
(0135)   setxy(2,1);
    00C0 EC02      LDI	R16,0xC2
    00C1 DFB0      RCALL	_wcom
(0136)   disp_string("Avr Studio! ");
    00C2 E600      LDI	R16,0x60
    00C3 E010      LDI	R17,0
    00C4 DFE1      RCALL	_disp_string
    00C5 C031      RJMP	0x00F7
(0137) 
(0138)   while(1)
(0139)     {
(0140)       wcom(0x08);   //显示关
    00C6 E008      LDI	R16,0x8
    00C7 DFAA      RCALL	_wcom
(0141)       delay(65000);
    00C8 EE08      LDI	R16,0xE8
    00C9 EF1D      LDI	R17,0xFD
    00CA DF8F      RCALL	_delay
(0142)       delay(65000);
    00CB EE08      LDI	R16,0xE8
    00CC EF1D      LDI	R17,0xFD
    00CD DF8C      RCALL	_delay
(0143)       delay(65000);
    00CE EE08      LDI	R16,0xE8
    00CF EF1D      LDI	R17,0xFD
    00D0 DF89      RCALL	_delay
(0144)       delay(65000);
    00D1 EE08      LDI	R16,0xE8
    00D2 EF1D      LDI	R17,0xFD
    00D3 DF86      RCALL	_delay
(0145)       delay(65000);
    00D4 EE08      LDI	R16,0xE8
    00D5 EF1D      LDI	R17,0xFD
    00D6 DF83      RCALL	_delay
(0146)       delay(65000);
    00D7 EE08      LDI	R16,0xE8
    00D8 EF1D      LDI	R17,0xFD
    00D9 DF80      RCALL	_delay
(0147)       delay(65000);
    00DA EE08      LDI	R16,0xE8
    00DB EF1D      LDI	R17,0xFD
    00DC DF7D      RCALL	_delay
(0148)       delay(65000);
    00DD EE08      LDI	R16,0xE8
    00DE EF1D      LDI	R17,0xFD
    00DF DF7A      RCALL	_delay
(0149) 
(0150)       wcom(0x0c);   //显示开
    00E0 E00C      LDI	R16,0xC
    00E1 DF90      RCALL	_wcom
(0151)       delay(65000);
    00E2 EE08      LDI	R16,0xE8
    00E3 EF1D      LDI	R17,0xFD
    00E4 DF75      RCALL	_delay
(0152)       delay(65000);
    00E5 EE08      LDI	R16,0xE8
    00E6 EF1D      LDI	R17,0xFD
    00E7 DF72      RCALL	_delay
(0153)       delay(65000);
    00E8 EE08      LDI	R16,0xE8
    00E9 EF1D      LDI	R17,0xFD
    00EA DF6F      RCALL	_delay
(0154)       delay(65000);
    00EB EE08      LDI	R16,0xE8
    00EC EF1D      LDI	R17,0xFD
    00ED DF6C      RCALL	_delay
(0155)       delay(65000);
    00EE EE08      LDI	R16,0xE8
    00EF EF1D      LDI	R17,0xFD
    00F0 DF69      RCALL	_delay
(0156)       delay(65000);
    00F1 EE08      LDI	R16,0xE8
    00F2 EF1D      LDI	R17,0xFD
    00F3 DF66      RCALL	_delay
(0157)       delay(65000);
FILE: <library>
    00F4 EE08      LDI	R16,0xE8
    00F5 EF1D      LDI	R17,0xFD
    00F6 DF63      RCALL	_delay
    00F7 CFCE      RJMP	0x00C6
    00F8 9508      RET
push_gset5:
    00F9 92FA      ST	R15,-Y
    00FA 92EA      ST	R14,-Y
push_gset4:
    00FB 92DA      ST	R13,-Y
    00FC 92CA      ST	R12,-Y
push_gset3:
    00FD 92BA      ST	R11,-Y
    00FE 92AA      ST	R10,-Y
push_gset2:
    00FF 937A      ST	R23,-Y
    0100 936A      ST	R22,-Y
push_gset1:
    0101 935A      ST	R21,-Y
    0102 934A      ST	R20,-Y
    0103 9508      RET
pop_gset1:
    0104 E0E1      LDI	R30,1
pop:
    0105 9149      LD	R20,Y+
    0106 9159      LD	R21,Y+
    0107 FDE0      SBRC	R30,0
    0108 9508      RET
    0109 9169      LD	R22,Y+
    010A 9179      LD	R23,Y+
    010B FDE1      SBRC	R30,1
    010C 9508      RET
    010D 90A9      LD	R10,Y+
    010E 90B9      LD	R11,Y+
    010F FDE2      SBRC	R30,2
    0110 9508      RET
    0111 90C9      LD	R12,Y+
    0112 90D9      LD	R13,Y+
    0113 FDE3      SBRC	R30,3
    0114 9508      RET
    0115 90E9      LD	R14,Y+
    0116 90F9      LD	R15,Y+
    0117 9508      RET

⌨️ 快捷键说明

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