📄 15ds1302.lst
字号:
__start:
__text_start:
004A EFCF LDI R28,0xFF
004B E1D0 LDI R29,0x10
004C BFCD OUT 0x3D,R28
004D BFDE OUT 0x3E,R29
004E 51C0 SUBI R28,0x10
004F 40D0 SBCI R29,0
0050 EA0A LDI R16,0xAA
0051 8308 STD Y+0,R16
0052 2400 CLR R0
0053 E0E8 LDI R30,0x8
0054 E0F1 LDI R31,1
0055 E011 LDI R17,1
0056 30E8 CPI R30,0x8
0057 07F1 CPC R31,R17
0058 F011 BEQ 0x005B
0059 9201 ST R0,Z+
005A CFFB RJMP 0x0056
005B 8300 STD Z+0,R16
005C E8EC LDI R30,0x8C
005D E0F0 LDI R31,0
005E E0A0 LDI R26,0
005F E0B1 LDI R27,1
0060 E010 LDI R17,0
0061 39E4 CPI R30,0x94
0062 07F1 CPC R31,R17
0063 F021 BEQ 0x0068
0064 95C8 LPM
0065 9631 ADIW R30,1
0066 920D ST R0,X+
0067 CFF9 RJMP 0x0061
0068 940E019C CALL _main
_exit:
006A CFFF RJMP _exit
_ds1302_write_byte:
i --> R20
d --> R18
addr --> R16
006B 940E0260 CALL push_gset1
FILE: E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
(0001) /*
(0002) DS1302时钟芯片驱动函数
(0003)
(0004) DS1302是产品中最常用的时钟芯片,此文件中的代码可以嵌入项目中使用。
(0005)
(0006) */
(0007)
(0008) #include "iom128v.h"
(0009)
(0010) /*复位脚*/
(0011) #define RST_CLR PORTD &= ~(1 << PD7)/*电平置低*/
(0012) #define RST_SET PORTD |= (1 << PD7)/*电平置高*/
(0013) #define RST_IN DDRD &= ~(1 << PD7)/*方向输入*/
(0014) #define RST_OUT DDRD |= (1 << PD7)/*方向输出*/
(0015)
(0016) /*双向数据*/
(0017) #define IO_CLR PORTD &= ~(1 << PD6)/*电平置低*/
(0018) #define IO_SET PORTD |= (1 << PD6)/*电平置高*/
(0019) #define IO_R PIND & (1 << PD6)/*电平读取*/
(0020) #define IO_IN DDRD &= ~(1 << PD6)/*方向输入*/
(0021) #define IO_OUT DDRD |= (1 << PD6)/*方向输出*/
(0022)
(0023) /*时钟信号*/
(0024) #define SCK_CLR PORTD &= ~(1 << PD5)/*时钟信号*/
(0025) #define SCK_SET PORTD |= (1 << PD5)/*电平置高*/
(0026) #define SCK_IN DDRD &= ~(1 << PD5)/*方向输入*/
(0027) #define SCK_OUT DDRD |= (1 << PD5)/*方向输出*/
(0028)
(0029) #define ds1302_sec_add 0x80 //秒数据地址
(0030) #define ds1302_min_add 0x82 //分数据地址
(0031) #define ds1302_hr_add 0x84 //时数据地址
(0032) #define ds1302_date_add 0x86 //日数据地址
(0033) #define ds1302_month_add 0x88 //月数据地址
(0034) #define ds1302_day_add 0x8a //星期数据地址
(0035) #define ds1302_year_add 0x8c //年数据地址
(0036) #define ds1302_control_add 0x8e //控制数据地址
(0037) #define ds1302_charger_add 0x90
(0038) #define ds1302_clkburst_add 0xbe
(0039)
(0040) unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
(0041)
(0042) /*向DS1302写入一字节数据*/
(0043) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0044)
(0045) unsigned char i;
(0046) RST_SET; /*启动DS1302总线*/
006D 9A97 SBI 0x12,7
(0047)
(0048) /*写入目标地址:addr*/
(0049) IO_OUT;
006E 9A8E SBI 0x11,6
(0050) addr = addr & 0xFE;/*最低位置零*/
006F 7F0E ANDI R16,0xFE
(0051) for (i = 0; i < 8; i ++) {
0070 2744 CLR R20
0071 C009 RJMP 0x007B
(0052) if (addr & 0x01) {
0072 FF00 SBRS R16,0
0073 C002 RJMP 0x0076
(0053) IO_SET;
0074 9A96 SBI 0x12,6
(0054) }
0075 C001 RJMP 0x0077
(0055) else {
(0056) IO_CLR;
0076 9896 CBI 0x12,6
(0057) }
(0058) SCK_SET;
0077 9A95 SBI 0x12,5
(0059) SCK_CLR;
0078 9895 CBI 0x12,5
(0060) addr = addr >> 1;
0079 9506 LSR R16
007A 9543 INC R20
007B 3048 CPI R20,0x8
007C F3A8 BCS 0x0072
(0061) }
(0062)
(0063) /*写入数据:d*/
(0064) IO_OUT;
007D 9A8E SBI 0x11,6
(0065) for (i = 0; i < 8; i ++) {
007E 2744 CLR R20
007F C009 RJMP 0x0089
(0066) if (d & 0x01) {
0080 FF20 SBRS R18,0
0081 C002 RJMP 0x0084
(0067) IO_SET;
0082 9A96 SBI 0x12,6
(0068) }
0083 C001 RJMP 0x0085
(0069) else {
(0070) IO_CLR;
0084 9896 CBI 0x12,6
(0071) }
(0072) SCK_SET;
0085 9A95 SBI 0x12,5
(0073) SCK_CLR;
0086 9895 CBI 0x12,5
(0074) d = d >> 1;
0087 9526 LSR R18
0088 9543 INC R20
0089 3048 CPI R20,0x8
008A F3A8 BCS 0x0080
(0075) }
(0076) RST_CLR; /*停止DS1302总线*/
008B 9897 CBI 0x12,7
008C 940E0263 CALL pop_gset1
008E 9508 RET
_ds1302_read_byte:
temp --> R20
i --> R22
addr --> R16
008F 940E025E CALL push_gset2
(0077) }
(0078)
(0079) /*从DS1302读出一字节数据*/
(0080) unsigned char ds1302_read_byte(unsigned char addr) {
(0081)
(0082) unsigned char i;
(0083) unsigned char temp;
(0084) RST_SET; /*启动DS1302总线*/
0091 9A97 SBI 0x12,7
(0085)
(0086) /*写入目标地址:addr*/
(0087) IO_OUT;
0092 9A8E SBI 0x11,6
(0088) addr = addr | 0x01;/*最低位置高*/
0093 6001 ORI R16,1
(0089) for (i = 0; i < 8; i ++) {
0094 2766 CLR R22
0095 C009 RJMP 0x009F
(0090) if (addr & 0x01) {
0096 FF00 SBRS R16,0
0097 C002 RJMP 0x009A
(0091) IO_SET;
0098 9A96 SBI 0x12,6
(0092) }
0099 C001 RJMP 0x009B
(0093) else {
(0094) IO_CLR;
009A 9896 CBI 0x12,6
(0095) }
(0096) SCK_SET;
009B 9A95 SBI 0x12,5
(0097) SCK_CLR;
009C 9895 CBI 0x12,5
(0098) addr = addr >> 1;
009D 9506 LSR R16
009E 9563 INC R22
009F 3068 CPI R22,0x8
00A0 F3A8 BCS 0x0096
(0099) }
(0100)
(0101) /*输出数据:temp*/
(0102) IO_IN;
00A1 988E CBI 0x11,6
(0103) for (i = 0; i < 8; i ++) {
00A2 2766 CLR R22
00A3 C009 RJMP 0x00AD
(0104) temp = temp >> 1;
00A4 9546 LSR R20
(0105) if (IO_R) {
00A5 9B86 SBIS 0x10,6
00A6 C002 RJMP 0x00A9
(0106) temp |= 0x80;
00A7 6840 ORI R20,0x80
(0107) }
00A8 C001 RJMP 0x00AA
(0108) else {
(0109) temp &= 0x7F;
00A9 774F ANDI R20,0x7F
(0110) }
(0111) SCK_SET;
00AA 9A95 SBI 0x12,5
(0112) SCK_CLR;
00AB 9895 CBI 0x12,5
00AC 9563 INC R22
00AD 3068 CPI R22,0x8
00AE F3A8 BCS 0x00A4
(0113) }
(0114)
(0115) RST_CLR; /*停止DS1302总线*/
00AF 9897 CBI 0x12,7
(0116) return temp;
00B0 2F04 MOV R16,R20
00B1 940E0252 CALL pop_gset2
00B3 9508 RET
(0117) }
(0118)
(0119) /*向DS302写入时钟数据*/
(0120) void ds1302_write_time(void) {
(0121)
(0122) ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
_ds1302_write_time:
00B4 2722 CLR R18
00B5 E80E LDI R16,0x8E
00B6 DFB4 RCALL _ds1302_write_byte
(0123) ds1302_write_byte(ds1302_sec_add,0x80); //暂停
00B7 E820 LDI R18,0x80
00B8 E800 LDI R16,0x80
00B9 DFB1 RCALL _ds1302_write_byte
(0124) //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
(0125) ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
00BA 91200101 LDS R18,time_buf+1
00BC E80C LDI R16,0x8C
00BD DFAD RCALL _ds1302_write_byte
(0126) ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
00BE 91200102 LDS R18,time_buf+2
00C0 E808 LDI R16,0x88
00C1 DFA9 RCALL _ds1302_write_byte
(0127) ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
00C2 91200103 LDS R18,time_buf+3
00C4 E806 LDI R16,0x86
00C5 DFA5 RCALL _ds1302_write_byte
(0128) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00C6 91200107 LDS R18,0x107
00C8 E80A LDI R16,0x8A
00C9 DFA1 RCALL _ds1302_write_byte
(0129) ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
00CA 91200104 LDS R18,0x104
00CC E804 LDI R16,0x84
00CD DF9D RCALL _ds1302_write_byte
(0130) ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
00CE 91200105 LDS R18,0x105
00D0 E802 LDI R16,0x82
00D1 DF99 RCALL _ds1302_write_byte
(0131) ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
00D2 91200106 LDS R18,0x106
00D4 E800 LDI R16,0x80
00D5 DF95 RCALL _ds1302_write_byte
(0132) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00D6 91200107 LDS R18,0x107
00D8 E80A LDI R16,0x8A
00D9 DF91 RCALL _ds1302_write_byte
(0133) ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
00DA E820 LDI R18,0x80
00DB E80E LDI R16,0x8E
00DC DF8E RCALL _ds1302_write_byte
00DD 9508 RET
(0134) }
(0135)
(0136) /*从DS302读出时钟数据*/
(0137) void ds1302_read_time(void) {
(0138)
(0139) time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
_ds1302_read_time:
00DE E80C LDI R16,0x8C
00DF DFAF RCALL _ds1302_read_byte
00E0 93000101 STS time_buf+1,R16
(0140) time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
00E2 E808 LDI R16,0x88
00E3 DFAB RCALL _ds1302_read_byte
00E4 93000102 STS time_buf+2,R16
(0141) time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
00E6 E806 LDI R16,0x86
00E7 DFA7 RCALL _ds1302_read_byte
00E8 93000103 STS time_buf+3,R16
(0142) time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
00EA E804 LDI R16,0x84
00EB DFA3 RCALL _ds1302_read_byte
00EC 93000104 STS 0x104,R16
(0143) time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
00EE E802 LDI R16,0x82
00EF DF9F RCALL _ds1302_read_byte
00F0 93000105 STS 0x105,R16
(0144) time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
00F2 E800 LDI R16,0x80
00F3 DF9B RCALL _ds1302_read_byte
00F4 2F80 MOV R24,R16
00F5 778F ANDI R24,0x7F
00F6 93800106 STS 0x106,R24
(0145) time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
00F8 E80A LDI R16,0x8A
00F9 DF95 RCALL _ds1302_read_byte
00FA 93000107 STS 0x107,R16
00FC 9508 RET
(0146) }
(0147)
(0148) /*DS302初始化函数*/
(0149) void ds1302_init(void) {
(0150)
(0151) RST_CLR; /*RST脚置低*/
_ds1302_init:
00FD 9897 CBI 0x12,7
(0152) SCK_CLR; /*SCK脚置低*/
00FE 9895 CBI 0x12,5
(0153) RST_OUT; /*RST脚设置为输出*/
00FF 9A8F SBI 0x11,7
(0154) SCK_OUT; /*SCK脚设置为输出*/
0100 9A8D SBI 0x11,5
0101 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\lcd1602.c
(0001) /*
(0002) LCD1602液晶屏驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006)
(0007) AVR_AFA
(0008) www.iccavr.com
(0009) 程序编写过程中参照了peak的4线显示程序
(0010) peak:AVR论坛技术版版主
(0011) */
(0012)
(0013) #include <iom128v.h>
(0014)
(0015) #define RS_CLR PORTC &= ~(1 << PC2)
(0016) #define RS_SET PORTC |= (1 << PC2)
(0017)
(0018) #define RW_CLR PORTC &= ~(1 << PC3)
(0019) #define RW_SET PORTC |= (1 << PC3)
(0020)
(0021) #define EN_CLR PORTC &= ~(1 << PC4)
(0022) #define EN_SET PORTC |= (1 << PC4)
(0023)
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026)
(0027) if (n == 0) {
_delay_us:
n --> R16
0102 3000 CPI R16,0
0103 0701 CPC R16,R17
0104 F409 BNE 0x0106
(0028) return ;
0105 C006 RJMP 0x010C
(0029) }
(0030) while (--n);
0106 01C8 MOVW R24,R16
0107 9701 SBIW R24,1
0108 018C MOVW R16,R24
0109 3000 CPI R16,0
010A 0701 CPC R16,R17
010B F7D1 BNE 0x0106
010C 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
010D 940E025E CALL push_gset2
(0031) }
(0032)
(0033) /*延时函数*/
(0034) void delay_ms(unsigned char i) {
(0035)
(0036) unsigned char a, b;
(0037) for (a = 1; a < i; a++) {
010F E041 LDI R20,1
0110 C006 RJMP 0x0117
(0038) for (b = 1; b; b++) {
0111 E061 LDI R22,1
0112 C001 RJMP 0x0114
0113 9563 INC R22
0114 2366 TST R22
0115 F7E9 BNE 0x0113
0116 9543 INC R20
0117 1740 CP R20,R16
0118 F3C0 BCS 0x0111
0119 940E0252 CALL pop_gset2
011B 9508 RET
_LCD_write_com:
com --> R20
011C 940E0260 CALL push_gset1
011E 2F40 MOV R20,R16
(0039) ;
(0040) }
(0041) }
(0042) }
(0043)
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046)
(0047) RS_CLR;
011F 98AA CBI 0x15,2
(0048) RW_CLR;
0120 98AB CBI 0x15,3
(0049) EN_SET;
0121 9AAC SBI 0x15,4
(0050) PORTA = com;
0122 BB4B OUT 0x1B,R20
(0051) delay_us(5);
0123 E005 LDI R16,5
0124 E010 LDI R17,0
0125 DFDC RCALL _delay_us
(0052) EN_CLR;
0126 98AC CBI 0x15,4
0127 940E0263 CALL pop_gset1
0129 9508 RET
_LCD_write_data:
data --> R20
012A 940E0260 CALL push_gset1
012C 2F40 MOV R20,R16
(0053) }
(0054)
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057)
(0058) RS_SET;
012D 9AAA SBI 0x15,2
(0059) RW_CLR;
012E 98AB CBI 0x15,3
(0060) EN_SET;
012F 9AAC SBI 0x15,4
(0061) PORTA = data;
0130 BB4B OUT 0x1B,R20
(0062) delay_us(5);
0131 E005 LDI R16,5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -