📄 014.lst
字号:
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 940E0231 CALL pop_gset2
015B 9508 RET
(0111) }
(0112)
(0113) /*向DS302写入时钟数据*/
(0114) void ds1302_write_time(void) {
(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: E:\ICCAVR\project\AVRMEG~2\icc\014-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 <iom16v.h>
(0014)
(0015) #define RS_CLR PORTD &= ~(1 << PD3)
(0016) #define RS_SET PORTD |= (1 << PD3)
(0017)
(0018) #define RW_CLR PORTD &= ~(1 << PD4)
(0019) #define RW_SET PORTD |= (1 << PD4)
(0020)
(0021) #define EN_CLR PORTD &= ~(1 << PD6)
(0022) #define EN_SET PORTD |= (1 << PD6)
(0023)
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026)
(0027) if (n == 0) {
_delay_us:
n --> R16
01AA 3000 CPI R16,0
01AB 0701 CPC R16,R17
01AC F409 BNE 0x01AE
(0028) return ;
01AD C006 RJMP 0x01B4
(0029) }
(0030) 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 940E023D 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++) {
01B7 E041 LDI R20,1
01B8 C006 RJMP 0x01BF
(0038) 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 940E0231 CALL pop_gset2
01C3 9508 RET
_LCD_write_com:
com --> R20
01C4 940E023F CALL push_gset1
01C6 2F40 MOV R20,R16
(0039) ;
(0040) }
(0041) }
(0042) }
(0043)
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046)
(0047) RS_CLR;
01C7 9893 CBI 0x12,3
(0048) RW_CLR;
01C8 9894 CBI 0x12,4
(0049) EN_SET;
01C9 9A96 SBI 0x12,6
(0050) PORTB = com;
01CA BB48 OUT 0x18,R20
(0051) delay_us(5);
01CB E005 LDI R16,5
01CC E010 LDI R17,0
01CD DFDC RCALL _delay_us
(0052) EN_CLR;
01CE 9896 CBI 0x12,6
01CF 940E0242 CALL pop_gset1
01D1 9508 RET
_LCD_write_data:
data --> R20
01D2 940E023F CALL push_gset1
01D4 2F40 MOV R20,R16
(0053) }
(0054)
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057)
(0058) RS_SET;
01D5 9A93 SBI 0x12,3
(0059) RW_CLR;
01D6 9894 CBI 0x12,4
(0060) EN_SET;
01D7 9A96 SBI 0x12,6
(0061) PORTB = data;
01D8 BB48 OUT 0x18,R20
(0062) delay_us(5);
01D9 E005 LDI R16,5
01DA E010 LDI R17,0
01DB DFCE RCALL _delay_us
(0063) EN_CLR;
01DC 9896 CBI 0x12,6
01DD 940E0242 CALL pop_gset1
01DF 9508 RET
(0064) }
(0065)
(0066) /*显示屏清空显示*/
(0067) void LCD_clear(void) {
(0068)
(0069) LCD_write_com(0x01);
_LCD_clear:
01E0 E001 LDI R16,1
01E1 DFE2 RCALL _LCD_write_com
(0070) delay_ms(5);
01E2 E005 LDI R16,5
01E3 DFD1 RCALL _delay_ms
01E4 9508 RET
_LCD_write_str:
s --> R20
y --> R10
x --> R22
01E5 940E023B CALL push_gset3
01E7 2EA2 MOV R10,R18
01E8 2F60 MOV R22,R16
01E9 814E LDD R20,Y+6
01EA 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) {
01EB 20AA TST R10
01EC F421 BNE 0x01F1
(0077) LCD_write_com(0x80 + x);
01ED 2F06 MOV R16,R22
01EE 5800 SUBI R16,0x80
01EF DFD4 RCALL _LCD_write_com
(0078) }
01F0 C009 RJMP 0x01FA
(0079) else {
(0080) LCD_write_com(0xC0 + x);
01F1 2F06 MOV R16,R22
01F2 5400 SUBI R16,0x40
01F3 DFD0 RCALL _LCD_write_com
(0081) }
01F4 C005 RJMP 0x01FA
(0082)
(0083) while (*s) {
(0084) LCD_write_data( *s);
01F5 01FA MOVW R30,R20
01F6 8100 LDD R16,Z+0
01F7 DFDA RCALL _LCD_write_data
(0085) s ++;
01F8 5F4F SUBI R20,0xFF
01F9 4F5F SBCI R21,0xFF
01FA 01FA MOVW R30,R20
01FB 8020 LDD R2,Z+0
01FC 2022 TST R2
01FD F7B9 BNE 0x01F5
01FE 940E0234 CALL pop_gset3
0200 9508 RET
_LCD_write_char:
data --> Y+4
y --> R22
x --> R20
0201 940E023D CALL push_gset2
0203 2F62 MOV R22,R18
0204 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) {
0205 2366 TST R22
0206 F421 BNE 0x020B
(0093) LCD_write_com(0x80 + x);
0207 2F04 MOV R16,R20
0208 5800 SUBI R16,0x80
0209 DFBA RCALL _LCD_write_com
(0094) }
020A C003 RJMP 0x020E
(0095) else {
(0096) LCD_write_com(0xC0 + x);
020B 2F04 MOV R16,R20
020C 5400 SUBI R16,0x40
020D DFB6 RCALL _LCD_write_com
(0097) }
(0098)
(0099) LCD_write_data( data);
020E 810C LDD R16,Y+4
020F DFC2 RCALL _LCD_write_data
0210 940E0231 CALL pop_gset2
0212 9508 RET
(0100) }
(0101)
(0102) /*显示屏初始化函数*/
(0103) void LCD_init(void) {
(0104)
(0105) DDRB = 0xFF; /*I/O口方向设置*/
_LCD_init:
0213 EF8F LDI R24,0xFF
0214 BB87 OUT 0x17,R24
(0106) DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
0215 B381 IN R24,0x11
0216 6588 ORI R24,0x58
0217 BB81 OUT 0x11,R24
(0107) LCD_write_com(0x38); /*显示模式设置*/
0218 E308 LDI R16,0x38
0219 DFAA RCALL _LCD_write_com
(0108) delay_ms(5);
021A E005 LDI R16,5
021B DF99 RCALL _delay_ms
(0109) LCD_write_com(0x38);
021C E308 LDI R16,0x38
021D DFA6 RCALL _LCD_write_com
(0110) delay_ms(5);
021E E005 LDI R16,5
021F DF95 RCALL _delay_ms
(0111) LCD_write_com(0x38);
0220 E308 LDI R16,0x38
0221 DFA2 RCALL _LCD_write_com
(0112) delay_ms(5);
0222 E005 LDI R16,5
0223 DF91 RCALL _delay_ms
(0113) LCD_write_com(0x38);
0224 E308 LDI R16,0x38
0225 DF9E RCALL _LCD_write_com
(0114)
(0115) LCD_write_com(0x08); /*显示关闭*/
0226 E008 LDI R16,0x8
0227 DF9C RCALL _LCD_write_com
(0116) LCD_write_com(0x01); /*显示清屏*/
0228 E001 LDI R16,1
0229 DF9A RCALL _LCD_write_com
(0117) LCD_write_com(0x06); /*显示光标移动设置*/
022A E006 LDI R16,6
022B DF98 RCALL _LCD_write_com
(0118) delay_ms(5);
022C E005 LDI R16,5
022D DF87 RCALL _delay_ms
(0119) LCD_write_com(0x0C); /*显示开及光标设置*/
FILE: <library>
022E E00C LDI R16,0xC
022F DF94 RCALL _LCD_write_com
0230 9508 RET
pop_gset2:
0231 E0E2 LDI R30,2
0232 940C0243 JMP pop
pop_gset3:
0234 E0E4 LDI R30,4
0235 940C0243 JMP pop
push_gset5:
0237 92FA ST R15,-Y
0238 92EA ST R14,-Y
push_gset4:
0239 92DA ST R13,-Y
023A 92CA ST R12,-Y
push_gset3:
023B 92BA ST R11,-Y
023C 92AA ST R10,-Y
push_gset2:
023D 937A ST R23,-Y
023E 936A ST R22,-Y
push_gset1:
023F 935A ST R21,-Y
0240 934A ST R20,-Y
0241 9508 RET
pop_gset1:
0242 E0E1 LDI R30,1
pop:
0243 9149 LD R20,Y+
0244 9159 LD R21,Y+
0245 FDE0 SBRC R30,0
0246 9508 RET
0247 9169 LD R22,Y+
0248 9179 LD R23,Y+
0249 FDE1 SBRC R30,1
024A 9508 RET
024B 90A9 LD R10,Y+
024C 90B9 LD R11,Y+
024D FDE2 SBRC R30,2
024E 9508 RET
024F 90C9 LD R12,Y+
0250 90D9 LD R13,Y+
0251 FDE3 SBRC R30,3
0252 9508 RET
0253 90E9 LD R14,Y+
0254 90F9 LD R15,Y+
0255 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -