📄 1302-162.lst
字号:
0394 D0D8 RCALL _LCD_write_string
0395 C027 RJMP 0x03BD
(0217) case 3:LCD_write_string(0,1,"wednesday");break;
0396 E885 LDI R24,0x85
0397 E090 LDI R25,0
0398 8399 STD Y+1,R25
0399 8388 STD Y+0,R24
039A E021 LDI R18,1
039B 2700 CLR R16
039C D0D0 RCALL _LCD_write_string
039D C01F RJMP 0x03BD
(0218) case 4:LCD_write_string(0,1,"thursday");break;
039E E78C LDI R24,0x7C
039F E090 LDI R25,0
03A0 8399 STD Y+1,R25
03A1 8388 STD Y+0,R24
03A2 E021 LDI R18,1
03A3 2700 CLR R16
03A4 D0C8 RCALL _LCD_write_string
03A5 C017 RJMP 0x03BD
(0219) case 5:LCD_write_string(0,1,"friday");break;
03A6 E785 LDI R24,0x75
03A7 E090 LDI R25,0
03A8 8399 STD Y+1,R25
03A9 8388 STD Y+0,R24
03AA E021 LDI R18,1
03AB 2700 CLR R16
03AC D0C0 RCALL _LCD_write_string
03AD C00F RJMP 0x03BD
(0220) case 6:LCD_write_string(0,1,"saturday");break;
03AE E68C LDI R24,0x6C
03AF E090 LDI R25,0
03B0 8399 STD Y+1,R25
03B1 8388 STD Y+0,R24
03B2 E021 LDI R18,1
03B3 2700 CLR R16
03B4 D0B8 RCALL _LCD_write_string
03B5 C007 RJMP 0x03BD
(0221) case 7:LCD_write_string(0,1,"sunday");break;
03B6 E685 LDI R24,0x65
03B7 E090 LDI R25,0
03B8 8399 STD Y+1,R25
03B9 8388 STD Y+0,R24
03BA E021 LDI R18,1
03BB 2700 CLR R16
03BC D0B0 RCALL _LCD_write_string
(0222) }
(0223) //18b20
(0224) a=init_1820(); //复位18b20
03BD D0E5 RCALL _init_1820
03BE 870A STD Y+10,R16
(0225) write_1820(0xCC); // SKIP THE ROM
03BF EC0C LDI R16,0xCC
03C0 D0F6 RCALL _write_1820
(0226) write_1820(0x44); //启动温度转换
03C1 E404 LDI R16,0x44
03C2 D0F4 RCALL _write_1820
(0227) for(i=0;i<200;i++) //每次转换需要延时200ms以上
03C3 2766 CLR R22
03C4 C003 RJMP 0x03C8
(0228) delay(200);
03C5 EC08 LDI R16,0xC8
03C6 DC86 RCALL _delay
03C7 9563 INC R22
03C8 3C68 CPI R22,0xC8
03C9 F3D8 BCS 0x03C5
(0229) a=init_1820(); //复位18b20
03CA D0D8 RCALL _init_1820
03CB 870A STD Y+10,R16
(0230) write_1820(0xCC); //SKIP THE ROM
03CC EC0C LDI R16,0xCC
03CD D0E9 RCALL _write_1820
(0231) write_1820(0xBE); //读寄存器命令
03CE EB0E LDI R16,0xBE
03CF D0E7 RCALL _write_1820
(0232) teml=read_1820(); //读低字节数据
03D0 D109 RCALL _read_1820
03D1 2F40 MOV R20,R16
(0233) temh=read_1820(); //读高字节数据
03D2 D107 RCALL _read_1820
03D3 2EE0 MOV R14,R16
(0234) temm=teml;
03D4 2EA4 MOV R10,R20
(0235) temm&=0x0F;
03D5 2D8A MOV R24,R10
03D6 708F ANDI R24,0xF
03D7 2EA8 MOV R10,R24
(0236) teml>>=4;
03D8 2F84 MOV R24,R20
03D9 9582 SWAP R24
03DA 708F ANDI R24,0xF
03DB 2F48 MOV R20,R24
(0237) temh<<=4;
03DC 2D8E MOV R24,R14
03DD 708F ANDI R24,0xF
03DE 9582 SWAP R24
03DF 2EE8 MOV R14,R24
(0238) count=teml|temh;
03E0 2EC4 MOV R12,R20
03E1 2AC8 OR R12,R24
(0239) temh_d=count/10;
03E2 E01A LDI R17,0xA
03E3 2D0C MOV R16,R12
03E4 D158 RCALL div8u
03E5 930000A2 STS temh_d,R16
(0240) temm_d=(temm*6)/10;
03E7 2D2A MOV R18,R10
03E8 2733 CLR R19
03E9 E006 LDI R16,6
03EA E010 LDI R17,0
03EB D1C7 RCALL mpy16s
03EC E02A LDI R18,0xA
03ED E030 LDI R19,0
03EE D117 RCALL div16s
03EF 930000A0 STS temm_d,R16
(0241) teml_d=count%10;
03F1 E01A LDI R17,0xA
03F2 2D0C MOV R16,R12
03F3 D147 RCALL mod8u
03F4 930000A1 STS teml_d,R16
(0242) delay(200);
03F6 EC08 LDI R16,0xC8
03F7 DC55 RCALL _delay
(0243) LCD_set_xy(10,1);
03F8 E021 LDI R18,1
03F9 E00A LDI R16,0xA
03FA D05A RCALL _LCD_set_xy
(0244) LCD_write_char(temh_d+48);
03FB 910000A2 LDS R16,temh_d
03FD 5D00 SUBI R16,0xD0
03FE D066 RCALL _LCD_write_char
(0245) LCD_set_xy(11,1);
03FF E021 LDI R18,1
0400 E00B LDI R16,0xB
0401 D053 RCALL _LCD_set_xy
(0246) LCD_write_char(teml_d+48);
0402 910000A1 LDS R16,teml_d
0404 5D00 SUBI R16,0xD0
0405 D05F RCALL _LCD_write_char
(0247) LCD_set_xy(12,1);
0406 E021 LDI R18,1
0407 E00C LDI R16,0xC
0408 D04C RCALL _LCD_set_xy
(0248) LCD_write_char('.');
0409 E20E LDI R16,0x2E
040A D05A RCALL _LCD_write_char
(0249) LCD_set_xy(13,1);
040B E021 LDI R18,1
040C E00D LDI R16,0xD
040D D047 RCALL _LCD_set_xy
(0250) LCD_write_char(temm_d+48);
040E 910000A0 LDS R16,temm_d
0410 5D00 SUBI R16,0xD0
0411 D053 RCALL _LCD_write_char
(0251) LCD_write_string(14,1,"`C");
0412 E682 LDI R24,0x62
0413 E090 LDI R25,0
0414 8399 STD Y+1,R25
0415 8388 STD Y+0,R24
0416 E021 LDI R18,1
0417 E00E LDI R16,0xE
0418 D054 RCALL _LCD_write_string
0419 CEE6 RJMP 0x0300
041A 962D ADIW R28,0xD
041B 9508 RET
_delay_ms:
a --> R20
b --> R22
n --> R16
041C D142 RCALL push_gset2
FILE: D:\时钟芯片\1302\1302-162\162.c
(0001) #include <io8515v.h>
(0002) #include <macros.h>
(0003) #include <162-1302.h>
(0004) void delay_ms(unsigned char n)
(0005) {
(0006) unsigned char a, b;
(0007) for (a = 1; a<n; a++)
041D E041 LDI R20,1
041E C006 RJMP 0x0425
(0008) for (b = 1; b; b++)
041F E061 LDI R22,1
0420 C001 RJMP 0x0422
0421 9563 INC R22
0422 2366 TST R22
0423 F7E9 BNE 0x0421
0424 9543 INC R20
0425 1740 CP R20,R16
0426 F3C0 BCS 0x041F
0427 D12B RCALL pop_gset2
0428 9508 RET
_delay_us:
b --> R20
n --> R16
0429 D137 RCALL push_gset1
(0009) ;
(0010) }
(0011) void delay_us(unsigned int n)
(0012) {
(0013) unsigned char b;
(0014) for (b = 1; b<n; b++)
042A E041 LDI R20,1
042B C001 RJMP 0x042D
042C 9543 INC R20
042D 2E24 MOV R2,R20
042E 2433 CLR R3
042F 1620 CP R2,R16
0430 0631 CPC R3,R17
0431 F3D0 BCS 0x042C
0432 D131 RCALL pop_gset1
0433 9508 RET
(0015) ;
(0016) }
(0017)
(0018) void LCD_wait(void) //等待LCD空闲
(0019) {
(0020) LCD_DATA_PORT&=~BIT(7);
_LCD_wait:
0434 98DF CBI 0x1B,7
(0021) PORTB&=~BIT(0);
0435 98C0 CBI 0x18,0
(0022) PORTB|=BIT(1);
0436 9AC1 SBI 0x18,1
(0023) PORTB|=BIT(2);
0437 9AC2 SBI 0x18,2
(0024) while(!(LCD_DATA_PIN &0x80)==0);
0438 B389 IN R24,0x19
0439 7880 ANDI R24,0x80
043A F419 BNE 0x043E
043B E001 LDI R16,1
043C E010 LDI R17,0
043D C002 RJMP 0x0440
043E 2700 CLR R16
043F 2711 CLR R17
0440 3000 CPI R16,0
0441 0701 CPC R16,R17
0442 F3A9 BEQ 0x0438
(0025) LCD_DATA_DDR|=0xFF;
0443 B38A IN R24,0x1A
0444 6F8F ORI R24,0xFF
0445 BB8A OUT 0x1A,R24
(0026) PORTB&=~BIT(2);
0446 98C2 CBI 0x18,2
0447 9508 RET
(0027) }
(0028)
(0029) void command_enable() //写指令使能
(0030) {
(0031) PORTB&=~(BIT(0)|BIT(1));
_command_enable:
0448 B388 IN R24,0x18
0449 7F8C ANDI R24,0xFC
044A BB88 OUT 0x18,R24
(0032) PORTB|=BIT(2);
044B 9AC2 SBI 0x18,2
(0033) asm("nop");
044C 0000 NOP
(0034) PORTB&=~BIT(2);
044D 98C2 CBI 0x18,2
044E 9508 RET
(0035) }
(0036) void data_enable() //写数据使能
(0037) {
(0038) PORTB|=BIT(0);
_data_enable:
044F 9AC0 SBI 0x18,0
(0039) PORTB&=~BIT(1);
0450 98C1 CBI 0x18,1
(0040) PORTB|=BIT(2);
0451 9AC2 SBI 0x18,2
(0041) asm("nop");
0452 0000 NOP
(0042) PORTB&=~BIT(2);
0453 98C2 CBI 0x18,2
0454 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
0455 D109 RCALL push_gset2
0456 2F42 MOV R20,R18
0457 2F60 MOV R22,R16
(0043) }
(0044)
(0045) /*设置LCD显示的起始位置输入参数:x、y
(0046) 显示字符串的位置,X:0-15,Y:0-1
(0047) LCD第一行显示寄存器地址:0X80-0X8F
(0048) LCD第一行显示寄存器地址:0XC0-0XCF*/
(0049) void LCD_set_xy( unsigned char x, unsigned char y )
(0050) {
(0051) unsigned char address;
(0052) if (y==0)
0458 2344 TST R20
0459 F419 BNE 0x045D
(0053) address=0x80+x;
045A 2F46 MOV R20,R22
045B 5840 SUBI R20,0x80
045C C002 RJMP 0x045F
(0054) else
(0055) address=0xC0+x;
045D 2F46 MOV R20,R22
045E 5440 SUBI R20,0x40
(0056) LCD_DATA_PORT=address; //输入开始显示地址
045F BB4B OUT 0x1B,R20
(0057) command_enable();
0460 DFE7 RCALL _command_enable
(0058) delay_ms(10);
0461 E00A LDI R16,0xA
0462 DFB9 RCALL _delay_ms
0463 D0EF RCALL pop_gset2
0464 9508 RET
_LCD_write_char:
data --> R20
0465 D0FB RCALL push_gset1
0466 2F40 MOV R20,R16
(0059) }
(0060) //写一个字符
(0061) void LCD_write_char(unsigned char data)
(0062) {
(0063) LCD_DATA_PORT=data;
0467 BB4B OUT 0x1B,R20
(0064) data_enable();
0468 DFE6 RCALL _data_enable
(0065) delay_ms(10);
0469 E00A LDI R16,0xA
046A DFB1 RCALL _delay_ms
046B D0F8 RCALL pop_gset1
046C 9508 RET
_LCD_write_string:
s --> R20
y --> R10
x --> R22
046D D0EF RCALL push_gset3
046E 2EA2 MOV R10,R18
046F 2F60 MOV R22,R16
0470 814E LDD R20,Y+6
0471 815F LDD R21,Y+7
(0066) }
(0067) //写一字符串
(0068) void LCD_write_string(unsigned char x, unsigned char y,unsigned char *s)
(0069) {
(0070) LCD_set_xy(x,y);
0472 2D2A MOV R18,R10
0473 2F06 MOV R16,R22
0474 DFE0 RCALL _LCD_set_xy
0475 C006 RJMP 0x047C
(0071) while(*s)
(0072) {
(0073) LCD_write_char(*s);
0476 2FE4 MOV R30,R20
0477 2FF5 MOV R31,R21
0478 8100 LDD R16,Z+0
0479 DFEB RCALL _LCD_write_char
(0074) s++;
047A 5F4F SUBI R20,0xFF
047B 4F5F SBCI R21,0xFF
047C 2FE4 MOV R30,R20
047D 2FF5 MOV R31,R21
047E 8020 LDD R2,Z+0
047F 2022 TST R2
0480 F7A9 BNE 0x0476
0481 D0D3 RCALL pop_gset3
0482 9508 RET
(0075) }
(0076)
(0077) }
(0078)
(0079) void init_lcd() //初始化
(0080) {
(0081) delay_ms(180); //等待30ms以上
_init_lcd:
0483 EB04 LDI R16,0xB4
0484 DF97 RCALL _delay_ms
(0082) LCD_DATA_PORT=0x38; //8位2行5×7点阵
0485 E388 LDI R24,0x38
0486 BB8B OUT 0x1B,R24
(0083) command_enable();
0487 DFC0 RCALL _command_enable
(0084) delay_us(100); //等待39us以上
0488 E604 LDI R16,0x64
0489 E010 LDI R17,0
048A DF9E RCALL _delay_us
(0085) LCD_DATA_PORT=0x0C; //显示器开、光标开、闪烁关
048B E08C LDI R24,0xC
048C BB8B OUT 0x1B,R24
(0086) command_enable();
048D DFBA RCALL _command_enable
(0087) delay_us(100); //等待39us以上
048E E604 LDI R16,0x64
048F E010 LDI R17,0
0490 DF98 RCALL _delay_us
(0088) LCD_DATA_PORT=0x01; //清屏
0491 E081 LDI R24,1
0492 BB8B OUT 0x1B,R24
(0089) command_enable();
0493 DFB4 RCALL _command_enable
(0090) delay_ms(10); //等待1.53ms以上
0494 E00A LDI R16,0xA
0495 DF86 RCALL _delay_ms
(0091) LCD_DATA_PORT=0x06; //输入方式
0496 E086 LDI R24,6
0497 BB8B OUT 0x1B,R24
(0092) command_enable();
0498 DFAF RCALL _command_enable
(0093) delay_ms(180); //初始化完毕
0499 EB04 LDI R16,0xB4
049A DF81 RCALL _delay_ms
049B 9508 RET
FILE: D:\时钟芯片\1302\1302-162\18b20.c
(0001) #include <io8515v.h>
(0002) #include <macros.h>
(0003) #include <162-1302.h>
(0004) //时间延迟
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -