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

📄 lly.lst

📁 12864液晶显示程序 带中文字库 可以画图 写汉字
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    047E EFCF      LDI	R28,0xFF
    047F E1D0      LDI	R29,0x10
    0480 BFCD      OUT	P3D,R28
    0481 BFDE      OUT	P3E,R29
    0482 51C0      SUBI	R28,0x10
    0483 40D0      SBCI	R29,0
    0484 EA0A      LDI	R16,0xAA
    0485 8308      STD	R16,0+Y
    0486 2400      CLR	R0
    0487 E7E0      LDI	R30,0x70
    0488 E0F1      LDI	R31,1
    0489 E011      LDI	R17,1
    048A 37E8      CPI	R30,0x78
    048B 07F1      CPC	R31,R17
    048C F011      BEQ	0x048F
    048D 9201      ST	R0,Z+
    048E CFFB      RJMP	0x048A
    048F 8300      STD	R16,0+Z
    0490 E8EC      LDI	R30,0x8C
    0491 E0F8      LDI	R31,0x8
    0492 E0A0      LDI	R26,0
    0493 E0B1      LDI	R27,1
    0494 E018      LDI	R17,0x8
    0495 3FEC      CPI	R30,0xFC
    0496 07F1      CPC	R31,R17
    0497 F021      BEQ	0x049C
    0498 95C8      LPM
    0499 9631      ADIW	R30,1
    049A 920D      ST	R0,X+
    049B CFF9      RJMP	0x0495
    049C 940E0686  CALL	_main
_exit:
    049E CFFF      RJMP	_exit
FILE: E:\PQ-1A\我的AVR\12864LLY\lcd12864.h
(0001) 
(0002) /************************串行工作**************************/
(0003) 
(0004) #define CS_H   PORTC|=(1<<0)
(0005) #define CS_L   PORTC&=~(1<<0)
(0006) #define STD_H  PORTC|=(1<<2)
(0007) #define STD_L  PORTC&=~(1<<2)
(0008) #define SCLK_H PORTC|=(1<<4)
(0009) #define SCLK_L PORTC&=~(1<<4)
(0010) 
(0011) //	显示用指针变量
(0012)  char *line1;
(0013)  char *line2;
(0014)  char *line3;
(0015)  char *line4;
(0016) 
(0017) 
(0018) 
(0019) 
(0020)  /*****************************************
(0021) 液晶初始化程序
(0022) 
(0023) *****************************************/
(0024) void lcd12864_init(void)
(0025) {
(0026) 	DDRC|=BIT(0)|BIT(2)|BIT(4);
_lcd12864_init:
    049F B384      IN	R24,P14
    04A0 6185      ORI	R24,0x15
    04A1 BB84      OUT	P14,R24
(0027) 	PORTC=0X00;      //IO端口初始化	
    04A2 2422      CLR	R2
    04A3 BA25      OUT	P15,R2
(0028) 	DDRG|=BIT(2);
    04A4 91800064  LDS	R24,0x64
    04A6 6084      ORI	R24,4
    04A7 93800064  STS	R24,0x64
(0029) 	//PORTG=0XFF;
(0030) 	PORTG &=~(1<<2);  //串行
    04A9 91800065  LDS	R24,0x65
    04AB 7F8B      ANDI	R24,0xFB
    04AC 93800065  STS	R24,0x65
(0031) 	delay_ms(6);
    04AE E006      LDI	R16,6
    04AF E010      LDI	R17,0
    04B0 D1C6      RCALL	_delay_ms
(0032) 
(0033) 	write_com(0X30);        //基本指令动作
    04B1 E300      LDI	R16,0x30
    04B2 E010      LDI	R17,0
    04B3 D028      RCALL	_write_com
(0034) 	write_com(0X01);	    //清屏,地址指针指向00H
    04B4 E001      LDI	R16,1
    04B5 E010      LDI	R17,0
    04B6 D025      RCALL	_write_com
(0035) 	delay_ms(6);
    04B7 E006      LDI	R16,6
    04B8 E010      LDI	R17,0
    04B9 D1BD      RCALL	_delay_ms
(0036) 	write_com(0X0C);        //开显示,关游标  
    04BA E00C      LDI	R16,0xC
    04BB E010      LDI	R17,0
    04BC D01F      RCALL	_write_com
(0037) 	delay_ms(5);
    04BD E005      LDI	R16,5
    04BE E010      LDI	R17,0
(0038) }
    04BF C1B7      RJMP	_delay_ms
(0039)  
(0040)  
(0041) void clear_dis(void)
(0042)  {
(0043)    write_com(0x30);
_clear_dis:
    04C0 E300      LDI	R16,0x30
    04C1 E010      LDI	R17,0
    04C2 D019      RCALL	_write_com
(0044)    write_com(0X01);	 //清屏,地址指针指向00H
    04C3 E001      LDI	R16,1
    04C4 E010      LDI	R17,0
    04C5 D016      RCALL	_write_com
(0045)    delay_ms(10);
    04C6 E00A      LDI	R16,0xA
    04C7 E010      LDI	R17,0
(0046)  }
    04C8 C1AE      RJMP	_delay_ms
_write_byte:
  i                    --> R20
  word                 --> R16
    04C9 940E06FA  CALL	push_gset1
(0047)  
(0048)  
(0049) /*****************************************
(0050) 液晶发送子程序(串行)
(0051) 
(0052) *****************************************/
(0053) void write_byte(unsigned char word)
(0054) {
(0055) 	unsigned char i;
(0056) 	for(i=0;i<8;i++)
    04CB 2744      CLR	R20
    04CC C00A      RJMP	0x04D7
(0057) 	   {
(0058) 	    SCLK_L;
    04CD 98AC      CBI	P15,4
(0059) 		if(word & 0x80)  STD_H;
    04CE FF07      SBRS	R16,7
    04CF C002      RJMP	0x04D2
    04D0 9AAA      SBI	P15,2
    04D1 C001      RJMP	0x04D3
(0060) 		 else            STD_L;
    04D2 98AA      CBI	P15,2
(0061) 		word<<=1;
    04D3 0F00      LSL	R16
(0062) 		SCLK_H;
    04D4 9AAC      SBI	P15,4
(0063) 		SCLK_L;
    04D5 98AC      CBI	P15,4
    04D6 9543      INC	R20
    04D7 3048      CPI	R20,0x8
    04D8 F3A0      BCS	0x04CD
(0064) 	   }
(0065) }
    04D9 940E06FD  CALL	pop_gset1
    04DB 9508      RET
_write_com:
  com                  --> R20
    04DC 940E06FA  CALL	push_gset1
    04DE 2F40      MOV	R20,R16
(0066) /*****************************************
(0067) 液晶写控制字程序
(0068) 
(0069) *****************************************/
(0070) void write_com(unsigned char com)
(0071) {
(0072) 	CS_H;
    04DF 9AA8      SBI	P15,0
(0073) 	delay_ms(1);
    04E0 E001      LDI	R16,1
    04E1 E010      LDI	R17,0
    04E2 D194      RCALL	_delay_ms
(0074) 	write_byte(0XF8);
    04E3 EF08      LDI	R16,0xF8
    04E4 DFE4      RCALL	_write_byte
(0075) 	write_byte(com & 0XF0);
    04E5 2F04      MOV	R16,R20
    04E6 7F00      ANDI	R16,0xF0
    04E7 DFE1      RCALL	_write_byte
(0076) 	write_byte((com<<4) & 0XF0);
    04E8 2F04      MOV	R16,R20
    04E9 700F      ANDI	R16,0xF
    04EA 9502      SWAP	R16
    04EB 7F00      ANDI	R16,0xF0
    04EC DFDC      RCALL	_write_byte
(0077) 	CS_L;
    04ED 98A8      CBI	P15,0
(0078) }
    04EE 940E06FD  CALL	pop_gset1
    04F0 9508      RET
_write_data:
  data                 --> R20
    04F1 940E06FA  CALL	push_gset1
    04F3 2F40      MOV	R20,R16
(0079) /*****************************************
(0080) 液晶写数据字程序
(0081) 
(0082) *****************************************/
(0083) void write_data(unsigned char data)
(0084) {
(0085) 	CS_H;
    04F4 9AA8      SBI	P15,0
(0086) 	delay_ms(1);
    04F5 E001      LDI	R16,1
    04F6 E010      LDI	R17,0
    04F7 D17F      RCALL	_delay_ms
(0087) 	write_byte(0XFA);
    04F8 EF0A      LDI	R16,0xFA
    04F9 DFCF      RCALL	_write_byte
(0088) 	write_byte(data&0XF0);
    04FA 2F04      MOV	R16,R20
    04FB 7F00      ANDI	R16,0xF0
    04FC DFCC      RCALL	_write_byte
(0089) 	write_byte((data<<4)&0XF0);
    04FD 2F04      MOV	R16,R20
    04FE 700F      ANDI	R16,0xF
    04FF 9502      SWAP	R16
    0500 7F00      ANDI	R16,0xF0
    0501 DFC7      RCALL	_write_byte
(0090) 	CS_L;
    0502 98A8      CBI	P15,0
(0091) }
    0503 940E06FD  CALL	pop_gset1
    0505 9508      RET
_lcd_writexy:
  str                  --> R20
  y                    --> R22
  x                    --> R10
    0506 940E0715  CALL	push_gset3
    0508 2F62      MOV	R22,R18
    0509 2EA0      MOV	R10,R16
    050A 814E      LDD	R20,6+Y
    050B 815F      LDD	R21,7+Y
(0092) 
(0093) //指定位置写文字
(0094) void lcd_writexy(unsigned char x,unsigned char y,unsigned char *str)
(0095) {
(0096)   switch(x)
    050C 24BB      CLR	R11
    050D 01C5      MOVW	R24,R10
    050E 3081      CPI	R24,1
    050F E0E0      LDI	R30,0
    0510 079E      CPC	R25,R30
    0511 F069      BEQ	0x051F
    0512 3082      CPI	R24,2
    0513 E0E0      LDI	R30,0
    0514 079E      CPC	R25,R30
    0515 F069      BEQ	0x0523
    0516 3083      CPI	R24,3
    0517 E0E0      LDI	R30,0
    0518 079E      CPC	R25,R30
    0519 F069      BEQ	0x0527
    051A 3084      CPI	R24,4
    051B E0E0      LDI	R30,0
    051C 079E      CPC	R25,R30
    051D F069      BEQ	0x052B
    051E C015      RJMP	0x0534
(0097)     {
(0098) 	 case 1: write_com(0x80+y);break;
    051F 2F06      MOV	R16,R22
    0520 5800      SUBI	R16,0x80
    0521 DFBA      RCALL	_write_com
    0522 C011      RJMP	0x0534
(0099) 	 case 2: write_com(0x90+y);break;
    0523 2F06      MOV	R16,R22
    0524 5700      SUBI	R16,0x70
    0525 DFB6      RCALL	_write_com
    0526 C00D      RJMP	0x0534
(0100) 	 case 3: write_com(0x88+y);break;
    0527 2F06      MOV	R16,R22
    0528 5708      SUBI	R16,0x78
    0529 DFB2      RCALL	_write_com
    052A C009      RJMP	0x0534
(0101) 	 case 4: write_com(0x98+y);break;
    052B 2F06      MOV	R16,R22
    052C 5608      SUBI	R16,0x68
    052D DFAE      RCALL	_write_com
    052E C005      RJMP	0x0534
(0102) 	}
(0103) 
(0104)   while( *str!=0x00 )
(0105) 	{
(0106) 		write_data(*str);
    052F 01FA      MOVW	R30,R20
    0530 8100      LDD	R16,0+Z
    0531 DFBF      RCALL	_write_data
(0107) 		*str++;
    0532 5F4F      SUBI	R20,0xFF
    0533 4F5F      SBCI	R21,0xFF
    0534 01FA      MOVW	R30,R20
    0535 8020      LDD	R2,0+Z
    0536 2022      TST	R2
    0537 F7B9      BNE	0x052F
(0108) 	}
(0109) }
    0538 940E0724  CALL	pop_gset3
    053A 9508      RET
(0110) 
(0111) /*****************************************
(0112) 液晶整行显示函数程序
(0113) 
(0114) *****************************************/
(0115) void display(void)
(0116) {
(0117) 	write_com(0x80);
_display:
    053B E800      LDI	R16,0x80
    053C DF9F      RCALL	_write_com
    053D C00F      RJMP	0x054D
(0118) 	while( *line1!=0x00 )
(0119) 	{
(0120) 		write_data(*line1);
    053E 91E00176  LDS	R30,_line1
    0540 91F00177  LDS	R31,_line1+1
    0542 8100      LDD	R16,0+Z
    0543 DFAD      RCALL	_write_data
(0121) 		line1++;
    0544 91800176  LDS	R24,_line1
    0546 91900177  LDS	R25,_line1+1
    0548 9601      ADIW	R24,1
    0549 93900177  STS	R25,_line1+1
    054B 93800176  STS	R24,_line1
    054D 91E00176  LDS	R30,_line1
    054F 91F00177  LDS	R31,_line1+1
    0551 8020      LDD	R2,0+Z
    0552 2022      TST	R2
    0553 F751      BNE	0x053E
(0122) 	}
(0123) 
(0124) 	write_com(0x90);
    0554 E900      LDI	R16,0x90
    0555 DF86      RCALL	_write_com
    0556 C00F      RJMP	0x0566
(0125) 	while( *line2!=0x00 )
(0126) 	{
(0127) 		write_data(*line2);
    0557 91E00174  LDS	R30,_line2
    0559 91F00175  LDS	R31,_line2+1
    055B 8100      LDD	R16,0+Z
    055C DF94      RCALL	_write_data
(0128) 		line2++;
    055D 91800174  LDS	R24,_line2
    055F 91900175  LDS	R25,_line2+1
    0561 9601      ADIW	R24,1
    0562 93900175  STS	R25,_line2+1
    0564 93800174  STS	R24,_line2
    0566 91E00174  LDS	R30,_line2
    0568 91F00175  LDS	R31,_line2+1
    056A 8020      LDD	R2,0+Z
    056B 2022      TST	R2
    056C F751      BNE	0x0557
(0129) 	}
(0130) 
(0131) 	write_com(0x88);
    056D E808      LDI	R16,0x88
    056E DF6D      RCALL	_write_com
    056F C00F      RJMP	0x057F
(0132) 	while( *line3!=0x00 )
(0133) 	{
(0134) 		write_data(*line3);
    0570 91E00172  LDS	R30,_line3
    0572 91F00173  LDS	R31,_line3+1
    0574 8100      LDD	R16,0+Z
    0575 DF7B      RCALL	_write_data
(0135) 		line3++;
    0576 91800172  LDS	R24,_line3
    0578 91900173  LDS	R25,_line3+1
    057A 9601      ADIW	R24,1
    057B 93900173  STS	R25,_line3+1
    057D 93800172  STS	R24,_line3
    057F 91E00172  LDS	R30,_line3
    0581 91F00173  LDS	R31,_line3+1
    0583 8020      LDD	R2,0+Z
    0584 2022      TST	R2
    0585 F751      BNE	0x0570
(0136) 	}
(0137) 
(0138) 	write_com(0x98);
    0586 E908      LDI	R16,0x98
    0587 DF54      RCALL	_write_com
    0588 C00F      RJMP	0x0598
(0139) 	while( *line4!=0x00 )
(0140) 	{
(0141) 		write_data(*line4);
    0589 91E00170  LDS	R30,_line4
    058B 91F00171  LDS	R31,_line4+1
    058D 8100      LDD	R16,0+Z
    058E DF62      RCALL	_write_data
(0142) 		line4++;
    058F 91800170  LDS	R24,_line4
    0591 91900171  LDS	R25,_line4+1
    0593 9601      ADIW	R24,1
    0594 93900171  STS	R25,_line4+1
    0596 93800170  STS	R24,_line4
    0598 91E00170  LDS	R30,_line4
    059A 91F00171  LDS	R31,_line4+1
    059C 8020      LDD	R2,0+Z
    059D 2022      TST	R2
    059E F751      BNE	0x0589
(0143) 	}
(0144) 	line1 = "";
    059F E68F      LDI	R24,0x6F
    05A0 E091      LDI	R25,1
    05A1 93900177  STS	R25,_line1+1
    05A3 93800176  STS	R24,_line1
(0145)     line2 = "";
    05A5 93900175  STS	R25,_line2+1
    05A7 93800174  STS	R24,_line2
(0146)     line3 = "";
    05A9 93900173  STS	R25,_line3+1
    05AB 93800172  STS	R24,_line3
(0147)     line4 = "";
    05AD 93900171  STS	R25,_line4+1
    05AF 93800170  STS	R24,_line4
(0148) }
    05B1 9508      RET
