⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.lst

📁 ds1302事实时钟+12864液晶显示 4094
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -