📄 014.lst
字号:
__start:
__text_start:
002E E5CF LDI R28,0x5F
002F E0D4 LDI R29,4
0030 BFCD OUT 0x3D,R28
0031 BFDE OUT 0x3E,R29
0032 51C0 SUBI R28,0x10
0033 40D0 SBCI R29,0
0034 EA0A LDI R16,0xAA
0035 8308 STD Y+0,R16
0036 2400 CLR R0
0037 E6E8 LDI R30,0x68
0038 E0F0 LDI R31,0
0039 E010 LDI R17,0
003A 36E8 CPI R30,0x68
003B 07F1 CPC R31,R17
003C F011 BEQ 0x003F
003D 9201 ST R0,Z+
003E CFFB RJMP 0x003A
003F 8300 STD Z+0,R16
0040 E5E4 LDI R30,0x54
0041 E0F0 LDI R31,0
0042 E6A0 LDI R26,0x60
0043 E0B0 LDI R27,0
0044 E010 LDI R17,0
0045 35EC CPI R30,0x5C
0046 07F1 CPC R31,R17
0047 F021 BEQ 0x004C
0048 95C8 LPM
0049 9631 ADIW R30,1
004A 920D ST R0,X+
004B CFF9 RJMP 0x0045
004C 940E004F CALL _main
_exit:
004E CFFF RJMP _exit
_main:
temp --> R20
004F 9721 SBIW R28,1
FILE: D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\main.c
(0001) /*
(0002) 实验LCD四线驱动程序:
(0003)
(0004) DS1302时钟实险,LCD1602四线驱动显示。
(0005) 1、设置和读取DS1302内部时钟,并通过LCD1602四线驱动显示。
(0006) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 3、进行此实验请插上PB4-PB7、PD3、PD4、PD6,PC4、PC7短路块。
(0008) 4、DS1302芯片接口占用JTAG仿真接口,在做实验时需要关闭mega16的JTAG功能。
(0009) 5、此实验需要有LCD1602显示屏才可以显示。
(0010) 6、此实验对硬件及芯片的综合知识要求比较高,所以建议大家把此实验放到后面。
(0011)
(0012) 此实验参照了版主tonghe的DS1302时钟程序。
(0013)
(0014) AVR mega16学习板
(0015) www.iccavr.com
(0016) 10:44 2007-8-7
(0017) */
(0018)
(0019) #include "iom16v.h"
(0020) #include "ds1302.h"
(0021) #include "lcd1602.h"
(0022)
(0023) void main(void) {
(0024)
(0025) unsigned char temp;
(0026)
(0027) PORTA = 0xFF; /*打开上拉*/
0050 EF8F LDI R24,0xFF
0051 BB8B OUT 0x1B,R24
(0028) DDRA = 0x00; /*方向输入*/
0052 2422 CLR R2
0053 BA2A OUT 0x1A,R2
(0029) PORTB = 0xF0; /*电平设置*/
0054 EF80 LDI R24,0xF0
0055 BB88 OUT 0x18,R24
(0030) DDRB = 0xFF; /*方向输出*/
0056 EF8F LDI R24,0xFF
0057 BB87 OUT 0x17,R24
(0031) PORTC = 0x7F;
0058 E78F LDI R24,0x7F
0059 BB85 OUT 0x15,R24
(0032) DDRC = 0x80;
005A E880 LDI R24,0x80
005B BB84 OUT 0x14,R24
(0033) PORTD = 0xFF;
005C EF8F LDI R24,0xFF
005D BB82 OUT 0x12,R24
(0034) DDRD = 0x00;
005E BA21 OUT 0x11,R2
(0035)
(0036) delay_ms(200);
005F EC08 LDI R16,0xC8
0060 940E01B5 CALL _delay_ms
(0037) LCD_init();
0062 940E0240 CALL _LCD_init
(0038) ds1302_init();
0064 940E01A5 CALL _ds1302_init
(0039) delay_ms(10);
0066 E00A LDI R16,0xA
0067 940E01B5 CALL _delay_ms
(0040) ds1302_write_time();
0069 940E015C CALL _ds1302_write_time
006B C0A4 RJMP 0x0110
(0041)
(0042) while (1) {
(0043) delay_ms(200);
006C EC08 LDI R16,0xC8
006D 940E01B5 CALL _delay_ms
(0044) ds1302_read_time();
006F 940E0186 CALL _ds1302_read_time
(0045) LCD_clear();
0071 940E020D CALL _LCD_clear
(0046)
(0047) temp = (time_buf[0] >> 4) + '0';
0073 91400060 LDS R20,time_buf
0075 9542 SWAP R20
0076 704F ANDI R20,0xF
0077 5D40 SUBI R20,0xD0
(0048) LCD_write_char(0, 0, temp);/*年*/
0078 8348 STD Y+0,R20
0079 2722 CLR R18
007A 2700 CLR R16
007B 940E022E CALL _LCD_write_char
(0049) temp = (time_buf[0] & 0x0F) + '0';
007D 91400060 LDS R20,time_buf
007F 704F ANDI R20,0xF
0080 5D40 SUBI R20,0xD0
(0050) LCD_write_char(1, 0, temp);
0081 8348 STD Y+0,R20
0082 2722 CLR R18
0083 E001 LDI R16,1
0084 940E022E CALL _LCD_write_char
(0051) temp = (time_buf[1] >> 4) + '0';
0086 91400061 LDS R20,time_buf+1
0088 9542 SWAP R20
0089 704F ANDI R20,0xF
008A 5D40 SUBI R20,0xD0
(0052) LCD_write_char(2, 0, temp);
008B 8348 STD Y+0,R20
008C 2722 CLR R18
008D E002 LDI R16,2
008E 940E022E CALL _LCD_write_char
(0053) temp = (time_buf[1] & 0x0F) + '0';
0090 91400061 LDS R20,time_buf+1
0092 704F ANDI R20,0xF
0093 5D40 SUBI R20,0xD0
(0054) LCD_write_char(3, 0, temp);
0094 8348 STD Y+0,R20
0095 2722 CLR R18
0096 E003 LDI R16,3
0097 940E022E CALL _LCD_write_char
(0055) LCD_write_char(4, 0, '-');
0099 E28D LDI R24,0x2D
009A 8388 STD Y+0,R24
009B 2722 CLR R18
009C E004 LDI R16,4
009D 940E022E CALL _LCD_write_char
(0056)
(0057) temp = (time_buf[2] >> 4) + '0';
009F 91400062 LDS R20,time_buf+2
00A1 9542 SWAP R20
00A2 704F ANDI R20,0xF
00A3 5D40 SUBI R20,0xD0
(0058) LCD_write_char(5, 0, temp);/*月*/
00A4 8348 STD Y+0,R20
00A5 2722 CLR R18
00A6 E005 LDI R16,5
00A7 940E022E CALL _LCD_write_char
(0059) temp = (time_buf[2] & 0x0F) + '0';
00A9 91400062 LDS R20,time_buf+2
00AB 704F ANDI R20,0xF
00AC 5D40 SUBI R20,0xD0
(0060) LCD_write_char(6, 0, temp);
00AD 8348 STD Y+0,R20
00AE 2722 CLR R18
00AF E006 LDI R16,6
00B0 940E022E CALL _LCD_write_char
(0061) LCD_write_char(7, 0, '-');
00B2 E28D LDI R24,0x2D
00B3 8388 STD Y+0,R24
00B4 2722 CLR R18
00B5 E007 LDI R16,7
00B6 940E022E CALL _LCD_write_char
(0062)
(0063) temp = (time_buf[3] >> 4) + '0';
00B8 91400063 LDS R20,time_buf+3
00BA 9542 SWAP R20
00BB 704F ANDI R20,0xF
00BC 5D40 SUBI R20,0xD0
(0064) LCD_write_char(8, 0, temp);/*日*/
00BD 8348 STD Y+0,R20
00BE 2722 CLR R18
00BF E008 LDI R16,0x8
00C0 940E022E CALL _LCD_write_char
(0065) temp = (time_buf[3] & 0x0F) + '0';
00C2 91400063 LDS R20,time_buf+3
00C4 704F ANDI R20,0xF
00C5 5D40 SUBI R20,0xD0
(0066) LCD_write_char(9, 0, temp);
00C6 8348 STD Y+0,R20
00C7 2722 CLR R18
00C8 E009 LDI R16,0x9
00C9 940E022E CALL _LCD_write_char
(0067)
(0068) temp = (time_buf[4] >> 4) + '0';
00CB 91400064 LDS R20,0x64
00CD 9542 SWAP R20
00CE 704F ANDI R20,0xF
00CF 5D40 SUBI R20,0xD0
(0069) LCD_write_char(8, 1, temp);/*时*/
00D0 8348 STD Y+0,R20
00D1 E021 LDI R18,1
00D2 E008 LDI R16,0x8
00D3 940E022E CALL _LCD_write_char
(0070) temp = (time_buf[4] & 0x0F) + '0';
00D5 91400064 LDS R20,0x64
00D7 704F ANDI R20,0xF
00D8 5D40 SUBI R20,0xD0
(0071) LCD_write_char(9, 1, temp);
00D9 8348 STD Y+0,R20
00DA E021 LDI R18,1
00DB E009 LDI R16,0x9
00DC 940E022E CALL _LCD_write_char
(0072) LCD_write_char(10, 1, ':');
00DE E38A LDI R24,0x3A
00DF 8388 STD Y+0,R24
00E0 E021 LDI R18,1
00E1 E00A LDI R16,0xA
00E2 940E022E CALL _LCD_write_char
(0073)
(0074) temp = (time_buf[5] >> 4) + '0';
00E4 91400065 LDS R20,0x65
00E6 9542 SWAP R20
00E7 704F ANDI R20,0xF
00E8 5D40 SUBI R20,0xD0
(0075) LCD_write_char(11, 1, temp);/*分*/
00E9 8348 STD Y+0,R20
00EA E021 LDI R18,1
00EB E00B LDI R16,0xB
00EC 940E022E CALL _LCD_write_char
(0076) temp = (time_buf[5] & 0x0F) + '0';
00EE 91400065 LDS R20,0x65
00F0 704F ANDI R20,0xF
00F1 5D40 SUBI R20,0xD0
(0077) LCD_write_char(12, 1, temp);
00F2 8348 STD Y+0,R20
00F3 E021 LDI R18,1
00F4 E00C LDI R16,0xC
00F5 940E022E CALL _LCD_write_char
(0078) LCD_write_char(13, 1, ':');
00F7 E38A LDI R24,0x3A
00F8 8388 STD Y+0,R24
00F9 E021 LDI R18,1
00FA E00D LDI R16,0xD
00FB 940E022E CALL _LCD_write_char
(0079)
(0080) temp = (time_buf[6] >> 4) + '0';
00FD 91400066 LDS R20,0x66
00FF 9542 SWAP R20
0100 704F ANDI R20,0xF
0101 5D40 SUBI R20,0xD0
(0081) LCD_write_char(14, 1, temp);/*秒*/
0102 8348 STD Y+0,R20
0103 E021 LDI R18,1
0104 E00E LDI R16,0xE
0105 940E022E CALL _LCD_write_char
(0082) temp = (time_buf[6] & 0x0F) + '0';
0107 91400066 LDS R20,0x66
0109 704F ANDI R20,0xF
010A 5D40 SUBI R20,0xD0
(0083) LCD_write_char(15, 1, temp);
010B 8348 STD Y+0,R20
010C E021 LDI R18,1
010D E00F LDI R16,0xF
010E 940E022E CALL _LCD_write_char
0110 CF5B RJMP 0x006C
0111 9621 ADIW R28,1
0112 9508 RET
_ds1302_write_byte:
i --> R20
d --> R18
addr --> R16
0113 940E026C CALL push_gset1
FILE: D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\ds1302.c
(0001)
(0002) #include "iom16v.h"
(0003)
(0004) /*复位脚*/
(0005) #define RST_CLR PORTC &= ~(1 << PC4)/*电平置低*/
(0006) #define RST_SET PORTC |= (1 << PC4)/*电平置高*/
(0007) #define RST_IN DDRC &= ~(1 << PC4)/*方向输入*/
(0008) #define RST_OUT DDRC |= (1 << PC4)/*方向输出*/
(0009)
(0010) /*双向数据*/
(0011) #define IO_CLR PORTC &= ~(1 << PC3)/*电平置低*/
(0012) #define IO_SET PORTC |= (1 << PC3)/*电平置高*/
(0013) #define IO_R PINC & (1 << PC3)/*电平读取*/
(0014) #define IO_IN DDRC &= ~(1 << PC3)/*方向输入*/
(0015) #define IO_OUT DDRC |= (1 << PC3)/*方向输出*/
(0016)
(0017) /*时钟信号*/
(0018) #define SCK_CLR PORTC &= ~(1 << PC2)/*时钟信号*/
(0019) #define SCK_SET PORTC |= (1 << PC2)/*电平置高*/
(0020) #define SCK_IN DDRC &= ~(1 << PC2)/*方向输入*/
(0021) #define SCK_OUT DDRC |= (1 << PC2)/*方向输出*/
(0022)
(0023) #define ds1302_sec_add 0x80 //秒数据地址
(0024) #define ds1302_min_add 0x82 //分数据地址
(0025) #define ds1302_hr_add 0x84 //时数据地址
(0026) #define ds1302_date_add 0x86 //日数据地址
(0027) #define ds1302_month_add 0x88 //月数据地址
(0028) #define ds1302_day_add 0x8a //星期数据地址
(0029) #define ds1302_year_add 0x8c //年数据地址
(0030) #define ds1302_control_add 0x8e //控制数据地址
(0031) #define ds1302_charger_add 0x90
(0032) #define ds1302_clkburst_add 0xbe
(0033)
(0034) unsigned char time_buf[8] = {0x20,0x07,0x08,0x07,0x11,0x15,0x00,0x02};
(0035)
(0036) /*向DS1302写入一字节数据*/
(0037) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0038)
(0039) unsigned char i;
(0040) RST_SET; /*启动DS1302总线*/
0115 9AAC SBI 0x15,4
(0041)
(0042) /*写入目标地址:addr*/
(0043) IO_OUT;
0116 9AA3 SBI 0x14,3
(0044) addr = addr & 0xFE;/*最低位置零*/
0117 7F0E ANDI R16,0xFE
(0045) for (i = 0; i < 8; i ++) {
0118 2744 CLR R20
0119 C009 RJMP 0x0123
(0046) if (addr & 0x01) {
011A FF00 SBRS R16,0
011B C002 RJMP 0x011E
(0047) IO_SET;
011C 9AAB SBI 0x15,3
(0048) }
011D C001 RJMP 0x011F
(0049) else {
(0050) IO_CLR;
011E 98AB CBI 0x15,3
(0051) }
(0052) SCK_SET;
011F 9AAA SBI 0x15,2
(0053) SCK_CLR;
0120 98AA CBI 0x15,2
(0054) addr = addr >> 1;
0121 9506 LSR R16
0122 9543 INC R20
0123 3048 CPI R20,0x8
0124 F3A8 BCS 0x011A
(0055) }
(0056)
(0057) /*写入数据:d*/
(0058) IO_OUT;
0125 9AA3 SBI 0x14,3
(0059) for (i = 0; i < 8; i ++) {
0126 2744 CLR R20
0127 C009 RJMP 0x0131
(0060) if (d & 0x01) {
0128 FF20 SBRS R18,0
0129 C002 RJMP 0x012C
(0061) IO_SET;
012A 9AAB SBI 0x15,3
(0062) }
012B C001 RJMP 0x012D
(0063) else {
(0064) IO_CLR;
012C 98AB CBI 0x15,3
(0065) }
(0066) SCK_SET;
012D 9AAA SBI 0x15,2
(0067) SCK_CLR;
012E 98AA CBI 0x15,2
(0068) d = d >> 1;
012F 9526 LSR R18
0130 9543 INC R20
0131 3048 CPI R20,0x8
0132 F3A8 BCS 0x0128
(0069) }
(0070) RST_CLR; /*停止DS1302总线*/
0133 98AC CBI 0x15,4
0134 940E026F CALL pop_gset1
0136 9508 RET
_ds1302_read_byte:
temp --> R20
i --> R22
addr --> R16
0137 940E026A CALL push_gset2
(0071) }
(0072)
(0073) /*从DS1302读出一字节数据*/
(0074) unsigned char ds1302_read_byte(unsigned char addr) {
(0075)
(0076) unsigned char i;
(0077) unsigned char temp;
(0078) RST_SET; /*启动DS1302总线*/
0139 9AAC SBI 0x15,4
(0079)
(0080) /*写入目标地址:addr*/
(0081) IO_OUT;
013A 9AA3 SBI 0x14,3
(0082) addr = addr | 0x01;/*最低位置高*/
013B 6001 ORI R16,1
(0083) for (i = 0; i < 8; i ++) {
013C 2766 CLR R22
013D C009 RJMP 0x0147
(0084) if (addr & 0x01) {
013E FF00 SBRS R16,0
013F C002 RJMP 0x0142
(0085) IO_SET;
0140 9AAB SBI 0x15,3
(0086) }
0141 C001 RJMP 0x0143
(0087) else {
(0088) IO_CLR;
0142 98AB CBI 0x15,3
(0089) }
(0090) SCK_SET;
0143 9AAA SBI 0x15,2
(0091) SCK_CLR;
0144 98AA CBI 0x15,2
(0092) addr = addr >> 1;
0145 9506 LSR R16
0146 9563 INC R22
0147 3068 CPI R22,0x8
0148 F3A8 BCS 0x013E
(0093) }
(0094)
(0095) /*输出数据:temp*/
(0096) IO_IN;
0149 98A3 CBI 0x14,3
(0097) for (i = 0; i < 8; i ++) {
014A 2766 CLR R22
014B C009 RJMP 0x0155
(0098) temp = temp >> 1;
014C 9546 LSR R20
(0099) if (IO_R) {
014D 9B9B SBIS 0x13,3
014E C002 RJMP 0x0151
(0100) temp |= 0x80;
014F 6840 ORI R20,0x80
(0101) }
0150 C001 RJMP 0x0152
(0102) else {
(0103) temp &= 0x7F;
0151 774F ANDI R20,0x7F
(0104) }
(0105) SCK_SET;
0152 9AAA SBI 0x15,2
(0106) SCK_CLR;
0153 98AA CBI 0x15,2
0154 9563 INC R22
0155 3068 CPI R22,0x8
0156 F3A8 BCS 0x014C
(0107) }
(0108)
(0109) RST_CLR; /*停止DS1302总线*/
0157 98AC CBI 0x15,4
(0110) return temp;
0158 2F04 MOV R16,R20
0159 940E025E CALL pop_gset2
015B 9508 RET
(0111) }
(0112)
(0113) /*向DS302写入时钟数据*/
(0114) void ds1302_write_time(void) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -