📄 ds1302.lst
字号:
__text_start:
__start:
003D E5CF LDI R28,0x5F
003E E0D4 LDI R29,4
003F BFCD OUT 0x3D,R28
0040 BFDE OUT 0x3E,R29
0041 51C0 SUBI R28,0x10
0042 40D0 SBCI R29,0
0043 EA0A LDI R16,0xAA
0044 8308 STD Y+0,R16
0045 2400 CLR R0
0046 E6E3 LDI R30,0x63
0047 E0F0 LDI R31,0
0048 E010 LDI R17,0
0049 36E5 CPI R30,0x65
004A 07F1 CPC R31,R17
004B F011 BEQ 0x004E
004C 9201 ST R0,Z+
004D CFFB RJMP 0x0049
004E 8300 STD Z+0,R16
004F E7E6 LDI R30,0x76
0050 E0F0 LDI R31,0
0051 E6A0 LDI R26,0x60
0052 E0B0 LDI R27,0
0053 E010 LDI R17,0
0054 37E9 CPI R30,0x79
0055 07F1 CPC R31,R17
0056 F021 BEQ 0x005B
0057 95C8 LPM
0058 9631 ADIW R30,1
0059 920D ST R0,X+
005A CFF9 RJMP 0x0054
005B 940E0294 CALL _main
_exit:
005D CFFF RJMP _exit
FILE: D:\单片机\ds1302\ds1302_end\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:11.0592M
(0004) -----------------------------------------------------------------------*/
(0005) void delay_1us(void) //1us延时函数
(0006) {
(0007) asm("nop");
_delay_1us:
005E 0000 NOP
005F 9508 RET
_delay_nus:
i --> R20
n --> R22
0060 940E02CB CALL push_gset2
0062 01B8 MOVW R22,R16
(0008) }
(0009)
(0010) void delay_nus(unsigned int n) //N us延时函数
(0011) {
(0012) unsigned int i=0;
0063 2744 CLR R20
0064 2755 CLR R21
(0013) for (i=0;i<n;i++)
0065 C003 RJMP 0x0069
(0014) delay_1us();
0066 DFF7 RCALL _delay_1us
0067 5F4F SUBI R20,0xFF
0068 4F5F SBCI R21,0xFF
0069 1746 CP R20,R22
006A 0757 CPC R21,R23
006B F3D0 BCS 0x0066
006C 940E02BF CALL pop_gset2
006E 9508 RET
(0015) }
(0016)
(0017) void delay_1ms(void) //1ms延时函数
(0018) {
(0019) unsigned int i;
(0020) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
006F 2700 CLR R16
0070 2711 CLR R17
0071 C002 RJMP 0x0074
0072 5F0F SUBI R16,0xFF
0073 4F1F SBCI R17,0xFF
0074 3704 CPI R16,0x74
0075 E0E4 LDI R30,4
0076 071E CPC R17,R30
0077 F3D0 BCS 0x0072
0078 9508 RET
_delay_nms:
i --> R20
n --> R22
0079 940E02CB CALL push_gset2
007B 01B8 MOVW R22,R16
(0021) }
(0022)
(0023) void delay_nms(unsigned int n) //N ms延时函数
(0024) {
(0025) unsigned int i=0;
007C 2744 CLR R20
007D 2755 CLR R21
(0026) for (i=0;i<n;i++)
007E C003 RJMP 0x0082
(0027) delay_1ms();
007F DFEF RCALL _delay_1ms
0080 5F4F SUBI R20,0xFF
0081 4F5F SBCI R21,0xFF
0082 1746 CP R20,R22
0083 0757 CPC R21,R23
0084 F3D0 BCS 0x007F
0085 940E02BF CALL pop_gset2
0087 9508 RET
_delay:
i --> R20
n --> R22
0088 940E02CB CALL push_gset2
008A 01B8 MOVW R22,R16
(0028) }
(0029) void delay(uint n)//适应粘过来的延时函数
(0030) {
(0031) uint i=0;
008B 2744 CLR R20
008C 2755 CLR R21
(0032) for (i=0;i<n;i++)
008D C003 RJMP 0x0091
(0033) delay_1ms();
008E DFE0 RCALL _delay_1ms
008F 5F4F SUBI R20,0xFF
0090 4F5F SBCI R21,0xFF
0091 1746 CP R20,R22
0092 0757 CPC R21,R23
0093 F3D0 BCS 0x008E
0094 940E02BF CALL pop_gset2
0096 9508 RET
FILE: D:\单片机\ds1302\ds1302_end\1602B_LCD.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "delay.c"
(0004) #define LCD_EN_PORT PORTC
(0005) #define LCD_RS_PORT PORTC
(0006) #define LCD_DATA_PORT PORTC
(0007) #define LCD_DATA_DDR DDRC
(0008)
(0009) #define LCD_EN BIT(PC3) //portC5 out
(0010) #define LCD_RS BIT(PC2) //portC4 out
(0011) #define LCD_DATA 0xF0 //portC7/6/5/4 out
(0012) unsigned data_temp;
(0013)
(0014)
(0015) /*-----------------------------------------------------------------------
(0016) LCD_write_char : 英文字符串显示函数
(0017)
(0018) 输入参数:*s :英文字符串指针;
(0019) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0020) LCD第一行显示寄存器地址:0X80-0X8F
(0021) LCD第一行显示寄存器地址:0XC0-0XCF
(0022)
(0023) 编写日期 :2003-11-19
(0024) 最后修改日期 :2004-8-19
(0025) -----------------------------------------------------------------------*/
(0026) /*---------写高4bit到LCD----*/
(0027) void LCD_Write_half_char(void)
(0028) {
(0029) PORTC &= 0x0F; //portc0~3=0
_LCD_Write_half_char:
0097 B385 IN R24,0x15
0098 708F ANDI R24,0xF
0099 BB85 OUT 0x15,R24
(0030) PORTC |= (data_temp<<4)&0xF0; //send LOW 4bit
009A 91800063 LDS R24,data_temp
009C 91900064 LDS R25,data_temp+1
009E 0F88 LSL R24
009F 1F99 ROL R25
00A0 0F88 LSL R24
00A1 1F99 ROL R25
00A2 0F88 LSL R24
00A3 1F99 ROL R25
00A4 0F88 LSL R24
00A5 1F99 ROL R25
00A6 7F80 ANDI R24,0xF0
00A7 7090 ANDI R25,0
00A8 B225 IN R2,0x15
00A9 2433 CLR R3
00AA 2A28 OR R2,R24
00AB 2A39 OR R3,R25
00AC BA25 OUT 0x15,R2
(0031) PORTC |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
00AD 9AAB SBI 0x15,3
(0032) delay(2);
00AE E002 LDI R16,2
00AF E010 LDI R17,0
00B0 DFD7 RCALL _delay
(0033) PORTC &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
00B1 98AB CBI 0x15,3
(0034) PORTC &= 0X0F;
00B2 B385 IN R24,0x15
00B3 708F ANDI R24,0xF
00B4 BB85 OUT 0x15,R24
(0035) delay(2);
00B5 E002 LDI R16,2
00B6 E010 LDI R17,0
00B7 DFD0 RCALL _delay
00B8 9508 RET
_LCD_write_char:
data --> R20
command --> R22
00B9 940E02CB CALL push_gset2
00BB 01A9 MOVW R20,R18
00BC 01B8 MOVW R22,R16
(0036) }
(0037)
(0038) void LCD_write_char(uint command,uint data)
(0039) {
(0040) PORTC &= ~LCD_EN;
00BD 98AB CBI 0x15,3
(0041) if (command == 0)
00BE 3060 CPI R22,0
00BF 0767 CPC R22,R23
00C0 F411 BNE 0x00C3
(0042) PORTC &=~LCD_RS; //RS=0 发送命令
00C1 98AA CBI 0x15,2
00C2 C001 RJMP 0x00C4
(0043) else
(0044) PORTC |=LCD_RS; //RS=1 发送数据
00C3 9AAA SBI 0x15,2
(0045)
(0046) data_temp = data;
00C4 93500064 STS data_temp+1,R21
00C6 93400063 STS data_temp,R20
(0047) data_temp=data_temp >>4;
00C8 011A MOVW R2,R20
00C9 9436 LSR R3
00CA 9427 ROR R2
00CB 9436 LSR R3
00CC 9427 ROR R2
00CD 9436 LSR R3
00CE 9427 ROR R2
00CF 9436 LSR R3
00D0 9427 ROR R2
00D1 92300064 STS data_temp+1,R3
00D3 92200063 STS data_temp,R2
(0048) LCD_Write_half_char();
00D5 DFC1 RCALL _LCD_Write_half_char
(0049) data_temp = data;
00D6 93500064 STS data_temp+1,R21
00D8 93400063 STS data_temp,R20
(0050) LCD_Write_half_char();
00DA DFBC RCALL _LCD_Write_half_char
(0051) delay(1);
00DB E001 LDI R16,1
00DC E010 LDI R17,0
00DD DFAA RCALL _delay
00DE 940E02BF CALL pop_gset2
00E0 9508 RET
_LCD_set_xy:
address --> R20
00E1 940E02CD CALL push_gset1
00E3 2F40 MOV R20,R16
(0052) }
(0053)
(0054)
(0055) /*-----------------------------------------------------------------------
(0056) LCD_set_xy : 设置LCD显示的起始位置
(0057)
(0058) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0059) LCD第一行显示寄存器地址:0X80-0X8F
(0060) LCD第一行显示寄存器地址:0XC0-0XCF
(0061)
(0062) 编写日期 :2004-8-19
(0063) 最后修改日期 :2004-8-19
(0064) -----------------------------------------------------------------------*/
(0065)
(0066) void LCD_set_xy( unsigned char address )
(0067) {
(0068) LCD_write_char(0,address);
00E4 2F24 MOV R18,R20
00E5 2733 CLR R19
00E6 2700 CLR R16
00E7 2711 CLR R17
00E8 DFD0 RCALL _LCD_write_char
00E9 940E02D0 CALL pop_gset1
00EB 9508 RET
_LCD_write_string:
s --> R20
address --> R22
00EC 940E02CB CALL push_gset2
00EE 01A9 MOVW R20,R18
00EF 2F60 MOV R22,R16
(0069) }
(0070)
(0071) /*-----------------------------------------------------------------------
(0072) LCD_write_string : 英文字符串显示函数
(0073)
(0074) 输入参数:*s :英文字符串指针;
(0075) X、Y : 显示字符串的位置
(0076)
(0077) 编写日期 :2004-8-19
(0078) 最后修改日期 :2004-8-19
(0079) -----------------------------------------------------------------------*/
(0080) /*void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0081) {
(0082) LCD_set_xy( X, Y );
(0083)
(0084) while (*s)
(0085) {
(0086) LCD_write_char(1,*s);
(0087) s ++;
(0088) }
(0089) }*/
(0090) void LCD_write_string(unsigned char address,unsigned char *s)
(0091) {
(0092) LCD_set_xy(address);
00F0 2F06 MOV R16,R22
00F1 DFEF RCALL _LCD_set_xy
00F2 C008 RJMP 0x00FB
(0093) while (*s)
(0094) {
(0095) LCD_write_char(1,*s);
00F3 01FA MOVW R30,R20
00F4 8120 LDD R18,Z+0
00F5 2733 CLR R19
00F6 E001 LDI R16,1
00F7 E010 LDI R17,0
00F8 DFC0 RCALL _LCD_write_char
(0096) s ++;
00F9 5F4F SUBI R20,0xFF
00FA 4F5F SBCI R21,0xFF
00FB 01FA MOVW R30,R20
00FC 8020 LDD R2,Z+0
00FD 2022 TST R2
00FE F7A1 BNE 0x00F3
00FF 940E02BF CALL pop_gset2
0101 9508 RET
_LCD_write_onechar:
data --> R20
address --> R22
0102 940E02CB CALL push_gset2
0104 2F42 MOV R20,R18
0105 2F60 MOV R22,R16
(0097) }
(0098) }
(0099)
(0100) /*---------------------------------------------------------
(0101) 显示单个字符函数
(0102) 输入参数:data :'w'或字符型数据0x37(数字7的ascii码)
(0103) X、Y : 显示字符串的位置
(0104) ---------------------------------------------------------*/
(0105) /*void LCD_write_onechar(unsigned char X,unsigned char Y,unsigned char data)
(0106) {
(0107) LCD_set_xy( X, Y );
(0108) LCD_write_char( 1, data );
(0109)
(0110) } */
(0111)
(0112) void LCD_write_onechar(unsigned char address,unsigned char data)
(0113) {
(0114) LCD_set_xy( address );
0106 2F06 MOV R16,R22
0107 DFD9 RCALL _LCD_set_xy
(0115) LCD_write_char( 1, data );
0108 2F24 MOV R18,R20
0109 2733 CLR R19
010A E001 LDI R16,1
010B E010 LDI R17,0
010C DFAC RCALL _LCD_write_char
010D 940E02BF CALL pop_gset2
010F 9508 RET
(0116) }
(0117)
(0118)
(0119) void LCD_init(void)
(0120) {
(0121) LCD_write_char(0,0x38);
_LCD_init:
0110 E328 LDI R18,0x38
0111 E030 LDI R19,0
0112 2700 CLR R16
0113 2711 CLR R17
0114 DFA4 RCALL _LCD_write_char
(0122) delay(1);
0115 E001 LDI R16,1
0116 E010 LDI R17,0
0117 DF70 RCALL _delay
(0123) LCD_write_char(0,0x02);
0118 E022 LDI R18,2
0119 E030 LDI R19,0
011A 2700 CLR R16
011B 2711 CLR R17
011C DF9C RCALL _LCD_write_char
(0124) delay(1);
011D E001 LDI R16,1
011E E010 LDI R17,0
011F DF68 RCALL _delay
(0125) LCD_write_char(0,0x28); // 显示模式设置(不检测忙信号)
0120 E228 LDI R18,0x28
0121 E030 LDI R19,0
0122 2700 CLR R16
0123 2711 CLR R17
0124 DF94 RCALL _LCD_write_char
(0126) delay(1);
0125 E001 LDI R16,1
0126 E010 LDI R17,0
0127 DF60 RCALL _delay
(0127) LCD_write_char(0,0x08); // 显示关闭
0128 E028 LDI R18,0x8
0129 E030 LDI R19,0
012A 2700 CLR R16
012B 2711 CLR R17
012C DF8C RCALL _LCD_write_char
(0128) delay(1);
012D E001 LDI R16,1
012E E010 LDI R17,0
012F DF58 RCALL _delay
(0129) LCD_write_char(0,0x01); // 显示清屏
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -