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

📄 1602.lst

📁 l602的读写
💻 LST
字号:
__start:
__text_start:
      1F E5CF      LDI	R28,0x5F
      20 E0D4      LDI	R29,4
      21 BFCD      OUT	0x3D,R28
      22 BFDE      OUT	0x3E,R29
      23 51C0      SUBI	R28,0x10
      24 40D0      SBCI	R29,0
      25 EA0A      LDI	R16,0xAA
      26 8308      STD	Y+0,R16
      27 2400      CLR	R0
      28 E7E8      LDI	R30,0x78
      29 E0F0      LDI	R31,0
      2A E010      LDI	R17,0
      2B 37E8      CPI	R30,0x78
      2C 07F1      CPC	R31,R17
      2D F011      BEQ	0x0030
      2E 9201      ST	R0,Z+
      2F CFFB      RJMP	0x002B
      30 8300      STD	Z+0,R16
      31 E2E6      LDI	R30,0x26
      32 E0F0      LDI	R31,0
      33 E6A0      LDI	R26,0x60
      34 E0B0      LDI	R27,0
      35 E010      LDI	R17,0
      36 E000      LDI	R16,0
      37 BF0B      OUT	0x3B,R16
      38 33EE      CPI	R30,0x3E
      39 07F1      CPC	R31,R17
      3A F021      BEQ	0x003F
      3B 95C8      LPM
      3C 9631      ADIW	R30,1
      3D 920D      ST	R0,X+
      3E CFF9      RJMP	0x0038
      3F D07C      RCALL	_main
_exit:
      40 CFFF      RJMP	_exit
FILE: D:\我的文档\MYDESI~1\1602\1602.c
(0001) //说明:此程序在LCD1602上显示“Velcome! ”“www.iccavr.com”同时实现左右移动。
(0002) 
(0003) /*********************************
(0004) *     字符LCD1602应用例子   *
(0005) * 实验环境:本站的M16学习板   *
(0006) * 接线方式:RS=PD.3,E=PC.6   *
(0007) *           Db0-Db7=PB0-PB7   *
(0008) * 作    者:tonghe     *
(0009) * 日    期:2007年03月06日   *
(0010) * 版    本:V1.2     *
(0011) * 修改日期:2007年08月11日   *
(0012) * 编 译 器:ICCAVR6.31A    *
(0013) *********************************/
(0014) #include "iom8v.h"
(0015) 
(0016) //宏定义
(0017) #define RS1602 PD3       //RS接在PORTD.3上
(0018) #define E1602 PC6      //E接在PORTC.6上
(0019) #define LCD_DATA PORTB     //8位数据联接在PORTB上
(0020) #define CLR_RS PORTD&=~(1<<RS1602)//RS清0
(0021) #define SET_RS PORTD|=1<<RS1602   //RS置1
(0022) #define CLR_E PORTC&=~(1<<E1602)  //E清0
(0023) #define SET_E PORTC|=1<<E1602   //E置1
(0024) 
(0025) #define uchar unsigned char
(0026) #define uint unsigned int
(0027) 
(0028) //配置端口
(0029) void port_init(void)
(0030)  {
(0031) // PORTA = 0xFF;
(0032)  //DDRA  = 0x00;
(0033)  DDRB  = 0xFF;
_port_init:
      41 EF8F      LDI	R24,0xFF
      42 BB87      OUT	0x17,R24
(0034)  PORTB = 0xFF;
      43 BB88      OUT	0x18,R24
(0035)  DDRD  = 0xFF;
      44 BB81      OUT	0x11,R24
(0036)  PORTD = 0x00;
      45 2422      CLR	R2
      46 BA22      OUT	0x12,R2
(0037)  
(0038)  DDRC  = 0xFF;      //定义C口为输出
      47 BB84      OUT	0x14,R24
(0039)  PORTC = 0x00;           //开背光:接在PC7
      48 BA25      OUT	0x15,R2
      49 9508      RET
_delay_ms:
  a                    --> R20
  i                    --> R16
      4A 934A      ST	R20,-Y
      4B 935A      ST	R21,-Y
(0040)    
(0041)  }
(0042) 
(0043) //延时函数:入口i,单位mS,最大65536mS
(0044) void delay_ms(uint i)
(0045)     {
(0046)     uint a;
(0047)     for(;i;i--)
      4C C00A      RJMP	0x0057
(0048)   {
(0049)   for(a=150;a!=0;a--)      //针对时钟频率为1M
      4D E946      LDI	R20,0x96
      4E E050      LDI	R21,0
      4F C002      RJMP	0x0052
      50 5041      SUBI	R20,1
      51 4050      SBCI	R21,0
      52 3040      CPI	R20,0
      53 0745      CPC	R20,R21
      54 F7D9      BNE	0x0050
      55 5001      SUBI	R16,1
      56 4010      SBCI	R17,0
      57 3000      CPI	R16,0
      58 0701      CPC	R16,R17
      59 F799      BNE	0x004D
      5A 9159      LD	R21,Y+
      5B 9149      LD	R20,Y+
      5C 9508      RET
_lcd_da:
  data                 --> R10
      5D 92AA      ST	R10,-Y
      5E 2EA0      MOV	R10,R16
(0050)    {;}
(0051)   }
(0052)     }
(0053) 
(0054) //写数据到LCD的函数
(0055) void lcd_da(uchar data)
(0056)  {
(0057)  SET_RS;       //RS置高,写数据
      5F 9A93      SBI	0x12,3
(0058)  delay_ms(1);
      60 E001      LDI	R16,1
      61 E010      LDI	R17,0
      62 DFE7      RCALL	_delay_ms
(0059)  SET_E;
      63 9AAE      SBI	0x15,6
(0060)  LCD_DATA = data;
      64 BAA8      OUT	0x18,R10
(0061)  delay_ms(1);
      65 E001      LDI	R16,1
      66 E010      LDI	R17,0
      67 DFE2      RCALL	_delay_ms
(0062)  CLR_E;
      68 98AE      CBI	0x15,6
(0063)  delay_ms(1);    //延时5MS
      69 E001      LDI	R16,1
      6A E010      LDI	R17,0
      6B DFDE      RCALL	_delay_ms
      6C 90A9      LD	R10,Y+
      6D 9508      RET
_lcd_comm:
  data                 --> R10
      6E 92AA      ST	R10,-Y
      6F 2EA0      MOV	R10,R16
(0064)  } 
(0065) 
(0066) //写指令到LCD的函数
(0067) void lcd_comm(uchar data)
(0068)  {
(0069)  CLR_RS;       //RS清0,写指令
      70 9893      CBI	0x12,3
(0070)  delay_ms(1);    //延时5MS
      71 E001      LDI	R16,1
      72 E010      LDI	R17,0
      73 DFD6      RCALL	_delay_ms
(0071)  SET_E;
      74 9AAE      SBI	0x15,6
(0072)  LCD_DATA = data;
      75 BAA8      OUT	0x18,R10
(0073)  delay_ms(1);
      76 E001      LDI	R16,1
      77 E010      LDI	R17,0
      78 DFD1      RCALL	_delay_ms
(0074)  CLR_E;
      79 98AE      CBI	0x15,6
(0075)  delay_ms(1);    //延时5MS
      7A E001      LDI	R16,1
      7B E010      LDI	R17,0
      7C DFCD      RCALL	_delay_ms
      7D 90A9      LD	R10,Y+
      7E 9508      RET
_lcd:
  s                    --> R20
      7F 934A      ST	R20,-Y
      80 935A      ST	R21,-Y
      81 01A8      MOVW	R20,R16
(0076)  } 
(0077) 
(0078) //显示字符串函数:入口:待显示的字符串
(0079) void lcd(char *s)
(0080)     {
      82 C005      RJMP	0x0088
(0081)  while(*s)
(0082)      {
(0083)   lcd_da(*s);
      83 01FA      MOVW	R30,R20
      84 8100      LDD	R16,Z+0
      85 DFD7      RCALL	_lcd_da
(0084)   s++;
      86 5F4F      SUBI	R20,0xFF
      87 4F5F      SBCI	R21,0xFF
      88 01FA      MOVW	R30,R20
      89 8020      LDD	R2,Z+0
      8A 2022      TST	R2
      8B F7B9      BNE	0x0083
      8C 9159      LD	R21,Y+
      8D 9149      LD	R20,Y+
      8E 9508      RET
(0085)   }
(0086)  }
(0087)  
(0088) //清屏指令函数
(0089) void cls(void)
(0090)     {
(0091)  lcd_comm(0x01);
_cls:
      8F E001      LDI	R16,1
      90 DFDD      RCALL	_lcd_comm
(0092)  delay_ms(5);
      91 E005      LDI	R16,5
      92 E010      LDI	R17,0
      93 DFB6      RCALL	_delay_ms
      94 9508      RET
_locate:
  x                    --> R20
  b                    --> R22
  a                    --> R10
      95 D065      RCALL	push_xgsetF00C
      96 2F62      MOV	R22,R18
      97 2EA0      MOV	R10,R16
(0093)  }
(0094) 
(0095) //定位指令函数
(0096) void locate(uchar a,uchar b)
(0097)     {
(0098)  uchar x;
(0099)  if(a==1)
      98 2D8A      MOV	R24,R10
      99 3081      CPI	R24,1
      9A F419      BNE	0x009E
(0100)      x=0x80+b-1;
      9B 2F46      MOV	R20,R22
      9C 5840      SUBI	R20,0x80
      9D 5041      SUBI	R20,1
(0101)  if(a==2)
      9E 2D8A      MOV	R24,R10
      9F 3082      CPI	R24,2
      A0 F419      BNE	0x00A4
(0102)      x=0xC0+b-1;
      A1 2F46      MOV	R20,R22
      A2 5440      SUBI	R20,0x40
      A3 5041      SUBI	R20,1
(0103)  lcd_comm(x);
      A4 2F04      MOV	R16,R20
      A5 DFC8      RCALL	_lcd_comm
(0104)  delay_ms(1);
      A6 E001      LDI	R16,1
      A7 E010      LDI	R17,0
      A8 DFA1      RCALL	_delay_ms
      A9 C058      RJMP	pop_xgsetF00C
(0105)  }
(0106) 
(0107) //LCD初始化函数
(0108) void lcd_init(void)
(0109)  {
(0110)  lcd_comm(0x38);    //写指令:8位数据、2行显示、5*8点阵
_lcd_init:
      AA E308      LDI	R16,0x38
      AB DFC2      RCALL	_lcd_comm
(0111)  delay_ms(5);
      AC E005      LDI	R16,5
      AD E010      LDI	R17,0
      AE DF9B      RCALL	_delay_ms
(0112)  lcd_comm(0x06);    //写指令:自左向右显示
      AF E006      LDI	R16,6
      B0 DFBD      RCALL	_lcd_comm
(0113)  delay_ms(5);
      B1 E005      LDI	R16,5
      B2 E010      LDI	R17,0
      B3 DF96      RCALL	_delay_ms
(0114)  lcd_comm(0x0C);    //写指令:显示开
      B4 E00C      LDI	R16,0xC
      B5 DFB8      RCALL	_lcd_comm
(0115)  delay_ms(5);
      B6 E005      LDI	R16,5
      B7 E010      LDI	R17,0
      B8 DF91      RCALL	_delay_ms
(0116) // lcd_comm(0x80);    //写指令:第1行地址
(0117) // delay_ms(5);  
(0118)  lcd_comm(0x01);    //写指令:CLS
      B9 E001      LDI	R16,1
      BA DFB3      RCALL	_lcd_comm
      BB 9508      RET
(0119)  }
(0120)  
(0121) //主函数
(0122) void main(void)
(0123)     {
(0124)  uchar i;
(0125) 
(0126)  port_init();    //端口初始化
_main:
  i                    --> R20
      BC DF84      RCALL	_port_init
(0127)  delay_ms(50);    //延时500ms
      BD E302      LDI	R16,0x32
      BE E010      LDI	R17,0
      BF DF8A      RCALL	_delay_ms
(0128)  lcd_init();     //LCD初始化
      C0 DFE9      RCALL	_lcd_init
(0129)  
(0130)  delay_ms(50);
      C1 E302      LDI	R16,0x32
      C2 E010      LDI	R17,0
      C3 DF86      RCALL	_delay_ms
(0131)  locate(1,5);     //第一行显示位置
      C4 E025      LDI	R18,5
      C5 E001      LDI	R16,1
      C6 DFCE      RCALL	_locate
(0132)  lcd("Velcome!");   //第一行显示内容
      C7 E60F      LDI	R16,0x6F
      C8 E010      LDI	R17,0
      C9 DFB5      RCALL	_lcd
(0133)  locate(2,2);    //第二行显示位置
      CA E022      LDI	R18,2
      CB E002      LDI	R16,2
      CC DFC8      RCALL	_locate
(0134)  lcd("www.iccavr.com");  //第二行显示内容
      CD E600      LDI	R16,0x60
      CE E010      LDI	R17,0
      CF DFAF      RCALL	_lcd
(0135) 
(0136)  for(i=5;i;i--)    //先右移5位
      D0 E045      LDI	R20,5
      D1 C006      RJMP	0x00D8
(0137)   {
(0138)   lcd_comm(0x1C);
      D2 E10C      LDI	R16,0x1C
      D3 DF9A      RCALL	_lcd_comm
(0139)   delay_ms(100);
      D4 E604      LDI	R16,0x64
      D5 E010      LDI	R17,0
      D6 DF73      RCALL	_delay_ms
      D7 954A      DEC	R20
      D8 2344      TST	R20
      D9 F7C1      BNE	0x00D2
      DA C01E      RJMP	0x00F9
(0140)   }
(0141)     
(0142)  while (1)
(0143)         {
(0144)   for(i=10;i;i--)   //左移10位
      DB E04A      LDI	R20,0xA
      DC C00B      RJMP	0x00E8
(0145)    {
(0146)    lcd_comm(0x18);
      DD E108      LDI	R16,0x18
      DE DF8F      RCALL	_lcd_comm
(0147)    if(i==6)delay_ms(2000);  //移到中间暂停2秒
      DF 3046      CPI	R20,6
      E0 F419      BNE	0x00E4
      E1 ED00      LDI	R16,0xD0
      E2 E017      LDI	R17,7
      E3 DF66      RCALL	_delay_ms
(0148)    delay_ms(400);
      E4 E900      LDI	R16,0x90
      E5 E011      LDI	R17,1
      E6 DF63      RCALL	_delay_ms
      E7 954A      DEC	R20
      E8 2344      TST	R20
      E9 F799      BNE	0x00DD
(0149)    }
(0150)   for(i=10;i;i--)      //右移10位
      EA E04A      LDI	R20,0xA
      EB C00B      RJMP	0x00F7
(0151)    {
(0152)    lcd_comm(0x1C);
      EC E10C      LDI	R16,0x1C
      ED DF80      RCALL	_lcd_comm
(0153)    if(i==6)delay_ms(2000);
      EE 3046      CPI	R20,6
      EF F419      BNE	0x00F3
      F0 ED00      LDI	R16,0xD0
      F1 E017      LDI	R17,7
      F2 DF57      RCALL	_delay_ms
(0154)    delay_ms(400);
FILE: <library>
      F3 E900      LDI	R16,0x90
      F4 E011      LDI	R17,1
      F5 DF54      RCALL	_delay_ms
      F6 954A      DEC	R20
      F7 2344      TST	R20
      F8 F799      BNE	0x00EC
      F9 CFE1      RJMP	0x00DB
      FA 9508      RET
push_xgsetF00C:
      FB 937A      ST	R23,-Y
      FC 936A      ST	R22,-Y
      FD 935A      ST	R21,-Y
      FE 934A      ST	R20,-Y
      FF 92BA      ST	R11,-Y
     100 92AA      ST	R10,-Y
     101 9508      RET
pop_xgsetF00C:
     102 90A9      LD	R10,Y+
     103 90B9      LD	R11,Y+
     104 9149      LD	R20,Y+
     105 9159      LD	R21,Y+
     106 9169      LD	R22,Y+
     107 9179      LD	R23,Y+
     108 9508      RET

⌨️ 快捷键说明

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