📄 ds1302.lst
字号:
(0214) 建立日期:2007年8月26日
(0215) 修改日期:
(0216) 函数作用:显示字符前必须调用此函数
(0217) 说 明:
(0218) ********************************************************************/
(0219) void Set_Char(void)
(0220) {
(0221) W_1byte(0,0,0x30); //基本指令集,,绘图显示OFF
4F2 E380 LDI R24,0x30
4F3 8388 STD Y+0,R24
4F4 2722 CLR R18
4F5 2700 CLR R16
4F6 DF2E RCALL _W_1byte
(0222) W_1byte(0,0,0x01); //清除显示
4F7 E081 LDI R24,1
4F8 8388 STD Y+0,R24
4F9 2722 CLR R18
4FA 2700 CLR R16
4FB DF29 RCALL _W_1byte
4FC 9621 ADIW R28,1
4FD 9508 RET
_Draw_Pic:
temp_y --> R20
temp_x --> R22
i --> R10
j --> R14
Draw --> R12
y --> R10
x --> R14
4FE D1A8 RCALL push_xgsetF0FC
4FF 2EA2 MOV R10,R18
500 2EE0 MOV R14,R16
501 9721 SBIW R28,1
502 84CB LDD R12,Y+11
503 84DC LDD R13,Y+12
(0223) }
(0224)
(0225) //===================================================================*/
(0226) /********************************************************************
(0227) 函 数 名:Draw_Pic 128*64
(0228) 入口参数:x,y,*Draw
(0229) 出口参数:无
(0230) 建立日期:2007年8月26日
(0231) 修改日期:
(0232) 函数作用:
(0233) 说 明:
(0234) ********************************************************************/
(0235) /*************************************************/
(0236)
(0237) void Draw_Pic(uchar x, uchar y, uchar *Draw)
(0238) {
(0239) uchar i, j, temp_x, temp_y; //
(0240) temp_x = x; //
504 2D6E MOV R22,R14
(0241) temp_y = y; //
505 2D4A MOV R20,R10
(0242) temp_x |= 0x80; //
506 6860 ORI R22,0x80
(0243) temp_y |= 0x80; //
507 6840 ORI R20,0x80
(0244) for(i=0;i<32;i++ ) //上半屏32行
508 24AA CLR R10
509 C018 RJMP 0x0522
(0245) {
(0246) W_1byte(0,0,temp_y++); //设置绘图区的Y地址坐标0
50A 2E24 MOV R2,R20
50B 5F4F SUBI R20,0xFF
50C 8228 STD Y+0,R2
50D 2722 CLR R18
50E 2700 CLR R16
50F DF15 RCALL _W_1byte
(0247) W_1byte(0,0,temp_x); //设置绘图区的X地址坐标0
510 8368 STD Y+0,R22
511 2722 CLR R18
512 2700 CLR R16
513 DF11 RCALL _W_1byte
(0248) for(j=0;j<16;j++) //
514 24EE CLR R14
515 C008 RJMP 0x051E
(0249) {
(0250) W_1byte(0,1,*Draw++); //
516 01F6 MOVW R30,R12
517 9021 LD R2,Z+
518 016F MOVW R12,R30
519 8228 STD Y+0,R2
51A E021 LDI R18,1
51B 2700 CLR R16
51C DF08 RCALL _W_1byte
51D 94E3 INC R14
51E 2D8E MOV R24,R14
51F 3180 CPI R24,0x10
520 F3A8 BCS 0x0516
521 94A3 INC R10
522 2D8A MOV R24,R10
523 3280 CPI R24,0x20
524 F328 BCS 0x050A
(0251) }
(0252) }
(0253)
(0254) temp_x = 0x88; //
525 E868 LDI R22,0x88
(0255) temp_y = 0x80; //
526 E840 LDI R20,0x80
(0256) j = 0; //
527 24EE CLR R14
(0257) for(;i<64;i++ )
528 C018 RJMP 0x0541
(0258) {
(0259) W_1byte(0,0,temp_y++); //设置绘图区的Y地址坐标
529 2E24 MOV R2,R20
52A 5F4F SUBI R20,0xFF
52B 8228 STD Y+0,R2
52C 2722 CLR R18
52D 2700 CLR R16
52E DEF6 RCALL _W_1byte
(0260) W_1byte(0,0,temp_x); //设置绘图区的X地址坐标
52F 8368 STD Y+0,R22
530 2722 CLR R18
531 2700 CLR R16
532 DEF2 RCALL _W_1byte
(0261) for(j=0;j<16;j++)
533 24EE CLR R14
534 C008 RJMP 0x053D
(0262) {
(0263) W_1byte(0,1,*Draw++); //
535 01F6 MOVW R30,R12
536 9021 LD R2,Z+
537 016F MOVW R12,R30
538 8228 STD Y+0,R2
539 E021 LDI R18,1
53A 2700 CLR R16
53B DEE9 RCALL _W_1byte
53C 94E3 INC R14
53D 2D8E MOV R24,R14
53E 3180 CPI R24,0x10
53F F3A8 BCS 0x0535
540 94A3 INC R10
541 2D8A MOV R24,R10
542 3480 CPI R24,0x40
543 F328 BCS 0x0529
544 9621 ADIW R28,1
545 C156 RJMP pop_xgsetF0FC
_Set_White:
clr_y --> R10
clr_x --> R20
white_y --> Y,+2
white_x --> Y,+1
i --> R22
white_end_x --> R12
j --> R14
clear --> Y,+15
end_x --> Y,+13
y --> R14
x --> R22
546 D160 RCALL push_xgsetF0FC
547 2EE2 MOV R14,R18
548 2F60 MOV R22,R16
549 9723 SBIW R28,3
(0264) }
(0265) }
(0266)
(0267) }
(0268) /**************************************************/
(0269)
(0270)
(0271) //设定哪一行,从那一个位置开始到那一个位置结束使用反白
(0272) //x=液晶屏上汉字的位置(1~8);end_x=汉字结束的地址(1~8);y=1~4行
(0273) //clear=1:清除反白;clear=0:设置反白;
(0274) /**************************************************/
(0275) void Set_White(uchar x,uchar y,uchar end_x,uchar clear)
(0276) {
(0277) uchar i, j, white_x, white_y,white_end_x,clr_x,clr_y; //
(0278) white_end_x = (end_x-x+1);
54A 858D LDD R24,Y+13
54B 1B86 SUB R24,R22
54C 5F8F SUBI R24,0xFF
54D 2EC8 MOV R12,R24
(0279) white_end_x <<= 1;
54E 0CCC LSL R12
(0280) if(y==1)
54F 2D8E MOV R24,R14
550 3081 CPI R24,1
551 F449 BNE 0x055B
(0281) {
(0282) white_x = (0x80+x-1);
552 2F86 MOV R24,R22
553 5880 SUBI R24,0x80
554 5081 SUBI R24,1
555 8389 STD Y+1,R24
(0283) white_y = 0x80;
556 E880 LDI R24,0x80
557 838A STD Y+2,R24
(0284) clr_x = 0x80;
558 E840 LDI R20,0x80
(0285) clr_y = 0x80;
559 2EA8 MOV R10,R24
(0286) }
55A C023 RJMP 0x057E
(0287) else if(y==2)
55B 2D8E MOV R24,R14
55C 3082 CPI R24,2
55D F449 BNE 0x0567
(0288) {
(0289) white_x = (0x80+x-1);
55E 2F86 MOV R24,R22
55F 5880 SUBI R24,0x80
560 5081 SUBI R24,1
561 8389 STD Y+1,R24
(0290) white_y = 0x90;
562 E980 LDI R24,0x90
563 838A STD Y+2,R24
(0291) clr_x = 0x80;
564 E840 LDI R20,0x80
(0292) clr_y = 0x90;
565 2EA8 MOV R10,R24
(0293) }
566 C017 RJMP 0x057E
(0294) else if(y==3)
567 2D8E MOV R24,R14
568 3083 CPI R24,3
569 F449 BNE 0x0573
(0295) {
(0296) white_x = (0x88+x-1);
56A 2F86 MOV R24,R22
56B 5788 SUBI R24,0x78
56C 5081 SUBI R24,1
56D 8389 STD Y+1,R24
(0297) white_y = 0x80;
56E E880 LDI R24,0x80
56F 838A STD Y+2,R24
(0298) clr_x = 0x88;
570 E848 LDI R20,0x88
(0299) clr_y = 0x80;
571 2EA8 MOV R10,R24
(0300) }
572 C00B RJMP 0x057E
(0301) else if(y==4)
573 2D8E MOV R24,R14
574 3084 CPI R24,4
575 F441 BNE 0x057E
(0302) {
(0303) white_x = (0x88+x-1);
576 2F86 MOV R24,R22
577 5788 SUBI R24,0x78
578 5081 SUBI R24,1
579 8389 STD Y+1,R24
(0304) white_y = 0x90;
57A E980 LDI R24,0x90
57B 838A STD Y+2,R24
(0305) clr_x = 0x88;
57C E848 LDI R20,0x88
(0306) clr_y = 0x90;
57D 2EA8 MOV R10,R24
(0307) }
(0308) if(clear==0)//要反白时,先将整行的液晶全部清成不反白(此处行指y)
57E 840F LDD R0,Y+15
57F 2000 TST R0
580 F4E9 BNE 0x059E
(0309) {
(0310) for(i=0;i<16;i++ ) //16行
581 2766 CLR R22
582 C019 RJMP 0x059C
(0311) {
(0312) W_1byte(0,0,clr_y++); //设置绘图区的Y地址坐标0
583 2C2A MOV R2,R10
584 2D82 MOV R24,R2
585 5F8F SUBI R24,0xFF
586 2EA8 MOV R10,R24
587 8228 STD Y+0,R2
588 2722 CLR R18
589 2700 CLR R16
58A DE9A RCALL _W_1byte
(0313) W_1byte(0,0,clr_x); //设置绘图区的X地址坐标0
58B 8348 STD Y+0,R20
58C 2722 CLR R18
58D 2700 CLR R16
58E DE96 RCALL _W_1byte
(0314) for(j=0;j<16;j++) //
58F 24EE CLR R14
590 C007 RJMP 0x0598
(0315) {
(0316) W_1byte(0,1,0x00); //清成不反白
591 2422 CLR R2
592 8228 STD Y+0,R2
593 E021 LDI R18,1
594 2700 CLR R16
595 DE8F RCALL _W_1byte
(0317) asm("nop");
596 0000 NOP
597 94E3 INC R14
598 2D8E MOV R24,R14
599 3180 CPI R24,0x10
59A F3B0 BCS 0x0591
59B 9563 INC R22
59C 3160 CPI R22,0x10
59D F328 BCS 0x0583
(0318) }
(0319) }
(0320) }
(0321) asm("nop");
59E 0000 NOP
(0322) for(i=0;i<16;i++ ) //16行,因为是16*16汉字
59F 2766 CLR R22
5A0 C022 RJMP 0x05C3
(0323) {
(0324) W_1byte(0,0,white_y++); //设置绘图区的Y地址坐标0
5A1 802A LDD R2,Y+2
5A2 2D82 MOV R24,R2
5A3 5F8F SUBI R24,0xFF
5A4 838A STD Y+2,R24
5A5 8228 STD Y+0,R2
5A6 2722 CLR R18
5A7 2700 CLR R16
5A8 DE7C RCALL _W_1byte
(0325) W_1byte(0,0,white_x); //设置绘图区的X地址坐标0
5A9 8009 LDD R0,Y+1
5AA 8208 STD Y+0,R0
5AB 2722 CLR R18
5AC 2700 CLR R16
5AD DE77 RCALL _W_1byte
(0326) for(j=0;j<white_end_x;j++) //
5AE 24EE CLR R14
5AF C010 RJMP 0x05C0
(0327) {
(0328) if(clear==1)
5B0 858F LDD R24,Y+15
5B1 3081 CPI R24,1
5B2 F431 BNE 0x05B9
(0329) {
(0330) W_1byte(0,1,0x00); //取消这一行的8个点的反白,液晶地址自动加1
5B3 2422 CLR R2
5B4 8228 STD Y+0,R2
5B5 E021 LDI R18,1
5B6 2700 CLR R16
5B7 DE6D RCALL _W_1byte
(0331) //(此处行指一个一个液晶点所组成的行)
(0332) }
5B8 C005 RJMP 0x05BE
(0333) else
(0334) {
(0335) W_1byte(0,1,0xff); //反白这一行的8个点,液晶地址自动加1
5B9 EF8F LDI R24,0xFF
5BA 8388 STD Y+0,R24
5BB E021 LDI R18,1
5BC 2700 CLR R16
5BD DE67 RCALL _W_1byte
(0336) //(此处行指一个一个液晶点所组成的行)
(0337) }
(0338) asm("nop");
5BE 0000 NOP
5BF 94E3 INC R14
5C0 14EC CP R14,R12
5C1 F370 BCS 0x05B0
5C2 9563 INC R22
5C3 3160 CPI R22,0x10
5C4 F2E0 BCS 0x05A1
5C5 9623 ADIW R28,3
5C6 C0D5 RJMP pop_xgsetF0FC
_LCD_Init:
cmd --> R20
5C7 934A ST R20,-Y
5C8 9721 SBIW R28,1
(0339) }
(0340) }
(0341) }
(0342)
(0343)
(0344)
(0345)
(0346)
(0347)
(0348) //上面是通用函数,与项目有关的函数在此
(0349)
(0350) /*
(0351) void lcd_port_init(void)
(0352) {
(0353) PORTB |=((1<<CS)|(1<<SID)|(1<<SCLK)|(1<<RST)); //
(0354) DDRB |= ((1<<CS)|(1<<SID)|(1<<SCLK)|(1<<PSB)|(1<<RST)); //PB口全部设为输出模式
(0355) }
(0356)
(0357) */
(0358)
(0359) /******************************************************************/
(0360) void LCD_Init(void)
(0361) {
(0362) uchar cmd;
(0363)
(0364) //Clr_PSB();
(0365) Clr_CS();
5C9 98AD CBI 0x15,5
(0366) Clr_SID();
5CA 98AE CBI 0x15,6
(0367) Clr_SCLK();
5CB 98AF CBI 0x15,7
(0368)
(0369) cmd=0x30; //功能设置 8位数据,基本指令
5CC E340 LDI R20,0x30
(0370) W_1byte(0,0,cmd);
5CD 8348 STD Y+0,R20
5CE 2722 CLR R18
5CF 2700 CLR R16
5D0 DE54 RCALL _W_1byte
(0371) delay_1ms(2);
5D1 E002 LDI R16,2
5D2 E010 LDI R17,0
5D3 DE45 RCALL _delay_1ms
(0372) cmd=0x0C; //显示状态 ON,游标OFF,反白OFF
5D4 E04C LDI R20,0xC
(0373) W_1byte(0,0,cmd); //写指令
5D5 8348 STD Y+0,R20
5D6 2722 CLR R18
5D7 2700 CLR R16
5D8 DE4C RCALL _W_1byte
(0374) delay_1ms(2);
5D9 E002 LDI R16,2
5DA E010 LDI R17,0
5DB DE3D RCALL _delay_1ms
(0375) cmd=0x01; //清除显示
5DC E041 LDI R20,1
(0376) W_1byte(0,0,cmd); //写指令
5DD 8348 STD Y+0,R20
5DE 2722 CLR R18
5DF 2700 CLR R16
5E0 DE44 RCALL _W_1byte
(0377) delay_1ms(2);
5E1 E002 LDI R16,2
5E2 E010 LDI R17,0
5E3 DE35 RCALL _delay_1ms
(0378) cmd=0x02; //地址归位
5E4 E042 LDI R20,2
(0379) W_1byte(0,0,cmd); //写指令
5E5 8348 STD Y+0,R20
5E6 2722 CLR R18
5E7 2700 CLR R16
5E8 DE3C RCALL _W_1byte
(0380) delay_1ms(2);
5E9 E002 LDI R16,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -