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

📄 main.lst

📁 基于AVR单片机的24C02的仿真源码 用PROTUES软件
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0008) PA2 ->RS
(0009) PA3 ->EN
(0010) 地  ->RW
(0011) PA4 ->D4
(0012) PA5 ->D5
(0013) PA6 ->D6
(0014) PA7 ->D7
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT    PORTC   //以下2个要设为同一个口
(0018) #define LCD_EN_DDR     DDRC
(0019) #define LCD_RS_PORT    PORTC   //以下2个要设为同一个口
(0020) #define LCD_RS_DDR     DDRC
(0021) #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR   DDRA    //一定要用高4位
(0023) #define LCD_DATA_PIN   PINA
(0024) #define LCD_RS         (1<<PC6) //0x04   portC6       out
(0025) #define LCD_EN         (1<<PC7) //0x08   portC7       out
(0026) #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA4/5/6/7 out
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned  char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037) 
(0038) //-----------------------------------------------------------------------------------------
(0039) 
(0040) #include <iom16v.h>
(0041) #include <macros.h>
(0042) #include "delay.h"
(0043) 
(0044) void LCD_init(void)         //液晶初始化
(0045) {
(0046)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
    0102 B38A      IN	R24,0x1A
    0103 6F80      ORI	R24,0xF0
    0104 BB8A      OUT	0x1A,R24
(0047)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
    0105 9AA7      SBI	0x14,7
(0048)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
    0106 9AA6      SBI	0x14,6
(0049)   LCD_write_command(0x28); 
    0107 E208      LDI	R16,0x28
    0108 D014      RCALL	_LCD_write_command
(0050)   LCD_en_write();
    0109 D00D      RCALL	_LCD_en_write
(0051)   delay_nus(40);
    010A E208      LDI	R16,0x28
    010B E010      LDI	R17,0
    010C DF40      RCALL	_delay_nus
(0052)   LCD_write_command(0x28);  //4位显示
    010D E208      LDI	R16,0x28
    010E D00E      RCALL	_LCD_write_command
(0053)   LCD_write_command(0x0c);  //显示开
    010F E00C      LDI	R16,0xC
    0110 D00C      RCALL	_LCD_write_command
(0054)   LCD_write_command(0x01);  //清屏
    0111 E001      LDI	R16,1
    0112 D00A      RCALL	_LCD_write_command
(0055)   delay_nms(2);
    0113 E002      LDI	R16,2
    0114 E010      LDI	R17,0
    0115 DF50      RCALL	_delay_nms
    0116 9508      RET
(0056) }
(0057) 
(0058) void LCD_en_write(void)  //液晶使能
(0059) {
(0060)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    0117 9AAF      SBI	0x15,7
(0061)   delay_nus(1);
    0118 E001      LDI	R16,1
    0119 E010      LDI	R17,0
    011A DF32      RCALL	_delay_nus
(0062)   LCD_EN_PORT&=~LCD_EN;
    011B 98AF      CBI	0x15,7
    011C 9508      RET
_LCD_write_command:
  command              --> R20
    011D 940E01CB  CALL	push_gset1
    011F 2F40      MOV	R20,R16
(0063) }
(0064) 
(0065) void LCD_write_command(unsigned char command) //写指令
(0066) {
(0067)   delay_nus(16);
    0120 E100      LDI	R16,0x10
    0121 E010      LDI	R17,0
    0122 DF2A      RCALL	_delay_nus
(0068)   LCD_RS_PORT&=~LCD_RS;        //RS=0
    0123 98AE      CBI	0x15,6
(0069)   LCD_DATA_PORT&=0X0f;         //清高四位
    0124 B38B      IN	R24,0x1B
    0125 708F      ANDI	R24,0xF
    0126 BB8B      OUT	0x1B,R24
(0070)   LCD_DATA_PORT|=command&0xf0; //写高四位
    0127 2F84      MOV	R24,R20
    0128 7F80      ANDI	R24,0xF0
    0129 B22B      IN	R2,0x1B
    012A 2A28      OR	R2,R24
    012B BA2B      OUT	0x1B,R2
(0071)   LCD_en_write();
    012C DFEA      RCALL	_LCD_en_write
(0072)   command=command<<4;          //低四位移到高四位
    012D 2F84      MOV	R24,R20
    012E 708F      ANDI	R24,0xF
    012F 9582      SWAP	R24
    0130 2F48      MOV	R20,R24
(0073)   LCD_DATA_PORT&=0x0f;         //清高四位
    0131 B38B      IN	R24,0x1B
    0132 708F      ANDI	R24,0xF
    0133 BB8B      OUT	0x1B,R24
(0074)   LCD_DATA_PORT|=command&0xf0; //写低四位
    0134 2F84      MOV	R24,R20
    0135 7F80      ANDI	R24,0xF0
    0136 B22B      IN	R2,0x1B
    0137 2A28      OR	R2,R24
    0138 BA2B      OUT	0x1B,R2
(0075)   LCD_en_write();
    0139 DFDD      RCALL	_LCD_en_write
    013A 940E01CE  CALL	pop_gset1
    013C 9508      RET
_LCD_write_data:
  data                 --> R20
    013D 940E01CB  CALL	push_gset1
    013F 2F40      MOV	R20,R16
(0076)   
(0077) }
(0078) 
(0079) void LCD_write_data(unsigned char data) //写数据
(0080) {
(0081)   delay_nus(16);
    0140 E100      LDI	R16,0x10
    0141 E010      LDI	R17,0
    0142 DF0A      RCALL	_delay_nus
(0082)   LCD_RS_PORT|=LCD_RS;       //RS=1
    0143 9AAE      SBI	0x15,6
(0083)   LCD_DATA_PORT&=0X0f;       //清高四位
    0144 B38B      IN	R24,0x1B
    0145 708F      ANDI	R24,0xF
    0146 BB8B      OUT	0x1B,R24
(0084)   LCD_DATA_PORT|=data&0xf0;  //写高四位
    0147 2F84      MOV	R24,R20
    0148 7F80      ANDI	R24,0xF0
    0149 B22B      IN	R2,0x1B
    014A 2A28      OR	R2,R24
    014B BA2B      OUT	0x1B,R2
(0085)   LCD_en_write();
    014C DFCA      RCALL	_LCD_en_write
(0086)   data=data<<4;               //低四位移到高四位
    014D 2F84      MOV	R24,R20
    014E 708F      ANDI	R24,0xF
    014F 9582      SWAP	R24
    0150 2F48      MOV	R20,R24
(0087)   LCD_DATA_PORT&=0X0f;        //清高四位
    0151 B38B      IN	R24,0x1B
    0152 708F      ANDI	R24,0xF
    0153 BB8B      OUT	0x1B,R24
(0088)   LCD_DATA_PORT|=data&0xf0;   //写低四位
    0154 2F84      MOV	R24,R20
    0155 7F80      ANDI	R24,0xF0
    0156 B22B      IN	R2,0x1B
    0157 2A28      OR	R2,R24
    0158 BA2B      OUT	0x1B,R2
(0089)   LCD_en_write();
    0159 DFBD      RCALL	_LCD_en_write
    015A 940E01CE  CALL	pop_gset1
    015C 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    015D 940E01C9  CALL	push_gset2
    015F 2F42      MOV	R20,R18
    0160 2F60      MOV	R22,R16
(0090) }
(0091) 
(0092) 
(0093) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0094) {
(0095)     unsigned char address;
(0096)     if (y == 0) address = 0x80 + x;
    0161 2344      TST	R20
    0162 F419      BNE	0x0166
    0163 2F46      MOV	R20,R22
    0164 5840      SUBI	R20,0x80
    0165 C002      RJMP	0x0168
(0097)     else   address = 0xc0 + x;
    0166 2F46      MOV	R20,R22
    0167 5440      SUBI	R20,0x40
(0098)     LCD_write_command( address);
    0168 2F04      MOV	R16,R20
    0169 DFB3      RCALL	_LCD_write_command
    016A 940E01BD  CALL	pop_gset2
    016C 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    016D 940E01C7  CALL	push_gset3
    016F 2EA2      MOV	R10,R18
    0170 2F60      MOV	R22,R16
    0171 814E      LDD	R20,Y+6
    0172 815F      LDD	R21,Y+7
(0099) }
(0100)   
(0101) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0102) {
(0103)     LCD_set_xy( X, Y ); //写地址    
    0173 2D2A      MOV	R18,R10
    0174 2F06      MOV	R16,R22
    0175 DFE7      RCALL	_LCD_set_xy
    0176 C005      RJMP	0x017C
(0104)     while (*s)  // 写显示字符
(0105)     {
(0106)       LCD_write_data( *s );
    0177 01FA      MOVW	R30,R20
    0178 8100      LDD	R16,Z+0
    0179 DFC3      RCALL	_LCD_write_data
(0107)       s ++;
    017A 5F4F      SUBI	R20,0xFF
    017B 4F5F      SBCI	R21,0xFF
    017C 01FA      MOVW	R30,R20
    017D 8020      LDD	R2,Z+0
    017E 2022      TST	R2
    017F F7B9      BNE	0x0177
    0180 940E01C0  CALL	pop_gset3
    0182 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    0183 940E01C9  CALL	push_gset2
    0185 2F62      MOV	R22,R18
    0186 2F40      MOV	R20,R16
(0108)     }
(0109)       
(0110) }
(0111) 
(0112) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0113) {
(0114)   LCD_set_xy( X, Y ); //写地址
    0187 2F26      MOV	R18,R22
    0188 2F04      MOV	R16,R20
    0189 DFD3      RCALL	_LCD_set_xy
(0115)   LCD_write_data( data);
    018A 810C      LDD	R16,Y+4
    018B DFB1      RCALL	_LCD_write_data
    018C 940E01BD  CALL	pop_gset2
    018E 9508      RET
_main:
  i                    --> R20
    018F 9721      SBIW	R28,1
FILE: D:\avr\+++精华+++\24c02\main.c
(0001) #include <iom16v.h>
(0002) #include "I2C.h"
(0003) #include "1602.h"
(0004) #include "delay.h"
(0005) void main(void)
(0006) 
(0007) {	
(0008) 	unsigned char i;
(0009) 	LCD_init();
    0190 DF71      RCALL	_LCD_init
    0191 C028      RJMP	0x01BA
(0010) 	  while(1)
(0011) 	  {
(0012) 	 I2C_Write('n',0x00);
    0192 2722      CLR	R18
    0193 E60E      LDI	R16,0x6E
    0194 DEE0      RCALL	_I2C_Write
(0013) 	 I2C_Write('c',0x01);
    0195 E021      LDI	R18,1
    0196 E603      LDI	R16,0x63
    0197 DEDD      RCALL	_I2C_Write
(0014) 	 I2C_Write('e',0x02);
    0198 E022      LDI	R18,2
    0199 E605      LDI	R16,0x65
    019A DEDA      RCALL	_I2C_Write
(0015) 	 I2C_Write('p',0x03);
    019B E023      LDI	R18,3
    019C E700      LDI	R16,0x70
    019D DED7      RCALL	_I2C_Write
(0016) 	 I2C_Write('u',0x04);
    019E E024      LDI	R18,4
    019F E705      LDI	R16,0x75
    01A0 DED4      RCALL	_I2C_Write
(0017) 	 
(0018) 	 i=I2C_Read(0x00);
    01A1 2700      CLR	R16
    01A2 2711      CLR	R17
    01A3 DF0E      RCALL	_I2C_Read
    01A4 2F40      MOV	R20,R16
(0019) 	 LCD_write_char(0,0,i);
    01A5 8348      STD	Y+0,R20
    01A6 2722      CLR	R18
    01A7 2700      CLR	R16
    01A8 DFDA      RCALL	_LCD_write_char
(0020) 	 i=I2C_Read(0x01);
    01A9 E001      LDI	R16,1
    01AA E010      LDI	R17,0
    01AB DF06      RCALL	_I2C_Read
(0021) 	 LCD_write_data(i);
    01AC DF90      RCALL	_LCD_write_data
(0022) 	 i=I2C_Read(0x02);
    01AD E002      LDI	R16,2
    01AE E010      LDI	R17,0
    01AF DF02      RCALL	_I2C_Read
(0023) 	 LCD_write_data(i);
    01B0 DF8C      RCALL	_LCD_write_data
(0024) 	 i=I2C_Read(0x03);
    01B1 E003      LDI	R16,3
    01B2 E010      LDI	R17,0
    01B3 DEFE      RCALL	_I2C_Read
(0025) 	 LCD_write_data(i);
    01B4 DF88      RCALL	_LCD_write_data
(0026) 	 i=I2C_Read(0x04);
    01B5 E004      LDI	R16,4
    01B6 E010      LDI	R17,0
    01B7 DEFA      RCALL	_I2C_Read
    01B8 2F40      MOV	R20,R16
(0027) 	 LCD_write_data(i);
FILE: <library>
    01B9 DF83      RCALL	_LCD_write_data
    01BA CFD7      RJMP	0x0192
    01BB 9621      ADIW	R28,1
    01BC 9508      RET
pop_gset2:
    01BD E0E2      LDI	R30,2
    01BE 940C01CF  JMP	pop
pop_gset3:
    01C0 E0E4      LDI	R30,4
    01C1 940C01CF  JMP	pop
push_gset5:
    01C3 92FA      ST	R15,-Y
    01C4 92EA      ST	R14,-Y
push_gset4:
    01C5 92DA      ST	R13,-Y
    01C6 92CA      ST	R12,-Y
push_gset3:
    01C7 92BA      ST	R11,-Y
    01C8 92AA      ST	R10,-Y
push_gset2:
    01C9 937A      ST	R23,-Y
    01CA 936A      ST	R22,-Y
push_gset1:
    01CB 935A      ST	R21,-Y
    01CC 934A      ST	R20,-Y
    01CD 9508      RET
pop_gset1:
    01CE E0E1      LDI	R30,1
pop:
    01CF 9149      LD	R20,Y+
    01D0 9159      LD	R21,Y+
    01D1 FDE0      SBRC	R30,0
    01D2 9508      RET
    01D3 9169      LD	R22,Y+
    01D4 9179      LD	R23,Y+
    01D5 FDE1      SBRC	R30,1
    01D6 9508      RET
    01D7 90A9      LD	R10,Y+
    01D8 90B9      LD	R11,Y+
    01D9 FDE2      SBRC	R30,2
    01DA 9508      RET
    01DB 90C9      LD	R12,Y+
    01DC 90D9      LD	R13,Y+
    01DD FDE3      SBRC	R30,3
    01DE 9508      RET
    01DF 90E9      LD	R14,Y+
    01E0 90F9      LD	R15,Y+
    01E1 9508      RET

⌨️ 快捷键说明

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