📄 014.lst
字号:
(0115)
(0116) ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
_ds1302_write_time:
015C 2722 CLR R18
015D E80E LDI R16,0x8E
015E DFB4 RCALL _ds1302_write_byte
(0117) ds1302_write_byte(ds1302_sec_add,0x80); //暂停
015F E820 LDI R18,0x80
0160 E800 LDI R16,0x80
0161 DFB1 RCALL _ds1302_write_byte
(0118) //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
(0119) ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
0162 91200061 LDS R18,time_buf+1
0164 E80C LDI R16,0x8C
0165 DFAD RCALL _ds1302_write_byte
(0120) ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
0166 91200062 LDS R18,time_buf+2
0168 E808 LDI R16,0x88
0169 DFA9 RCALL _ds1302_write_byte
(0121) ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
016A 91200063 LDS R18,time_buf+3
016C E806 LDI R16,0x86
016D DFA5 RCALL _ds1302_write_byte
(0122) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
016E 91200067 LDS R18,0x67
0170 E80A LDI R16,0x8A
0171 DFA1 RCALL _ds1302_write_byte
(0123) ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
0172 91200064 LDS R18,0x64
0174 E804 LDI R16,0x84
0175 DF9D RCALL _ds1302_write_byte
(0124) ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
0176 91200065 LDS R18,0x65
0178 E802 LDI R16,0x82
0179 DF99 RCALL _ds1302_write_byte
(0125) ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
017A 91200066 LDS R18,0x66
017C E800 LDI R16,0x80
017D DF95 RCALL _ds1302_write_byte
(0126) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
017E 91200067 LDS R18,0x67
0180 E80A LDI R16,0x8A
0181 DF91 RCALL _ds1302_write_byte
(0127) ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
0182 E820 LDI R18,0x80
0183 E80E LDI R16,0x8E
0184 DF8E RCALL _ds1302_write_byte
0185 9508 RET
(0128) }
(0129)
(0130) /*从DS302读出时钟数据*/
(0131) void ds1302_read_time(void) {
(0132)
(0133) time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
_ds1302_read_time:
0186 E80C LDI R16,0x8C
0187 DFAF RCALL _ds1302_read_byte
0188 93000061 STS time_buf+1,R16
(0134) time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
018A E808 LDI R16,0x88
018B DFAB RCALL _ds1302_read_byte
018C 93000062 STS time_buf+2,R16
(0135) time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
018E E806 LDI R16,0x86
018F DFA7 RCALL _ds1302_read_byte
0190 93000063 STS time_buf+3,R16
(0136) time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
0192 E804 LDI R16,0x84
0193 DFA3 RCALL _ds1302_read_byte
0194 93000064 STS 0x64,R16
(0137) time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
0196 E802 LDI R16,0x82
0197 DF9F RCALL _ds1302_read_byte
0198 93000065 STS 0x65,R16
(0138) time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
019A E800 LDI R16,0x80
019B DF9B RCALL _ds1302_read_byte
019C 2F80 MOV R24,R16
019D 778F ANDI R24,0x7F
019E 93800066 STS 0x66,R24
(0139) time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
01A0 E80A LDI R16,0x8A
01A1 DF95 RCALL _ds1302_read_byte
01A2 93000067 STS 0x67,R16
01A4 9508 RET
(0140) }
(0141)
(0142) /*DS302初始化函数*/
(0143) void ds1302_init(void) {
(0144)
(0145) RST_CLR; /*RST脚置低*/
_ds1302_init:
01A5 98AC CBI 0x15,4
(0146) SCK_CLR; /*SCK脚置低*/
01A6 98AA CBI 0x15,2
(0147) RST_OUT; /*RST脚设置为输出*/
01A7 9AA4 SBI 0x14,4
(0148) SCK_OUT; /*SCK脚设置为输出*/
01A8 9AA2 SBI 0x14,2
01A9 9508 RET
FILE: D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\lcd1602.c
(0001) /*
(0002) LCD1602液晶屏四线驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006) 4、程序在原来基础上只使用了PB口的高四位,即PB4—PB7,PB0—PB3可以做它用
(0007)
(0008) SunnyTrip
(0009) www.iccavr.com
(0010) */
(0011)
(0012) #include <iom16v.h>
(0013)
(0014) #define RS_CLR PORTD &= ~(1 << PD3)
(0015) #define RS_SET PORTD |= (1 << PD3)
(0016)
(0017) #define RW_CLR PORTD &= ~(1 << PD4)
(0018) #define RW_SET PORTD |= (1 << PD4)
(0019)
(0020) #define EN_CLR PORTD &= ~(1 << PD6)
(0021) #define EN_SET PORTD |= (1 << PD6)
(0022)
(0023) /*延时函数*/
(0024) void delay_us(unsigned int n) {
(0025)
(0026) if (n == 0) {
_delay_us:
n --> R16
01AA 3000 CPI R16,0
01AB 0701 CPC R16,R17
01AC F409 BNE 0x01AE
(0027) return ;
01AD C006 RJMP 0x01B4
(0028) }
(0029) while (--n);
01AE 01C8 MOVW R24,R16
01AF 9701 SBIW R24,1
01B0 018C MOVW R16,R24
01B1 3000 CPI R16,0
01B2 0701 CPC R16,R17
01B3 F7D1 BNE 0x01AE
01B4 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
01B5 940E026A CALL push_gset2
(0030) }
(0031)
(0032) /*延时函数*/
(0033) void delay_ms(unsigned char i) {
(0034)
(0035) unsigned char a, b;
(0036) for (a = 1; a < i; a++) {
01B7 E041 LDI R20,1
01B8 C006 RJMP 0x01BF
(0037) for (b = 1; b; b++) {
01B9 E061 LDI R22,1
01BA C001 RJMP 0x01BC
01BB 9563 INC R22
01BC 2366 TST R22
01BD F7E9 BNE 0x01BB
01BE 9543 INC R20
01BF 1740 CP R20,R16
01C0 F3C0 BCS 0x01B9
01C1 940E025E CALL pop_gset2
01C3 9508 RET
_LCD_write_com:
com --> R20
01C4 940E026C CALL push_gset1
01C6 2F40 MOV R20,R16
(0038) ;
(0039) }
(0040) }
(0041) }
(0042)
(0043) /*显示屏命令写入函数*/
(0044) void LCD_write_com(unsigned char com) {
(0045)
(0046) RS_CLR;
01C7 9893 CBI 0x12,3
(0047) RW_CLR;
01C8 9894 CBI 0x12,4
(0048) EN_SET;
01C9 9A96 SBI 0x12,6
(0049) PORTB&=0x0f;
01CA B388 IN R24,0x18
01CB 708F ANDI R24,0xF
01CC BB88 OUT 0x18,R24
(0050) PORTB|= com&0xf0;
01CD 2F84 MOV R24,R20
01CE 7F80 ANDI R24,0xF0
01CF B228 IN R2,0x18
01D0 2A28 OR R2,R24
01D1 BA28 OUT 0x18,R2
(0051) com = com<<4;
01D2 2F84 MOV R24,R20
01D3 708F ANDI R24,0xF
01D4 9582 SWAP R24
01D5 2F48 MOV R20,R24
(0052) EN_CLR;
01D6 9896 CBI 0x12,6
(0053) delay_us(1);
01D7 E001 LDI R16,1
01D8 E010 LDI R17,0
01D9 DFD0 RCALL _delay_us
(0054) EN_SET;
01DA 9A96 SBI 0x12,6
(0055) PORTB&=0x0f;
01DB B388 IN R24,0x18
01DC 708F ANDI R24,0xF
01DD BB88 OUT 0x18,R24
(0056) PORTB|= com&0xf0;
01DE 2F84 MOV R24,R20
01DF 7F80 ANDI R24,0xF0
01E0 B228 IN R2,0x18
01E1 2A28 OR R2,R24
01E2 BA28 OUT 0x18,R2
(0057) EN_CLR;
01E3 9896 CBI 0x12,6
(0058) delay_us(1);
01E4 E001 LDI R16,1
01E5 E010 LDI R17,0
01E6 DFC3 RCALL _delay_us
01E7 940E026F CALL pop_gset1
01E9 9508 RET
_LCD_write_data:
data --> R20
01EA 940E026C CALL push_gset1
01EC 2F40 MOV R20,R16
(0059) }
(0060)
(0061) /*显示屏命令写入函数*/
(0062) void LCD_write_data(unsigned char data) {
(0063)
(0064) RS_SET;
01ED 9A93 SBI 0x12,3
(0065) RW_CLR;
01EE 9894 CBI 0x12,4
(0066) EN_SET;
01EF 9A96 SBI 0x12,6
(0067) PORTB&=0x0f;
01F0 B388 IN R24,0x18
01F1 708F ANDI R24,0xF
01F2 BB88 OUT 0x18,R24
(0068) PORTB|= data&0xf0;
01F3 2F84 MOV R24,R20
01F4 7F80 ANDI R24,0xF0
01F5 B228 IN R2,0x18
01F6 2A28 OR R2,R24
01F7 BA28 OUT 0x18,R2
(0069) data = data<<4;
01F8 2F84 MOV R24,R20
01F9 708F ANDI R24,0xF
01FA 9582 SWAP R24
01FB 2F48 MOV R20,R24
(0070) EN_CLR;
01FC 9896 CBI 0x12,6
(0071) delay_us(1);
01FD E001 LDI R16,1
01FE E010 LDI R17,0
01FF DFAA RCALL _delay_us
(0072) EN_SET;
0200 9A96 SBI 0x12,6
(0073) PORTB&=0x0f;
0201 B388 IN R24,0x18
0202 708F ANDI R24,0xF
0203 BB88 OUT 0x18,R24
(0074) PORTB|= data&0xf0;
0204 2F84 MOV R24,R20
0205 7F80 ANDI R24,0xF0
0206 B228 IN R2,0x18
0207 2A28 OR R2,R24
0208 BA28 OUT 0x18,R2
(0075) EN_CLR;
0209 9896 CBI 0x12,6
020A 940E026F CALL pop_gset1
020C 9508 RET
(0076) }
(0077)
(0078) /*显示屏清空显示*/
(0079) void LCD_clear(void) {
(0080)
(0081) LCD_write_com(0x01);
_LCD_clear:
020D E001 LDI R16,1
020E DFB5 RCALL _LCD_write_com
(0082) delay_ms(5);
020F E005 LDI R16,5
0210 DFA4 RCALL _delay_ms
0211 9508 RET
_LCD_write_str:
s --> R20
y --> R10
x --> R22
0212 940E0268 CALL push_gset3
0214 2EA2 MOV R10,R18
0215 2F60 MOV R22,R16
0216 814E LDD R20,Y+6
0217 815F LDD R21,Y+7
(0083) }
(0084)
(0085) /*显示屏字符串写入函数*/
(0086) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0087)
(0088) if (y == 0) {
0218 20AA TST R10
0219 F421 BNE 0x021E
(0089) LCD_write_com(0x80 + x);
021A 2F06 MOV R16,R22
021B 5800 SUBI R16,0x80
021C DFA7 RCALL _LCD_write_com
(0090) }
021D C009 RJMP 0x0227
(0091) else {
(0092) LCD_write_com(0xC0 + x);
021E 2F06 MOV R16,R22
021F 5400 SUBI R16,0x40
0220 DFA3 RCALL _LCD_write_com
(0093) }
0221 C005 RJMP 0x0227
(0094)
(0095) while (*s) {
(0096) LCD_write_data( *s);
0222 01FA MOVW R30,R20
0223 8100 LDD R16,Z+0
0224 DFC5 RCALL _LCD_write_data
(0097) s ++;
0225 5F4F SUBI R20,0xFF
0226 4F5F SBCI R21,0xFF
0227 01FA MOVW R30,R20
0228 8020 LDD R2,Z+0
0229 2022 TST R2
022A F7B9 BNE 0x0222
022B 940E0261 CALL pop_gset3
022D 9508 RET
_LCD_write_char:
data --> Y+4
y --> R22
x --> R20
022E 940E026A CALL push_gset2
0230 2F62 MOV R22,R18
0231 2F40 MOV R20,R16
(0098) }
(0099) }
(0100)
(0101) /*显示屏单字符写入函数*/
(0102) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0103)
(0104) if (y == 0) {
0232 2366 TST R22
0233 F421 BNE 0x0238
(0105) LCD_write_com(0x80 + x);
0234 2F04 MOV R16,R20
0235 5800 SUBI R16,0x80
0236 DF8D RCALL _LCD_write_com
(0106) }
0237 C003 RJMP 0x023B
(0107) else {
(0108) LCD_write_com(0xC0 + x);
0238 2F04 MOV R16,R20
0239 5400 SUBI R16,0x40
023A DF89 RCALL _LCD_write_com
(0109) }
(0110)
(0111) LCD_write_data( data);
023B 810C LDD R16,Y+4
023C DFAD RCALL _LCD_write_data
023D 940E025E CALL pop_gset2
023F 9508 RET
(0112) }
(0113)
(0114) /*显示屏初始化函数*/
(0115) void LCD_init(void) {
(0116)
(0117) DDRB = 0xFF; /*I/O口方向设置*/
_LCD_init:
0240 EF8F LDI R24,0xFF
0241 BB87 OUT 0x17,R24
(0118) DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
0242 B381 IN R24,0x11
0243 6588 ORI R24,0x58
0244 BB81 OUT 0x11,R24
(0119) LCD_write_com(0x28); /*显示模式设置*/
0245 E208 LDI R16,0x28
0246 DF7D RCALL _LCD_write_com
(0120) delay_ms(15);
0247 E00F LDI R16,0xF
0248 DF6C RCALL _delay_ms
(0121) LCD_write_com(0x28);
0249 E208 LDI R16,0x28
024A DF79 RCALL _LCD_write_com
(0122) delay_ms(5);
024B E005 LDI R16,5
024C DF68 RCALL _delay_ms
(0123) LCD_write_com(0x28);
024D E208 LDI R16,0x28
024E DF75 RCALL _LCD_write_com
(0124) delay_ms(5);
024F E005 LDI R16,5
0250 DF64 RCALL _delay_ms
(0125) LCD_write_com(0x28);
0251 E208 LDI R16,0x28
0252 DF71 RCALL _LCD_write_com
(0126)
(0127) LCD_write_com(0x08); /*显示关闭*/
0253 E008 LDI R16,0x8
0254 DF6F RCALL _LCD_write_com
(0128) LCD_write_com(0x01); /*显示清屏*/
0255 E001 LDI R16,1
0256 DF6D RCALL _LCD_write_com
(0129) LCD_write_com(0x06); /*显示光标移动设置*/
0257 E006 LDI R16,6
0258 DF6B RCALL _LCD_write_com
(0130) delay_ms(5);
0259 E005 LDI R16,5
025A DF5A RCALL _delay_ms
(0131) LCD_write_com(0x0C); /*显示开及光标设置*/
FILE: <library>
025B E00C LDI R16,0xC
025C DF67 RCALL _LCD_write_com
025D 9508 RET
pop_gset2:
025E E0E2 LDI R30,2
025F 940C0270 JMP pop
pop_gset3:
0261 E0E4 LDI R30,4
0262 940C0270 JMP pop
push_gset5:
0264 92FA ST R15,-Y
0265 92EA ST R14,-Y
push_gset4:
0266 92DA ST R13,-Y
0267 92CA ST R12,-Y
push_gset3:
0268 92BA ST R11,-Y
0269 92AA ST R10,-Y
push_gset2:
026A 937A ST R23,-Y
026B 936A ST R22,-Y
push_gset1:
026C 935A ST R21,-Y
026D 934A ST R20,-Y
026E 9508 RET
pop_gset1:
026F E0E1 LDI R30,1
pop:
0270 9149 LD R20,Y+
0271 9159 LD R21,Y+
0272 FDE0 SBRC R30,0
0273 9508 RET
0274 9169 LD R22,Y+
0275 9179 LD R23,Y+
0276 FDE1 SBRC R30,1
0277 9508 RET
0278 90A9 LD R10,Y+
0279 90B9 LD R11,Y+
027A FDE2 SBRC R30,2
027B 9508 RET
027C 90C9 LD R12,Y+
027D 90D9 LD R13,Y+
027E FDE3 SBRC R30,3
027F 9508 RET
0280 90E9 LD R14,Y+
0281 90F9 LD R15,Y+
0282 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -