📄 15ds1302.lst
字号:
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 + -