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

📄 15ds1302.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LST
📖 第 1 页 / 共 2 页
字号:
    0132 E010      LDI	R17,0
    0133 DFCE      RCALL	_delay_us
(0063) 	EN_CLR;
    0134 98AC      CBI	0x15,4
    0135 940E0263  CALL	pop_gset1
    0137 9508      RET
(0064) }
(0065) 
(0066) /*显示屏清空显示*/
(0067) void LCD_clear(void) {
(0068) 
(0069) 	LCD_write_com(0x01);
_LCD_clear:
    0138 E001      LDI	R16,1
    0139 DFE2      RCALL	_LCD_write_com
(0070) 	delay_ms(5);
    013A E005      LDI	R16,5
    013B DFD1      RCALL	_delay_ms
    013C 9508      RET
_LCD_write_str:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    013D 940E025C  CALL	push_gset3
    013F 2EA2      MOV	R10,R18
    0140 2F60      MOV	R22,R16
    0141 814E      LDD	R20,Y+6
    0142 815F      LDD	R21,Y+7
(0071) }
(0072) 
(0073) /*显示屏字符串写入函数*/
(0074) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0075) 	
(0076)     if (y == 0) {
    0143 20AA      TST	R10
    0144 F421      BNE	0x0149
(0077)     	LCD_write_com(0x80 + x);
    0145 2F06      MOV	R16,R22
    0146 5800      SUBI	R16,0x80
    0147 DFD4      RCALL	_LCD_write_com
(0078)     	}
    0148 C009      RJMP	0x0152
(0079)     else {
(0080)     	LCD_write_com(0xC0 + x);
    0149 2F06      MOV	R16,R22
    014A 5400      SUBI	R16,0x40
    014B DFD0      RCALL	_LCD_write_com
(0081)     	}
    014C C005      RJMP	0x0152
(0082)     
(0083)     while (*s) {
(0084)     	LCD_write_data( *s);
    014D 01FA      MOVW	R30,R20
    014E 8100      LDD	R16,Z+0
    014F DFDA      RCALL	_LCD_write_data
(0085)     	s ++;
    0150 5F4F      SUBI	R20,0xFF
    0151 4F5F      SBCI	R21,0xFF
    0152 01FA      MOVW	R30,R20
    0153 8020      LDD	R2,Z+0
    0154 2022      TST	R2
    0155 F7B9      BNE	0x014D
    0156 940E0255  CALL	pop_gset3
    0158 9508      RET
_LCD_write_char:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    0159 940E025E  CALL	push_gset2
    015B 2F62      MOV	R22,R18
    015C 2F40      MOV	R20,R16
(0086)     	}
(0087) }
(0088) 
(0089) /*显示屏单字符写入函数*/
(0090) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0091) 	
(0092)     if (y == 0) {
    015D 2366      TST	R22
    015E F421      BNE	0x0163
(0093)     	LCD_write_com(0x80 + x);
    015F 2F04      MOV	R16,R20
    0160 5800      SUBI	R16,0x80
    0161 DFBA      RCALL	_LCD_write_com
(0094)     	}
    0162 C003      RJMP	0x0166
(0095)     else {
(0096)     	LCD_write_com(0xC0 + x);
    0163 2F04      MOV	R16,R20
    0164 5400      SUBI	R16,0x40
    0165 DFB6      RCALL	_LCD_write_com
(0097)     	}
(0098)     
(0099)     LCD_write_data( data);  
    0166 810C      LDD	R16,Y+4
    0167 DFC2      RCALL	_LCD_write_data
    0168 940E0252  CALL	pop_gset2
    016A 9508      RET
