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

📄 1602b_lcd_prj.lst

📁 LCD的应用.跟单片机配合做的一个电子表程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002C E5CF      LDI	R28,0x5F
    002D E0D4      LDI	R29,4
    002E BFCD      OUT	0x3D,R28
    002F BFDE      OUT	0x3E,R29
    0030 51C0      SUBI	R28,0x10
    0031 40D0      SBCI	R29,0
    0032 EA0A      LDI	R16,0xAA
    0033 8308      STD	Y+0,R16
    0034 2400      CLR	R0
    0035 E7E5      LDI	R30,0x75
    0036 E0F0      LDI	R31,0
    0037 E010      LDI	R17,0
    0038 37E7      CPI	R30,0x77
    0039 07F1      CPC	R31,R17
    003A F011      BEQ	0x003D
    003B 9201      ST	R0,Z+
    003C CFFB      RJMP	0x0038
    003D 8300      STD	Z+0,R16
    003E E4E2      LDI	R30,0x42
    003F E0F0      LDI	R31,0
    0040 E6A0      LDI	R26,0x60
    0041 E0B0      LDI	R27,0
    0042 E010      LDI	R17,0
    0043 35E7      CPI	R30,0x57
    0044 07F1      CPC	R31,R17
    0045 F021      BEQ	0x004A
    0046 95C8      LPM
    0047 9631      ADIW	R30,1
    0048 920D      ST	R0,X+
    0049 CFF9      RJMP	0x0043
    004A D1B0      RCALL	_main
_exit:
    004B CFFF      RJMP	_exit
FILE: I:\AVR\1602\MEGA8-1602\CLOCKA~1\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(20);
_LCD_init:
    004C E104      LDI	R16,0x14
    004D E010      LDI	R17,0
    004E D1E9      RCALL	_delay_nms
(0023)    
(0024)     LCD_write_char(0x28,0);      //4bit test
    004F 2722      CLR	R18
    0050 2733      CLR	R19
    0051 E208      LDI	R16,0x28
    0052 E010      LDI	R17,0
    0053 D016      RCALL	_LCD_write_char
(0025)     LCD_write_char(0x0c,0);      //显示开
    0054 2722      CLR	R18
    0055 2733      CLR	R19
    0056 E00C      LDI	R16,0xC
    0057 E010      LDI	R17,0
    0058 D011      RCALL	_LCD_write_char
(0026)     LCD_write_char(0x01,0);      //显示清屏
    0059 2722      CLR	R18
    005A 2733      CLR	R19
    005B E001      LDI	R16,1
    005C E010      LDI	R17,0
    005D D00C      RCALL	_LCD_write_char
(0027)     LCD_write_char(0x06,0);      //显示光标移动设置
    005E 2722      CLR	R18
    005F 2733      CLR	R19
    0060 E006      LDI	R16,6
    0061 E010      LDI	R17,0
    0062 D007      RCALL	_LCD_write_char
    0063 9508      RET
(0028)   }
(0029) 
(0030) void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
(0031)   {
(0032)     LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
    0064 9AAD      SBI	0x15,5
(0033)     delay_nus(5);
    0065 E005      LDI	R16,5
    0066 E010      LDI	R17,0
    0067 D1B9      RCALL	_delay_nus
(0034)     LCD_EN_PORT &= ~LCD_EN;
    0068 98AD      CBI	0x15,5
    0069 9508      RET
_LCD_write_char:
  data_temp            --> R22
  command_temp         --> R20
  data                 --> R12
  command              --> R10
    006A D1FA      RCALL	push_gset4
    006B 0169      MOVW	R12,R18
    006C 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;
    006D 01A5      MOVW	R20,R10
(0053)     data_temp = data;
    006E 01B6      MOVW	R22,R12
(0054)    
(0055)     LCD_wait_Ready();
    006F D04E      RCALL	_LCD_wait_Ready
(0056)    
(0057)     LCD_RW_PORT &= ~LCD_RW;                 //RW=0
    0070 9893      CBI	0x12,3
(0058)    
(0059)     if (command == 0)
    0071 3040      CPI	R20,0
    0072 0745      CPC	R20,R21
    0073 F469      BNE	0x0081
(0060)       {
(0061)    	 LCD_RS_PORT |= LCD_RS;             //RS=1 
    0074 9AAC      SBI	0x15,4
(0062)    	 LCD_DATA_PORT &= 0X0F;
    0075 B382      IN	R24,0x12
    0076 708F      ANDI	R24,0xF
    0077 BB82      OUT	0x12,R24
(0063) 	 LCD_DATA_PORT |= data_temp&0xf0;   //send high 4bit
    0078 01CB      MOVW	R24,R22
    0079 7F80      ANDI	R24,0xF0
    007A 7090      ANDI	R25,0
    007B B222      IN	R2,0x12
    007C 2433      CLR	R3
    007D 2A28      OR	R2,R24
    007E 2A39      OR	R3,R25
    007F BA22      OUT	0x12,R2
(0064)       }
    0080 C00C      RJMP	0x008D
(0065)     else 
(0066)       {
(0067) 	 LCD_RS_PORT &= ~LCD_RS;            //RS=0
    0081 98AC      CBI	0x15,4
(0068) 	 LCD_DATA_PORT &= 0X0F;
    0082 B382      IN	R24,0x12
    0083 708F      ANDI	R24,0xF
    0084 BB82      OUT	0x12,R24
(0069)          LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
    0085 01CA      MOVW	R24,R20
    0086 7F80      ANDI	R24,0xF0
    0087 7090      ANDI	R25,0
    0088 B222      IN	R2,0x12
    0089 2433      CLR	R3
    008A 2A28      OR	R2,R24
    008B 2A39      OR	R3,R25
    008C BA22      OUT	0x12,R2
(0070)       }
(0071)     LCD_en_write();
    008D DFD6      RCALL	_LCD_en_write
(0072)    
(0073)     command_temp=command_temp << 4;         //send low 4bit
    008E 0F44      LSL	R20
    008F 1F55      ROL	R21
    0090 0F44      LSL	R20
    0091 1F55      ROL	R21
    0092 0F44      LSL	R20
    0093 1F55      ROL	R21
    0094 0F44      LSL	R20
    0095 1F55      ROL	R21
(0074)     data_temp=data_temp       << 4;
    0096 0F66      LSL	R22
    0097 1F77      ROL	R23
    0098 0F66      LSL	R22
    0099 1F77      ROL	R23
    009A 0F66      LSL	R22
    009B 1F77      ROL	R23
    009C 0F66      LSL	R22
    009D 1F77      ROL	R23
(0075)    
(0076)     LCD_DATA_PORT &= 0X0F;
    009E B382      IN	R24,0x12
    009F 708F      ANDI	R24,0xF
    00A0 BB82      OUT	0x12,R24
(0077)     if (command==0)
    00A1 20AA      TST	R10
    00A2 F459      BNE	0x00AE
    00A3 20BB      TST	R11
    00A4 F449      BNE	0x00AE
(0078)       LCD_DATA_PORT |= data_temp&0xf0;
    00A5 01CB      MOVW	R24,R22
    00A6 7F80      ANDI	R24,0xF0
    00A7 7090      ANDI	R25,0
    00A8 B222      IN	R2,0x12
    00A9 2433      CLR	R3
    00AA 2A28      OR	R2,R24
    00AB 2A39      OR	R3,R25
    00AC BA22      OUT	0x12,R2
    00AD C008      RJMP	0x00B6
(0079)     else
(0080)       LCD_DATA_PORT |= command_temp&0xf0;
    00AE 01CA      MOVW	R24,R20
    00AF 7F80      ANDI	R24,0xF0
    00B0 7090      ANDI	R25,0
    00B1 B222      IN	R2,0x12
    00B2 2433      CLR	R3
    00B3 2A28      OR	R2,R24
    00B4 2A39      OR	R3,R25
    00B5 BA22      OUT	0x12,R2
(0081)     LCD_en_write();
    00B6 DFAD      RCALL	_LCD_en_write
(0082)    
(0083)     LCD_RW_PORT |= LCD_RW;
    00B7 9A93      SBI	0x12,3
(0084)   
(0085)     LCD_RS_PORT ^= LCD_RS;    
    00B8 E180      LDI	R24,0x10
    00B9 B225      IN	R2,0x15
    00BA 2628      EOR	R2,R24
    00BB BA25      OUT	0x15,R2
    00BC D1A4      RCALL	pop_gset4
    00BD 9508      RET
(0086)   }
(0087) 
(0088) void LCD_wait_Ready(void)                  //等待LCD空闲
(0089)   {
(0090)     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
    00BE 988F      CBI	0x11,7
(0091)    
(0092)     LCD_RW_PORT |= LCD_RW;                 //RW=1
    00BF 9A93      SBI	0x12,3
(0093)    
(0094)     LCD_RS_PORT &= ~LCD_RS;                //RS=0
    00C0 98AC      CBI	0x15,4
(0095)    
(0096)     LCD_EN_PORT |= LCD_EN;                 //EN=1
    00C1 9AAD      SBI	0x15,5
(0097)    
(0098)     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
    00C2 9987      SBIC	0x10,7
    00C3 C003      RJMP	0x00C7
    00C4 E001      LDI	R16,1
    00C5 E010      LDI	R17,0
    00C6 C002      RJMP	0x00C9
    00C7 2700      CLR	R16
    00C8 2711      CLR	R17
    00C9 3000      CPI	R16,0
    00CA 0701      CPC	R16,R17
    00CB F3B1      BEQ	0x00C2
(0099)    
(0100)     LCD_EN_PORT &= ~LCD_EN;                //EN=0
    00CC 98AD      CBI	0x15,5
(0101)    
(0102)     LCD_DATA_DDR |= 0xf0;
    00CD B381      IN	R24,0x11
    00CE 6F80      ORI	R24,0xF0
    00CF BB81      OUT	0x11,R24
    00D0 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00D1 D197      RCALL	push_gset2
    00D2 2F42      MOV	R20,R18
    00D3 2F60      MOV	R22,R16
(0103)   }
(0104) 
(0105) /*-----------------------------------------------------------------------
(0106) LCD_set_xy        : 设置LCD显示的起始位置
(0107) 
(0108) 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0109)                     LCD第一行显示寄存器地址:0X80-0X8F
(0110)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0111) 
(0112) 编写日期          :2004-8-19 
(0113) 最后修改日期      :2004-8-19 		
(0114) -----------------------------------------------------------------------*/
(0115) void LCD_set_xy( unsigned char x, unsigned char y )
(0116)   {
(0117)     unsigned char address;
(0118)     if (y == 0) address = 0x80 + x;
    00D4 2344      TST	R20
    00D5 F419      BNE	0x00D9
    00D6 2F46      MOV	R20,R22
    00D7 5840      SUBI	R20,0x80
    00D8 C002      RJMP	0x00DB
(0119)     else 
(0120)        address = 0xc0 + x;
    00D9 2F46      MOV	R20,R22
    00DA 5440      SUBI	R20,0x40
(0121)     LCD_write_char( address, 0 );
    00DB 2722      CLR	R18
    00DC 2733      CLR	R19
    00DD 2F04      MOV	R16,R20
    00DE 2711      CLR	R17
    00DF DF8A      RCALL	_LCD_write_char
    00E0 D17C      RCALL	pop_gset2
    00E1 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    00E2 D184      RCALL	push_gset3
    00E3 2EA2      MOV	R10,R18
    00E4 2F60      MOV	R22,R16
    00E5 814E      LDD	R20,Y+6
    00E6 815F      LDD	R21,Y+7
(0122)   }
(0123) /*-----------------------------------------------------------------------
(0124) LCD_write_string  : 英文字符串显示函数
(0125) 
(0126) 输入参数:*s      :英文字符串指针;
(0127)           X、Y    : 显示字符串的位置
(0128) 
(0129) 编写日期          :2004-8-19 
(0130) 最后修改日期      :2004-8-19 		
(0131) -----------------------------------------------------------------------*/
(0132) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0133)   {
(0134)     LCD_set_xy( X, Y );
    00E7 2D2A      MOV	R18,R10
    00E8 2F06      MOV	R16,R22
    00E9 DFE7      RCALL	_LCD_set_xy
    00EA C008      RJMP	0x00F3
(0135)     
(0136)     while (*s) 
(0137)       {
(0138)         LCD_write_char( 0, *s );
    00EB 01FA      MOVW	R30,R20
    00EC 8120      LDD	R18,Z+0
    00ED 2733      CLR	R19
    00EE 2700      CLR	R16
    00EF 2711      CLR	R17
    00F0 DF79      RCALL	_LCD_write_char
(0139) 	s ++;
    00F1 5F4F      SUBI	R20,0xFF
    00F2 4F5F      SBCI	R21,0xFF
    00F3 01FA      MOVW	R30,R20
    00F4 8020      LDD	R2,Z+0
    00F5 2022      TST	R2
    00F6 F7A1      BNE	0x00EB
    00F7 D167      RCALL	pop_gset3
    00F8 9508      RET
FILE: I:\AVR\1602\MEGA8-1602\CLOCKA~1\test6\1602B_LCD_TEST.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include <math.h>
(0004) #include "1602LCD.h"
(0005) const unsigned char table[]="0123456789";
(0006) const unsigned char love[]="I Love U,MeiMei!";
(0007) unsigned char h=0x0A,m=0x28,s=0x20,temp1;
(0008) unsigned char ch,ch1=0; 
(0009) 
(0010) //TIMER1 initialize - prescale:1024
(0011) // WGM: 0) Normal, TOP=0xFFFF
(0012) // desired value: 1Hz
(0013) // actual value:  1.000Hz (0.0%)
(0014) void timer1_init(void)
(0015) {
(0016)  TCCR1B = 0x00; //stop
_timer1_init:
    00F9 2422      CLR	R2
    00FA BC2E      OUT	0x2E,R2
(0017)  TCNT1H = 0xF0; //setup
    00FB EF80      LDI	R24,0xF0
    00FC BD8D      OUT	0x2D,R24
(0018)  TCNT1L = 0xBE;
    00FD EB8E      LDI	R24,0xBE
    00FE BD8C      OUT	0x2C,R24
(0019)  OCR1AH = 0x0F;
    00FF E08F      LDI	R24,0xF
    0100 BD8B      OUT	0x2B,R24
(0020)  OCR1AL = 0x42;
    0101 E482      LDI	R24,0x42
    0102 BD8A      OUT	0x2A,R24
(0021)  OCR1BH = 0x0F;
    0103 E08F      LDI	R24,0xF
    0104 BD89      OUT	0x29,R24
(0022)  OCR1BL = 0x42;
    0105 E482      LDI	R24,0x42
    0106 BD88      OUT	0x28,R24
(0023)  ICR1H  = 0x0F;
    0107 E08F      LDI	R24,0xF
    0108 BD87      OUT	0x27,R24
(0024)  ICR1L  = 0x42;
    0109 E482      LDI	R24,0x42
    010A BD86      OUT	0x26,R24
(0025)  TCCR1A = 0x00;
    010B BC2F      OUT	0x2F,R2
(0026)  TCCR1B = 0x04; //start Timer
    010C E084      LDI	R24,4
    010D BD8E      OUT	0x2E,R24
    010E 9508      RET
_timer1_ovf_isr:
    010F D172      RCALL	push_lset
    0110 9722      SBIW	R28,2
(0027) }
(0028) 
(0029) #pragma interrupt_handler timer1_ovf_isr:9
(0030) void timer1_ovf_isr(void)
(0031) {
(0032) //TIMER1 has overflowed
(0033)  TCNT1H = 0xF0; //reload counter high value
    0111 EF80      LDI	R24,0xF0
    0112 BD8D      OUT	0x2D,R24
(0034)  TCNT1L = 0xBE; //reload counter low value
    0113 EB8E      LDI	R24,0xBE
    0114 BD8C      OUT	0x2C,R24
(0035)     s++;
    0115 91800062  LDS	R24,s
    0117 5F8F      SUBI	R24,0xFF
    0118 93800062  STS	s,R24
(0036)          if(s>0x3B)
    011A E38B      LDI	R24,0x3B
    011B 90200062  LDS	R2,s
    011D 1582      CP	R24,R2
    011E F440      BCC	0x0127
(0037) 		   {s=0x0;
    011F 2422      CLR	R2
    0120 92200062  STS	s,R2
(0038) 		    m++;}
    0122 91800061  LDS	R24,m
    0124 5F8F      SUBI	R24,0xFF
    0125 93800061  STS	m,R24
(0039) 		   if(m>0x3B)
    0127 E38B      LDI	R24,0x3B
    0128 90200061  LDS	R2,m
    012A 1582      CP	R24,R2
    012B F440      BCC	0x0134
(0040) 		     {m=0x0;
    012C 2422      CLR	R2
    012D 92200061  STS	m,R2
(0041) 		      h++;}
    012F 91800060  LDS	R24,h
    0131 5F8F      SUBI	R24,0xFF
    0132 93800060  STS	h,R24
(0042) 			  if(h>0x0C)
    0134 E08C      LDI	R24,0xC
    0135 90200060  LDS	R2,h
    0137 1582      CP	R24,R2
    0138 F418      BCC	0x013C
(0043) 		      {h=0x0;}
    0139 2422      CLR	R2
    013A 92200060  STS	h,R2
(0044) 			  
(0045)       write_s(s);
    013C 91000062  LDS	R16,s
    013E 2711      CLR	R17
    013F D095      RCALL	_write_s
(0046) 	  write_m(m);
    0140 91000061  LDS	R16,m
    0142 2711      CLR	R17
    0143 D066      RCALL	_write_m
(0047) 	  write_h(h);
    0144 91000060  LDS	R16,h
    0146 2711      CLR	R17
    0147 D037      RCALL	_write_h
(0048) 	  LCD_set_xy(ch,1);

⌨️ 快捷键说明

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