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

📄 014.lst

📁 LCD1602液晶屏的四线驱动模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0115) 
(0116) 	ds1302_write_byte(ds1302_control_add,0x00);			//关闭写保护 
_ds1302_write_time:
    015C 2722      CLR	R18
    015D E80E      LDI	R16,0x8E
    015E DFB4      RCALL	_ds1302_write_byte
(0117) 	ds1302_write_byte(ds1302_sec_add,0x80);				//暂停 
    015F E820      LDI	R18,0x80
    0160 E800      LDI	R16,0x80
    0161 DFB1      RCALL	_ds1302_write_byte
(0118) 	//ds1302_write_byte(ds1302_charger_add,0xa9);			//涓流充电 
(0119) 	ds1302_write_byte(ds1302_year_add,time_buf[1]);		//年 
    0162 91200061  LDS	R18,time_buf+1
    0164 E80C      LDI	R16,0x8C
    0165 DFAD      RCALL	_ds1302_write_byte
(0120) 	ds1302_write_byte(ds1302_month_add,time_buf[2]);	//月 
    0166 91200062  LDS	R18,time_buf+2
    0168 E808      LDI	R16,0x88
    0169 DFA9      RCALL	_ds1302_write_byte
(0121) 	ds1302_write_byte(ds1302_date_add,time_buf[3]);		//日 
    016A 91200063  LDS	R18,time_buf+3
    016C E806      LDI	R16,0x86
    016D DFA5      RCALL	_ds1302_write_byte
(0122) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    016E 91200067  LDS	R18,0x67
    0170 E80A      LDI	R16,0x8A
    0171 DFA1      RCALL	_ds1302_write_byte
(0123) 	ds1302_write_byte(ds1302_hr_add,time_buf[4]);		//时 
    0172 91200064  LDS	R18,0x64
    0174 E804      LDI	R16,0x84
    0175 DF9D      RCALL	_ds1302_write_byte
(0124) 	ds1302_write_byte(ds1302_min_add,time_buf[5]);		//分
    0176 91200065  LDS	R18,0x65
    0178 E802      LDI	R16,0x82
    0179 DF99      RCALL	_ds1302_write_byte
(0125) 	ds1302_write_byte(ds1302_sec_add,time_buf[6]);		//秒
    017A 91200066  LDS	R18,0x66
    017C E800      LDI	R16,0x80
    017D DF95      RCALL	_ds1302_write_byte
(0126) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    017E 91200067  LDS	R18,0x67
    0180 E80A      LDI	R16,0x8A
    0181 DF91      RCALL	_ds1302_write_byte
(0127) 	ds1302_write_byte(ds1302_control_add,0x80);			//打开写保护 
    0182 E820      LDI	R18,0x80
    0183 E80E      LDI	R16,0x8E
    0184 DF8E      RCALL	_ds1302_write_byte
    0185 9508      RET
(0128) }
(0129) 
(0130) /*从DS302读出时钟数据*/
(0131) void ds1302_read_time(void)  { 
(0132) 
(0133) 	time_buf[1]=ds1302_read_byte(ds1302_year_add);		//年 
_ds1302_read_time:
    0186 E80C      LDI	R16,0x8C
    0187 DFAF      RCALL	_ds1302_read_byte
    0188 93000061  STS	time_buf+1,R16
(0134) 	time_buf[2]=ds1302_read_byte(ds1302_month_add);		//月 
    018A E808      LDI	R16,0x88
    018B DFAB      RCALL	_ds1302_read_byte
    018C 93000062  STS	time_buf+2,R16
(0135) 	time_buf[3]=ds1302_read_byte(ds1302_date_add);		//日 
    018E E806      LDI	R16,0x86
    018F DFA7      RCALL	_ds1302_read_byte
    0190 93000063  STS	time_buf+3,R16
(0136) 	time_buf[4]=ds1302_read_byte(ds1302_hr_add);		//时 
    0192 E804      LDI	R16,0x84
    0193 DFA3      RCALL	_ds1302_read_byte
    0194 93000064  STS	0x64,R16
(0137) 	time_buf[5]=ds1302_read_byte(ds1302_min_add);		//分 
    0196 E802      LDI	R16,0x82
    0197 DF9F      RCALL	_ds1302_read_byte
    0198 93000065  STS	0x65,R16
(0138) 	time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 
    019A E800      LDI	R16,0x80
    019B DF9B      RCALL	_ds1302_read_byte
    019C 2F80      MOV	R24,R16
    019D 778F      ANDI	R24,0x7F
    019E 93800066  STS	0x66,R24
(0139) 	time_buf[7]=ds1302_read_byte(ds1302_day_add);		//周 
    01A0 E80A      LDI	R16,0x8A
    01A1 DF95      RCALL	_ds1302_read_byte
    01A2 93000067  STS	0x67,R16
    01A4 9508      RET
(0140) }
(0141) 
(0142) /*DS302初始化函数*/
(0143) void ds1302_init(void) {
(0144) 	
(0145) 	RST_CLR;			/*RST脚置低*/
_ds1302_init:
    01A5 98AC      CBI	0x15,4
(0146) 	SCK_CLR;			/*SCK脚置低*/
    01A6 98AA      CBI	0x15,2
(0147) 	RST_OUT;			/*RST脚设置为输出*/
    01A7 9AA4      SBI	0x14,4
(0148) 	SCK_OUT;			/*SCK脚设置为输出*/
    01A8 9AA2      SBI	0x14,2
    01A9 9508      RET
FILE: D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\lcd1602.c
(0001) /*
(0002) 	LCD1602液晶屏四线驱动模块
(0003) 	1、可直接嵌入到项目中使用
(0004) 	2、晶振频率:1M
(0005) 	3、如晶振提高低层驱动延时要作相应修改
(0006) 	4、程序在原来基础上只使用了PB口的高四位,即PB4—PB7,PB0—PB3可以做它用
(0007) 
(0008) 	SunnyTrip
(0009) 	www.iccavr.com
(0010) */
(0011) 
(0012) #include <iom16v.h>
(0013) 
(0014) #define RS_CLR	PORTD &= ~(1 << PD3)
(0015) #define RS_SET	PORTD |= (1 << PD3)
(0016) 
(0017) #define RW_CLR	PORTD &= ~(1 << PD4)
(0018) #define RW_SET	PORTD |= (1 << PD4)
(0019) 
(0020) #define EN_CLR	PORTD &= ~(1 << PD6)
(0021) #define EN_SET	PORTD |= (1 << PD6)
(0022) 
(0023) /*延时函数*/
(0024) void delay_us(unsigned int n) {
(0025) 
(0026) 	if (n == 0) {
_delay_us:
  n                    --> R16
    01AA 3000      CPI	R16,0
    01AB 0701      CPC	R16,R17
    01AC F409      BNE	0x01AE
(0027) 		return ;
    01AD C006      RJMP	0x01B4
(0028) 		}
(0029) 	while (--n);
    01AE 01C8      MOVW	R24,R16
    01AF 9701      SBIW	R24,1
    01B0 018C      MOVW	R16,R24
    01B1 3000      CPI	R16,0
    01B2 0701      CPC	R16,R17
    01B3 F7D1      BNE	0x01AE
    01B4 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    01B5 940E026A  CALL	push_gset2
(0030) }
(0031) 
(0032) /*延时函数*/
(0033) void delay_ms(unsigned char i) {
(0034) 
(0035) 	unsigned char a, b;
(0036) 	for (a = 1; a < i; a++) {
    01B7 E041      LDI	R20,1
    01B8 C006      RJMP	0x01BF
(0037) 		for (b = 1; b; b++) {
    01B9 E061      LDI	R22,1
    01BA C001      RJMP	0x01BC
    01BB 9563      INC	R22
    01BC 2366      TST	R22
    01BD F7E9      BNE	0x01BB
    01BE 9543      INC	R20
    01BF 1740      CP	R20,R16
    01C0 F3C0      BCS	0x01B9
    01C1 940E025E  CALL	pop_gset2
    01C3 9508      RET
_LCD_write_com:
  com                  --> R20
    01C4 940E026C  CALL	push_gset1
    01C6 2F40      MOV	R20,R16
(0038) 			;
(0039) 			}
(0040) 		}
(0041) }
(0042) 
(0043) /*显示屏命令写入函数*/
(0044) void LCD_write_com(unsigned char com) {
(0045) 	
(0046) 	RS_CLR;
    01C7 9893      CBI	0x12,3
(0047) 	RW_CLR;
    01C8 9894      CBI	0x12,4
(0048) 	EN_SET;
    01C9 9A96      SBI	0x12,6
(0049) 	PORTB&=0x0f;
    01CA B388      IN	R24,0x18
    01CB 708F      ANDI	R24,0xF
    01CC BB88      OUT	0x18,R24
(0050) 	PORTB|= com&0xf0;
    01CD 2F84      MOV	R24,R20
    01CE 7F80      ANDI	R24,0xF0
    01CF B228      IN	R2,0x18
    01D0 2A28      OR	R2,R24
    01D1 BA28      OUT	0x18,R2
(0051) 	com = com<<4;
    01D2 2F84      MOV	R24,R20
    01D3 708F      ANDI	R24,0xF
    01D4 9582      SWAP	R24
    01D5 2F48      MOV	R20,R24
(0052) 	EN_CLR;
    01D6 9896      CBI	0x12,6
(0053) 	delay_us(1);
    01D7 E001      LDI	R16,1
    01D8 E010      LDI	R17,0
    01D9 DFD0      RCALL	_delay_us
(0054) 	EN_SET;
    01DA 9A96      SBI	0x12,6
(0055) 	PORTB&=0x0f;
    01DB B388      IN	R24,0x18
    01DC 708F      ANDI	R24,0xF
    01DD BB88      OUT	0x18,R24
(0056) 	PORTB|= com&0xf0;
    01DE 2F84      MOV	R24,R20
    01DF 7F80      ANDI	R24,0xF0
    01E0 B228      IN	R2,0x18
    01E1 2A28      OR	R2,R24
    01E2 BA28      OUT	0x18,R2
(0057) 	EN_CLR;
    01E3 9896      CBI	0x12,6
(0058) 	delay_us(1);
    01E4 E001      LDI	R16,1
    01E5 E010      LDI	R17,0
    01E6 DFC3      RCALL	_delay_us
    01E7 940E026F  CALL	pop_gset1
    01E9 9508      RET
_LCD_write_data:
  data                 --> R20
    01EA 940E026C  CALL	push_gset1
    01EC 2F40      MOV	R20,R16
(0059) }
(0060) 
(0061) /*显示屏命令写入函数*/
(0062) void LCD_write_data(unsigned char data) {
(0063) 
(0064) 	RS_SET;
    01ED 9A93      SBI	0x12,3
(0065) 	RW_CLR;
    01EE 9894      CBI	0x12,4
(0066) 	EN_SET;
    01EF 9A96      SBI	0x12,6
(0067) 	PORTB&=0x0f;
    01F0 B388      IN	R24,0x18
    01F1 708F      ANDI	R24,0xF
    01F2 BB88      OUT	0x18,R24
(0068) 	PORTB|= data&0xf0;
    01F3 2F84      MOV	R24,R20
    01F4 7F80      ANDI	R24,0xF0
    01F5 B228      IN	R2,0x18
    01F6 2A28      OR	R2,R24
    01F7 BA28      OUT	0x18,R2
(0069) 	data = data<<4;
    01F8 2F84      MOV	R24,R20
    01F9 708F      ANDI	R24,0xF
    01FA 9582      SWAP	R24
    01FB 2F48      MOV	R20,R24
(0070) 	EN_CLR;
    01FC 9896      CBI	0x12,6
(0071) 	delay_us(1);
    01FD E001      LDI	R16,1
    01FE E010      LDI	R17,0
    01FF DFAA      RCALL	_delay_us
(0072) 	EN_SET;
    0200 9A96      SBI	0x12,6
(0073) 	PORTB&=0x0f;
    0201 B388      IN	R24,0x18
    0202 708F      ANDI	R24,0xF
    0203 BB88      OUT	0x18,R24
(0074) 	PORTB|= data&0xf0;
    0204 2F84      MOV	R24,R20
    0205 7F80      ANDI	R24,0xF0
    0206 B228      IN	R2,0x18
    0207 2A28      OR	R2,R24
    0208 BA28      OUT	0x18,R2
(0075) 	EN_CLR;
    0209 9896      CBI	0x12,6
    020A 940E026F  CALL	pop_gset1
    020C 9508      RET
(0076) }
(0077) 
(0078) /*显示屏清空显示*/
(0079) void LCD_clear(void) {
(0080) 
(0081) 	LCD_write_com(0x01);
_LCD_clear:
    020D E001      LDI	R16,1
    020E DFB5      RCALL	_LCD_write_com
(0082) 	delay_ms(5);
    020F E005      LDI	R16,5
    0210 DFA4      RCALL	_delay_ms
    0211 9508      RET
_LCD_write_str:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    0212 940E0268  CALL	push_gset3
    0214 2EA2      MOV	R10,R18
    0215 2F60      MOV	R22,R16
    0216 814E      LDD	R20,Y+6
    0217 815F      LDD	R21,Y+7
(0083) }
(0084) 
(0085) /*显示屏字符串写入函数*/
(0086) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0087) 	
(0088)     if (y == 0) {
    0218 20AA      TST	R10
    0219 F421      BNE	0x021E
(0089)     	LCD_write_com(0x80 + x);
    021A 2F06      MOV	R16,R22
    021B 5800      SUBI	R16,0x80
    021C DFA7      RCALL	_LCD_write_com
(0090)     	}
    021D C009      RJMP	0x0227
(0091)     else {
(0092)     	LCD_write_com(0xC0 + x);
    021E 2F06      MOV	R16,R22
    021F 5400      SUBI	R16,0x40
    0220 DFA3      RCALL	_LCD_write_com
(0093)     	}
    0221 C005      RJMP	0x0227
(0094)     
(0095)     while (*s) {
(0096)     	LCD_write_data( *s);
    0222 01FA      MOVW	R30,R20
    0223 8100      LDD	R16,Z+0
    0224 DFC5      RCALL	_LCD_write_data
(0097)     	s ++;
    0225 5F4F      SUBI	R20,0xFF
    0226 4F5F      SBCI	R21,0xFF
    0227 01FA      MOVW	R30,R20
    0228 8020      LDD	R2,Z+0
    0229 2022      TST	R2
    022A F7B9      BNE	0x0222
    022B 940E0261  CALL	pop_gset3
    022D 9508      RET
_LCD_write_char:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    022E 940E026A  CALL	push_gset2
    0230 2F62      MOV	R22,R18
    0231 2F40      MOV	R20,R16
(0098)     	}
(0099) }
(0100) 
(0101) /*显示屏单字符写入函数*/
(0102) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0103) 	
(0104)     if (y == 0) {
    0232 2366      TST	R22
    0233 F421      BNE	0x0238
(0105)     	LCD_write_com(0x80 + x);
    0234 2F04      MOV	R16,R20
    0235 5800      SUBI	R16,0x80
    0236 DF8D      RCALL	_LCD_write_com
(0106)     	}
    0237 C003      RJMP	0x023B
(0107)     else {
(0108)     	LCD_write_com(0xC0 + x);
    0238 2F04      MOV	R16,R20
    0239 5400      SUBI	R16,0x40
    023A DF89      RCALL	_LCD_write_com
(0109)     	}
(0110)     
(0111)     LCD_write_data( data);  
    023B 810C      LDD	R16,Y+4
    023C DFAD      RCALL	_LCD_write_data
    023D 940E025E  CALL	pop_gset2
    023F 9508      RET
(0112) }
(0113) 
(0114) /*显示屏初始化函数*/
(0115) void LCD_init(void) {
(0116) 	
(0117) 	DDRB = 0xFF;						/*I/O口方向设置*/
_LCD_init:
    0240 EF8F      LDI	R24,0xFF
    0241 BB87      OUT	0x17,R24
(0118) 	DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
    0242 B381      IN	R24,0x11
    0243 6588      ORI	R24,0x58
    0244 BB81      OUT	0x11,R24
(0119) 	LCD_write_com(0x28);				/*显示模式设置*/
    0245 E208      LDI	R16,0x28
    0246 DF7D      RCALL	_LCD_write_com
(0120) 	delay_ms(15);
    0247 E00F      LDI	R16,0xF
    0248 DF6C      RCALL	_delay_ms
(0121) 	LCD_write_com(0x28);
    0249 E208      LDI	R16,0x28
    024A DF79      RCALL	_LCD_write_com
(0122) 	delay_ms(5);
    024B E005      LDI	R16,5
    024C DF68      RCALL	_delay_ms
(0123) 	LCD_write_com(0x28);
    024D E208      LDI	R16,0x28
    024E DF75      RCALL	_LCD_write_com
(0124) 	delay_ms(5);
    024F E005      LDI	R16,5
    0250 DF64      RCALL	_delay_ms
(0125) 	LCD_write_com(0x28);
    0251 E208      LDI	R16,0x28
    0252 DF71      RCALL	_LCD_write_com
(0126) 	
(0127) 	LCD_write_com(0x08);				/*显示关闭*/
    0253 E008      LDI	R16,0x8
    0254 DF6F      RCALL	_LCD_write_com
(0128) 	LCD_write_com(0x01);				/*显示清屏*/
    0255 E001      LDI	R16,1
    0256 DF6D      RCALL	_LCD_write_com
(0129) 	LCD_write_com(0x06);				/*显示光标移动设置*/
    0257 E006      LDI	R16,6
    0258 DF6B      RCALL	_LCD_write_com
(0130) 	delay_ms(5);
    0259 E005      LDI	R16,5
    025A DF5A      RCALL	_delay_ms
(0131) 	LCD_write_com(0x0C);				/*显示开及光标设置*/
FILE: <library>
    025B E00C      LDI	R16,0xC
    025C DF67      RCALL	_LCD_write_com
    025D 9508      RET
pop_gset2:
    025E E0E2      LDI	R30,2
    025F 940C0270  JMP	pop
pop_gset3:
    0261 E0E4      LDI	R30,4
    0262 940C0270  JMP	pop
push_gset5:
    0264 92FA      ST	R15,-Y
    0265 92EA      ST	R14,-Y
push_gset4:
    0266 92DA      ST	R13,-Y
    0267 92CA      ST	R12,-Y
push_gset3:
    0268 92BA      ST	R11,-Y
    0269 92AA      ST	R10,-Y
push_gset2:
    026A 937A      ST	R23,-Y
    026B 936A      ST	R22,-Y
push_gset1:
    026C 935A      ST	R21,-Y
    026D 934A      ST	R20,-Y
    026E 9508      RET
pop_gset1:
    026F E0E1      LDI	R30,1
pop:
    0270 9149      LD	R20,Y+
    0271 9159      LD	R21,Y+
    0272 FDE0      SBRC	R30,0
    0273 9508      RET
    0274 9169      LD	R22,Y+
    0275 9179      LD	R23,Y+
    0276 FDE1      SBRC	R30,1
    0277 9508      RET
    0278 90A9      LD	R10,Y+
    0279 90B9      LD	R11,Y+
    027A FDE2      SBRC	R30,2
    027B 9508      RET
    027C 90C9      LD	R12,Y+
    027D 90D9      LD	R13,Y+
    027E FDE3      SBRC	R30,3
    027F 9508      RET
    0280 90E9      LD	R14,Y+
    0281 90F9      LD	R15,Y+
    0282 9508      RET

⌨️ 快捷键说明

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