_clear_disp_pic:
  j                    --> R20
  i                    --> R22
    05B2 940E0711  CALL	push_gset2
(0149) 
(0150) 
(0151) /*****************************************
(0152) 液晶画图清屏程序
(0153) 
(0154) *****************************************/
(0155) void clear_disp_pic(void)
(0156) {
(0157)   unsigned char i,j=0; 
    05B4 2744      CLR	R20
(0158)   for(j=0;j<32;j++)
    05B5 C014      RJMP	0x05CA
(0159)   {
(0160)     for(i=0;i<16;i++)
    05B6 2766      CLR	R22
    05B7 C00F      RJMP	0x05C7
(0161)     {
(0162)       write_com(0X34);//选择四位数据接口,扩充指令操作
    05B8 E304      LDI	R16,0x34
    05B9 DF22      RCALL	_write_com
(0163)       write_com(0x80+j);//四行
    05BA 2F04      MOV	R16,R20
    05BB 5800      SUBI	R16,0x80
    05BC DF1F      RCALL	_write_com
(0164)       write_com(0x80+i);//十六列
    05BD 2F06      MOV	R16,R22
    05BE 5800      SUBI	R16,0x80
    05BF DF1C      RCALL	_write_com
(0165)       write_com(0X30);
    05C0 E300      LDI	R16,0x30
    05C1 DF1A      RCALL	_write_com
(0166)       write_data(0x00);
    05C2 2700      CLR	R16
    05C3 DF2D      RCALL	_write_data
(0167)       write_data(0x00);
    05C4 2700      CLR	R16
    05C5 DF2B      RCALL	_write_data
    05C6 9563      INC	R22
    05C7 3160      CPI	R22,0x10
    05C8 F378      BCS	0x05B8
    05C9 9543      INC	R20
    05CA 3240      CPI	R20,0x20
    05CB F350      BCS	0x05B6
(0168)     }
(0169)   }
(0170) }
    05CC 940E0721  CALL	pop_gset2
    05CE 9508      RET
_disp_pic:
  j                    --> R20
  i                    --> R22
  img                  --> R10
    05CF 940E0715  CALL	push_gset3
    05D1 0158      MOVW	R10,R16
(0171) /*****************************************
(0172) 液晶显示图形程序
(0173) 
(0174) *****************************************/
(0175) void disp_pic(const unsigned char *img )
(0176) {
(0177)   unsigned char i,j;  
(0178)   for(j=0;j<32;j++)
    05D2 2744      CLR	R20
    05D3 C029      RJMP	0x05FD
(0179)   {
(0180)     for(i=0;i<8;i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -