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

📄 1602b_lcd_prj.lst

📁 本实验以常见的1602B字符型LCD模块为例
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002F E5CF      LDI	R28,0x5F
    0030 E0D4      LDI	R29,4
    0031 BFCD      OUT	0x3D,R28
    0032 BFDE      OUT	0x3E,R29
    0033 51C0      SUBI	R28,0x10
    0034 40D0      SBCI	R29,0
    0035 EA0A      LDI	R16,0xAA
    0036 8308      STD	Y+0,R16
    0037 2400      CLR	R0
    0038 E9E7      LDI	R30,0x97
    0039 E0F0      LDI	R31,0
    003A E010      LDI	R17,0
    003B 39E7      CPI	R30,0x97
    003C 07F1      CPC	R31,R17
    003D F011      BEQ	0x0040
    003E 9201      ST	R0,Z+
    003F CFFB      RJMP	0x003B
    0040 8300      STD	Z+0,R16
    0041 E2E6      LDI	R30,0x26
    0042 E0F0      LDI	R31,0
    0043 E6A0      LDI	R26,0x60
    0044 E0B0      LDI	R27,0
    0045 E010      LDI	R17,0
    0046 35ED      CPI	R30,0x5D
    0047 07F1      CPC	R31,R17
    0048 F021      BEQ	0x004D
    0049 95C8      LPM
    004A 9631      ADIW	R30,1
    004B 920D      ST	R0,X+
    004C CFF9      RJMP	0x0046
    004D D0AE      RCALL	_main
_exit:
    004E CFFF      RJMP	_exit