(0100) }
(0101) 
(0102) /*显示屏初始化函数*/
(0103) void LCD_init(void) {
(0104) 	
(0105) 	DDRA = 0xFF;						/*I/O口方向设置*/
_LCD_init:
    016B EF8F      LDI	R24,0xFF
    016C BB8A      OUT	0x1A,R24
(0106) 	DDRC = 0xFF;
    016D BB84      OUT	0x14,R24
(0107) 	LCD_write_com(0x38);				/*显示模式设置*/
    016E E308      LDI	R16,0x38
    016F DFAC      RCALL	_LCD_write_com
(0108) 	delay_ms(5);
    0170 E005      LDI	R16,5
    0171 DF9B      RCALL	_delay_ms
(0109) 	LCD_write_com(0x38);
    0172 E308      LDI	R16,0x38
    0173 DFA8      RCALL	_LCD_write_com
(0110) 	delay_ms(5);
    0174 E005      LDI	R16,5
    0175 DF97      RCALL	_delay_ms
(0111) 	LCD_write_com(0x38);
    0176 E308      LDI	R16,0x38
    0177 DFA4      RCALL	_LCD_write_com
(0112) 	delay_ms(5);
    0178 E005      LDI	R16,5
    0179 DF93      RCALL	_delay_ms
(0113) 	LCD_write_com(0x38);
    017A E308      LDI	R16,0x38
    017B DFA0      RCALL	_LCD_write_com
(0114) 	
(0115) 	LCD_write_com(0x08);				/*显示关闭*/
    017C E008      LDI	R16,0x8
    017D DF9E      RCALL	_LCD_write_com
(0116) 	LCD_write_com(0x01);				/*显示清屏*/
    017E E001      LDI	R16,1
    017F DF9C      RCALL	_LCD_write_com
(0117) 	LCD_write_com(0x06);				/*显示光标移动设置*/
    0180 E006      LDI	R16,6
    0181 DF9A      RCALL	_LCD_write_com
(0118) 	delay_ms(5);
    0182 E005      LDI	R16,5
    0183 DF89      RCALL	_delay_ms
(0119) 	LCD_write_com(0x0C);				/*显示开及光标设置*/
    0184 E00C      LDI	R16,0xC
    0185 DF96      RCALL	_LCD_write_com
    0186 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\main.c
(0001) /*
(0002) 实验十五:
(0003) 
(0004) 	DS1302时钟实险,LCD1602显示。
(0005) 	1、设置和读取DS1302内部时钟,并通过LCD1602显示。
(0006) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 	3、此实验需要有LCD1602显示屏才可以显示。
(0008) 	4、DS1302是产品中最常用的时钟芯片,通过本例子的学习可以学会如何使用DS1302。
(0009) 	5、此实验对硬件及芯片的综合知识要求比较高,所以建议大家把此实验放到后面。
(0010) 
(0011) 	此实验参照了版主tonghe的DS1302时钟程序。
(0012) 
(0013) 	AVR  mega16学习板
(0014) 	www.iccavr.com
(0015) 	10:44 2007-5-10
(0016) */
(0017) 
(0018) #include "iom128v.h"
(0019) #include "ds1302.h"
(0020) #include "lcd1602.h"
(0021) 
(0022) /*IO口初始化函数*/
(0023) void io_init(void) {
(0024) 
(0025) 	DDRA = 0xFF;							/*方向输出*/
_io_init:
    0187 EF8F      LDI	R24,0xFF
    0188 BB8A      OUT	0x1A,R24
(0026) 	PORTA = 0xFF;							/*高电平*/
    0189 BB8B      OUT	0x1B,R24
(0027) 	DDRB = 0x00;							/*方向输入*/
    018A 2422      CLR	R2
    018B BA27      OUT	0x17,R2
(0028) 	PORTB = 0xFF;							/*打开上拉*/
    018C BB88      OUT	0x18,R24
(0029) 	DDRC = 0xFF;							/*不用的IO口建议设置为输入带上拉*/
    018D BB84      OUT	0x14,R24
(0030) 	PORTC = 0x00;
    018E BA25      OUT	0x15,R2
(0031) 	DDRD = 0x00;
    018F BA21      OUT	0x11,R2
(0032) 	PORTD = 0xFF;
    0190 BB82      OUT	0x12,R24
(0033) 	DDRE = 0x00;
    0191 B822      OUT	0x02,R2
(0034) 	PORTE = 0xFF;
    0192 B983      OUT	0x03,R24
(0035) 	DDRF = 0x00;
    0193 92200061  STS	0x61,R2
(0036) 	PORTF = 0xFF;
    0195 93800062  STS	0x62,R24
(0037) 	DDRG = 0x00;
    0197 92200064  STS	0x64,R2
(0038) 	PORTG = 0xFF;
    0199 93800065  STS	0x65,R24
    019B 9508      RET
_main:
  temp                 --> R20
    019C 9721      SBIW	R28,1
(0039) }
(0040) 
(0041) void main(void) {
(0042) 
(0043) 	unsigned char temp;
(0044) 	
(0045) 	io_init();								/*IO口初始化*/
    019D DFE9      RCALL	_io_init
(0046) 	delay_ms(200);
    019E EC08      LDI	R16,0xC8
    019F 940E010D  CALL	_delay_ms
(0047) 	LCD_init();								/*LCD1602初始化*/
    01A1 940E016B  CALL	_LCD_init
(0048) 	ds1302_init();							/*DS302初始化*/
    01A3 940E00FD  CALL	_ds1302_init
(0049) 	delay_ms(10);
    01A5 E00A      LDI	R16,0xA
    01A6 940E010D  CALL	_delay_ms
(0050) 	ds1302_write_time();					/*设置DS302时间*/
    01A8 940E00B4  CALL	_ds1302_write_time
    01AA C0A4      RJMP	0x024F
(0051) 
(0052) 	while (1) {
(0053) 		delay_ms(200);
    01AB EC08      LDI	R16,0xC8
    01AC 940E010D  CALL	_delay_ms
(0054) 		ds1302_read_time();					/*读取DS302时间*/
    01AE 940E00DE  CALL	_ds1302_read_time
(0055) 		LCD_clear();						/*清除LCD屏幕*/
    01B0 940E0138  CALL	_LCD_clear
(0056) 				
(0057) 		temp = (time_buf[0] >> 4) + '0';
    01B2 91400100  LDS	R20,time_buf
    01B4 9542      SWAP	R20
    01B5 704F      ANDI	R20,0xF
    01B6 5D40      SUBI	R20,0xD0
(0058) 		LCD_write_char(0, 0, temp);/*年*/
    01B7 8348      STD	Y+0,R20
    01B8 2722      CLR	R18
    01B9 2700      CLR	R16
    01BA 940E0159  CALL	_LCD_write_char
(0059) 		temp = (time_buf[0] & 0x0F) + '0';
    01BC 91400100  LDS	R20,time_buf
    01BE 704F      ANDI	R20,0xF
    01BF 5D40      SUBI	R20,0xD0
(0060) 		LCD_write_char(1, 0, temp);
    01C0 8348      STD	Y+0,R20
    01C1 2722      CLR	R18
    01C2 E001      LDI	R16,1
    01C3 940E0159  CALL	_LCD_write_char
(0061) 		temp = (time_buf[1] >> 4) + '0';
    01C5 91400101  LDS	R20,time_buf+1
    01C7 9542      SWAP	R20
    01C8 704F      ANDI	R20,0xF
    01C9 5D40      SUBI	R20,0xD0
(0062) 		LCD_write_char(2, 0, temp);
    01CA 8348      STD	Y+0,R20
    01CB 2722      CLR	R18
    01CC E002      LDI	R16,2
    01CD 940E0159  CALL	_LCD_write_char
(0063) 		temp = (time_buf[1] & 0x0F) + '0';
    01CF 91400101  LDS	R20,time_buf+1
    01D1 704F      ANDI	R20,0xF
    01D2 5D40      SUBI	R20,0xD0
(0064) 		LCD_write_char(3, 0, temp);
    01D3 8348      STD	Y+0,R20
    01D4 2722      CLR	R18
    01D5 E003      LDI	R16,3
    01D6 940E0159  CALL	_LCD_write_char
(0065) 		LCD_write_char(4, 0, '-');
    01D8 E28D      LDI	R24,0x2D
    01D9 8388      STD	Y+0,R24
    01DA 2722      CLR	R18
    01DB E004      LDI	R16,4
    01DC 940E0159  CALL	_LCD_write_char
(0066) 		
(0067) 		temp = (time_buf[2] >> 4) + '0';
    01DE 91400102  LDS	R20,time_buf+2
    01E0 9542      SWAP	R20
    01E1 704F      ANDI	R20,0xF
    01E2 5D40      SUBI	R20,0xD0
(0068) 		LCD_write_char(5, 0, temp);/*月*/
    01E3 8348      STD	Y+0,R20
    01E4 2722      CLR	R18
    01E5 E005      LDI	R16,5
    01E6 940E0159  CALL	_LCD_write_char
(0069) 		temp = (time_buf[2] & 0x0F) + '0';
    01E8 91400102  LDS	R20,time_buf+2
    01EA 704F      ANDI	R20,0xF
    01EB 5D40      SUBI	R20,0xD0
(0070) 		LCD_write_char(6, 0, temp);
    01EC 8348      STD	Y+0,R20
    01ED 2722      CLR	R18
    01EE E006      LDI	R16,6
    01EF 940E0159  CALL	_LCD_write_char
(0071) 		LCD_write_char(7, 0, '-');
    01F1 E28D      LDI	R24,0x2D
    01F2 8388      STD	Y+0,R24
    01F3 2722      CLR	R18
    01F4 E007      LDI	R16,7
    01F5 940E0159  CALL	_LCD_write_char
(0072) 		
(0073) 		temp = (time_buf[3] >> 4) + '0';
    01F7 91400103  LDS	R20,time_buf+3
    01F9 9542      SWAP	R20
    01FA 704F      ANDI	R20,0xF
    01FB 5D40      SUBI	R20,0xD0
(0074) 		LCD_write_char(8, 0, temp);/*日*/
    01FC 8348      STD	Y+0,R20
    01FD 2722      CLR	R18
    01FE E008      LDI	R16,0x8
    01FF 940E0159  CALL	_LCD_write_char
(0075) 		temp = (time_buf[3] & 0x0F) + '0';
    0201 91400103  LDS	R20,time_buf+3
    0203 704F      ANDI	R20,0xF
    0204 5D40      SUBI	R20,0xD0
(0076) 		LCD_write_char(9, 0, temp);
    0205 8348      STD	Y+0,R20
    0206 2722      CLR	R18
    0207 E009      LDI	R16,0x9
    0208 940E0159  CALL	_LCD_write_char
(0077) 		
(0078) 		temp = (time_buf[4] >> 4) + '0';
    020A 91400104  LDS	R20,0x104
    020C 9542      SWAP	R20
    020D 704F      ANDI	R20,0xF
    020E 5D40      SUBI	R20,0xD0
(0079) 		LCD_write_char(8, 1, temp);/*时*/
    020F 8348      STD	Y+0,R20
    0210 E021      LDI	R18,1
    0211 E008      LDI	R16,0x8
    0212 940E0159  CALL	_LCD_write_char
(0080) 		temp = (time_buf[4] & 0x0F) + '0';
    0214 91400104  LDS	R20,0x104
    0216 704F      ANDI	R20,0xF
    0217 5D40      SUBI	R20,0xD0
(0081) 		LCD_write_char(9, 1, temp);
    0218 8348      STD	Y+0,R20
    0219 E021      LDI	R18,1
    021A E009      LDI	R16,0x9
    021B 940E0159  CALL	_LCD_write_char
(0082) 		LCD_write_char(10, 1, ':');
    021D E38A      LDI	R24,0x3A
    021E 8388      STD	Y+0,R24
    021F E021      LDI	R18,1
    0220 E00A      LDI	R16,0xA
    0221 940E0159  CALL	_LCD_write_char
(0083) 		
(0084) 		temp = (time_buf[5] >> 4) + '0';
    0223 91400105  LDS	R20,0x105
    0225 9542      SWAP	R20
    0226 704F      ANDI	R20,0xF
    0227 5D40      SUBI	R20,0xD0
(0085) 		LCD_write_char(11, 1, temp);/*分*/
    0228 8348      STD	Y+0,R20
    0229 E021      LDI	R18,1
    022A E00B      LDI	R16,0xB
    022B 940E0159  CALL	_LCD_write_char
(0086) 		temp = (time_buf[5] & 0x0F) + '0';
    022D 91400105  LDS	R20,0x105
    022F 704F      ANDI	R20,0xF
    0230 5D40      SUBI	R20,0xD0
(0087) 		LCD_write_char(12, 1, temp);
    0231 8348      STD	Y+0,R20
    0232 E021      LDI	R18,1
    0233 E00C      LDI	R16,0xC
    0234 940E0159  CALL	_LCD_write_char
(0088) 		LCD_write_char(13, 1, ':');
    0236 E38A      LDI	R24,0x3A
    0237 8388      STD	Y+0,R24
    0238 E021      LDI	R18,1
    0239 E00D      LDI	R16,0xD
    023A 940E0159  CALL	_LCD_write_char
(0089) 		
(0090) 		temp = (time_buf[6] >> 4) + '0';
    023C 91400106  LDS	R20,0x106
    023E 9542      SWAP	R20
    023F 704F      ANDI	R20,0xF
    0240 5D40      SUBI	R20,0xD0
(0091) 		LCD_write_char(14, 1, temp);/*秒*/
    0241 8348      STD	Y+0,R20
    0242 E021      LDI	R18,1
    0243 E00E      LDI	R16,0xE
    0244 940E0159  CALL	_LCD_write_char
(0092) 		temp = (time_buf[6] & 0x0F) + '0';
    0246 91400106  LDS	R20,0x106
    0248 704F      ANDI	R20,0xF
    0249 5D40      SUBI	R20,0xD0
(0093) 		LCD_write_char(15, 1, temp);
FILE: <library>
    024A 8348      STD	Y+0,R20
    024B E021      LDI	R18,1
    024C E00F      LDI	R16,0xF
    024D 940E0159  CALL	_LCD_write_char
    024F CF5B      RJMP	0x01AB
    0250 9621      ADIW	R28,1
    0251 9508      RET
pop_gset2:
    0252 E0E2      LDI	R30,2
    0253 940C0264  JMP	pop
pop_gset3:
    0255 E0E4      LDI	R30,4
    0256 940C0264  JMP	pop
push_gset5:
    0258 92FA      ST	R15,-Y
    0259 92EA      ST	R14,-Y
push_gset4:
    025A 92DA      ST	R13,-Y
    025B 92CA      ST	R12,-Y
push_gset3:
    025C 92BA      ST	R11,-Y
    025D 92AA      ST	R10,-Y
push_gset2:
    025E 937A      ST	R23,-Y
    025F 936A      ST	R22,-Y
push_gset1:
    0260 935A      ST	R21,-Y
    0261 934A      ST	R20,-Y
    0262 9508      RET
pop_gset1:
    0263 E0E1      LDI	R30,1
pop:
    0264 9149      LD	R20,Y+
    0265 9159      LD	R21,Y+
    0266 FDE0      SBRC	R30,0
    0267 9508      RET
    0268 9169      LD	R22,Y+
    0269 9179      LD	R23,Y+
    026A FDE1      SBRC	R30,1
    026B 9508      RET
    026C 90A9      LD	R10,Y+
    026D 90B9      LD	R11,Y+
    026E FDE2      SBRC	R30,2
    026F 9508      RET
    0270 90C9      LD	R12,Y+
    0271 90D9      LD	R13,Y+
    0272 FDE3      SBRC	R30,3
    0273 9508      RET
    0274 90E9      LD	R14,Y+
    0275 90F9      LD	R15,Y+
    0276 9508      RET

⌨️ 快捷键说明

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