FILE: D:\test6\1602B_LCD.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004) 
(0005) /**********************************************************
(0006) 光标命令
(0007) LCD_write_char(0x0e,0);    //光标开
(0008) LCD_write_char(0x0d,0);    //光标所在字符闪烁  
(0009) LCD_write_char(0x0c,0);    //光标关  
(0010) **********************************************************/
(0011) /**********************************************************
(0012) TC1602B LCD DISPLAY
(0013) 建立时间:2003年11月9号
(0014) 修改日期:2003年11月14号
(0015) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0016)                    入命令
(0017) LCD第一行显示寄存器地址:0X80-0X8F
(0018) LCD第二行显示寄存器地址:0XC0-0XCF
(0019) **********************************************************/
(0020) void LCD_init(void)
(0021)   {
(0022)     delay_nms(15);
_LCD_init:
    004F E00F      LDI	R16,0xF
    0050 E010      LDI	R17,0
    0051 D0FD      RCALL	_delay_nms
(0023)    
(0024)     LCD_write_char(0x28,0);      //4bit test
    0052 2722      CLR	R18
    0053 2733      CLR	R19
    0054 E208      LDI	R16,0x28
    0055 E010      LDI	R17,0
    0056 D016      RCALL	_LCD_write_char
(0025)     LCD_write_char(0x0c,0);      //显示开
    0057 2722      CLR	R18
    0058 2733      CLR	R19
    0059 E00C      LDI	R16,0xC
    005A E010      LDI	R17,0
    005B D011      RCALL	_LCD_write_char
(0026)     LCD_write_char(0x01,0);      //显示清屏
    005C 2722      CLR	R18
    005D 2733      CLR	R19
    005E E001      LDI	R16,1
    005F E010      LDI	R17,0
    0060 D00C      RCALL	_LCD_write_char
(0027)     LCD_write_char(0x06,0);      //显示光标移动设置
    0061 2722      CLR	R18
    0062 2733      CLR	R19
    0063 E006      LDI	R16,6
    0064 E010      LDI	R17,0
    0065 D007      RCALL	_LCD_write_char
    0066 9508      RET
(0028)   }
(0029) 
(0030) void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
(0031)   {
(0032)     LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
    0067 9AAD      SBI	0x15,5
(0033)     delay_nus(1);
    0068 E001      LDI	R16,1
    0069 E010      LDI	R17,0
    006A D0CD      RCALL	_delay_nus
(0034)     LCD_EN_PORT &= ~LCD_EN;
    006B 98AD      CBI	0x15,5
    006C 9508      RET
_LCD_write_char:
  data_temp            --> R22
  command_temp         --> R20
  data                 --> R12
  command              --> R10
    006D D0F6      RCALL	push_gset4
    006E 0169      MOVW	R12,R18
    006F 0158      MOVW	R10,R16
(0035)   }
(0036) 
(0037) /*-----------------------------------------------------------------------
(0038) LCD_write_char    : 英文字符串显示函数
(0039) 
(0040) 输入参数:*s      :英文字符串指针;
(0041)           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0042)                     LCD第一行显示寄存器地址:0X80-0X8F
(0043)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0044) 
(0045) 编写日期          :2003-11-19 
(0046) 最后修改日期      :2004-8-19 		
(0047) -----------------------------------------------------------------------*/
(0048) void LCD_write_char(unsigned command,unsigned data)
(0049)   {
(0050)     unsigned command_temp,data_temp;        
(0051)    
(0052)     command_temp = command;
    0070 01A5      MOVW	R20,R10
(0053)     data_temp = data;
    0071 01B6      MOVW	R22,R12
(0054)    
(0055)     LCD_wait_Ready();
    0072 D04E      RCALL	_LCD_wait_Ready
(0056)    
(0057)     LCD_RW_PORT &= ~LCD_RW;                 //RW=0
    0073 9893      CBI	0x12,3
(0058)    
(0059)     if (command == 0)
    0074 3040      CPI	R20,0
    0075 0745      CPC	R20,R21
    0076 F469      BNE	0x0084
(0060)       {
(0061)    	 LCD_RS_PORT |= LCD_RS;             //RS=1 
    0077 9AAC      SBI	0x15,4
(0062)    	 LCD_DATA_PORT &= 0X0F;
    0078 B382      IN	R24,0x12
    0079 708F      ANDI	R24,0xF
    007A BB82      OUT	0x12,R24
(0063) 	 LCD_DATA_PORT |= data_temp&0xf0;   //send high 4bit
    007B 01CB      MOVW	R24,R22
    007C 7F80      ANDI	R24,0xF0
    007D 7090      ANDI	R25,0
    007E B222      IN	R2,0x12
    007F 2433      CLR	R3
    0080 2A28      OR	R2,R24
    0081 2A39      OR	R3,R25
    0082 BA22      OUT	0x12,R2
(0064)       }
    0083 C00C      RJMP	0x0090
(0065)     else 
(0066)       {
(0067) 	 LCD_RS_PORT &= ~LCD_RS;            //RS=0
    0084 98AC      CBI	0x15,4
(0068) 	 LCD_DATA_PORT &= 0X0F;
    0085 B382      IN	R24,0x12
    0086 708F      ANDI	R24,0xF
    0087 BB82      OUT	0x12,R24
(0069)          LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
    0088 01CA      MOVW	R24,R20
    0089 7F80      ANDI	R24,0xF0
    008A 7090      ANDI	R25,0
    008B B222      IN	R2,0x12
    008C 2433      CLR	R3
    008D 2A28      OR	R2,R24
    008E 2A39      OR	R3,R25
    008F BA22      OUT	0x12,R2
(0070)       }
(0071)     LCD_en_write();
    0090 DFD6      RCALL	_LCD_en_write
(0072)    
(0073)     command_temp=command_temp << 4;         //send low 4bit
    0091 0F44      LSL	R20
    0092 1F55      ROL	R21
    0093 0F44      LSL	R20
    0094 1F55      ROL	R21
    0095 0F44      LSL	R20
    0096 1F55      ROL	R21
    0097 0F44      LSL	R20
    0098 1F55      ROL	R21
(0074)     data_temp=data_temp       << 4;
    0099 0F66      LSL	R22
    009A 1F77      ROL	R23
    009B 0F66      LSL	R22
    009C 1F77      ROL	R23
    009D 0F66      LSL	R22
    009E 1F77      ROL	R23
    009F 0F66      LSL	R22
    00A0 1F77      ROL	R23
(0075)    
(0076)     LCD_DATA_PORT &= 0X0F;
    00A1 B382      IN	R24,0x12
    00A2 708F      ANDI	R24,0xF
    00A3 BB82      OUT	0x12,R24
(0077)     if (command==0)
    00A4 20AA      TST	R10
    00A5 F459      BNE	0x00B1
    00A6 20BB      TST	R11
    00A7 F449      BNE	0x00B1
(0078)       LCD_DATA_PORT |= data_temp&0xf0;
    00A8 01CB      MOVW	R24,R22
    00A9 7F80      ANDI	R24,0xF0
    00AA 7090      ANDI	R25,0
    00AB B222      IN	R2,0x12
    00AC 2433      CLR	R3
    00AD 2A28      OR	R2,R24
    00AE 2A39      OR	R3,R25
    00AF BA22      OUT	0x12,R2
    00B0 C008      RJMP	0x00B9
(0079)     else
(0080)       LCD_DATA_PORT |= command_temp&0xf0;
    00B1 01CA      MOVW	R24,R20
    00B2 7F80      ANDI	R24,0xF0
    00B3 7090      ANDI	R25,0
    00B4 B222      IN	R2,0x12
    00B5 2433      CLR	R3
    00B6 2A28      OR	R2,R24
    00B7 2A39      OR	R3,R25
    00B8 BA22      OUT	0x12,R2
(0081)     LCD_en_write();
    00B9 DFAD      RCALL	_LCD_en_write
(0082)    
(0083)     LCD_RW_PORT |= LCD_RW;
    00BA 9A93      SBI	0x12,3
(0084)   
(0085)     LCD_RS_PORT ^= LCD_RS;    
    00BB E180      LDI	R24,0x10
    00BC B225      IN	R2,0x15
    00BD 2628      EOR	R2,R24
    00BE BA25      OUT	0x15,R2
    00BF D0A0      RCALL	pop_gset4
    00C0 9508      RET
(0086)   }
(0087) 
(0088) void LCD_wait_Ready(void)                  //等待LCD空闲
(0089)   {
(0090)     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
    00C1 988F      CBI	0x11,7
(0091)    
(0092)     LCD_RW_PORT |= LCD_RW;                 //RW=1
    00C2 9A93      SBI	0x12,3
(0093)    
(0094)     LCD_RS_PORT &= ~LCD_RS;                //RS=0
    00C3 98AC      CBI	0x15,4
(0095)    
(0096)     LCD_EN_PORT |= LCD_EN;                 //EN=1
    00C4 9AAD      SBI	0x15,5
(0097)    
(0098)     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
    00C5 9987      SBIC	0x10,7
    00C6 C003      RJMP	0x00CA
    00C7 E001      LDI	R16,1
    00C8 E010      LDI	R17,0
    00C9 C002      RJMP	0x00CC
    00CA 2700      CLR	R16
    00CB 2711      CLR	R17
    00CC 3000      CPI	R16,0
    00CD 0701      CPC	R16,R17
    00CE F3B1      BEQ	0x00C5
(0099)    
(0100)     LCD_EN_PORT &= ~LCD_EN;                //EN=0
    00CF 98AD      CBI	0x15,5
(0101)    
(0102)     LCD_DATA_DDR |= 0xf0;
    00D0 B381      IN	R24,0x11
    00D1 6F80      ORI	R24,0xF0
    00D2 BB81      OUT	0x11,R24
    00D3 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00D4 D093      RCALL	push_gset2
    00D5 2F42      MOV	R20,R18
    00D6 2F60      MOV	R22,R16

⌨️ 快捷键说明

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