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

📄 test.lst

📁 用ATmega88驱动LCD240128
💻 LST
📖 第 1 页 / 共 4 页
字号:
    04FF F411      BNE	0x0502
    0500 2700      CLR	R16
    0501 C001      RJMP	0x0503
(0041)     else                                      return(1);
    0502 E001      LDI	R16,1
    0503 9508      RET
(0042) }
(0043) /*******************************************************************************
(0044)  读LCD状态
(0045) *******************************************************************************/
(0046) unsigned char LCD_RD_STATUS(void)
(0047) {
(0048)     unsigned char temp;
(0049)     LCD_DDR = 0x00;
_LCD_RD_STATUS:
  temp                 --> R16
    0504 2422      CLR	R2
    0505 B82A      OUT	0x0A,R2
(0050)     LCD_CD_H;
    0506 9A28      SBI	0x05,0
(0051)     LCD_RD_L;
    0507 982A      CBI	0x05,2
(0052) 	NOP();NOP();NOP();
    0508 0000      NOP
    0509 0000      NOP
    050A 0000      NOP
(0053)     temp = LCD_DATA;
    050B B109      IN	R16,0x09
(0054)     LCD_RD_H;
    050C 9A2A      SBI	0x05,2
(0055)     LCD_DDR = 0xFF;
    050D EF8F      LDI	R24,0xFF
    050E B98A      OUT	0x0A,R24
(0056)     return(temp);
    050F 9508      RET
(0057) }
(0058) /*******************************************************************************
(0059)  读LCD数据
(0060) *******************************************************************************/
(0061) unsigned char LCD_RD_DATA(void)
(0062) {
(0063)     unsigned char temp;
(0064)     LCD_DDR = 0x00;
_LCD_RD_DATA:
  temp                 --> R16
    0510 2422      CLR	R2
    0511 B82A      OUT	0x0A,R2
(0065)     LCD_CD_L; 
    0512 9828      CBI	0x05,0
(0066)     LCD_RD_L;
    0513 982A      CBI	0x05,2
(0067) 	NOP();NOP();NOP();
    0514 0000      NOP
    0515 0000      NOP
    0516 0000      NOP
(0068)     temp = LCD_DATA;
    0517 B109      IN	R16,0x09
(0069)     LCD_RD_H;
    0518 9A2A      SBI	0x05,2
(0070)     LCD_DDR = 0xFF;
    0519 EF8F      LDI	R24,0xFF
    051A B98A      OUT	0x0A,R24
(0071)     return(temp);
    051B 9508      RET
_LCD_WR_DATA:
  data                 --> R20
    051C D323      RCALL	push_gset1
    051D 2F40      MOV	R20,R16
(0072) }
(0073) /*******************************************************************************
(0074)  写数据 
(0075) *******************************************************************************/
(0076) void LCD_WR_DATA(unsigned char data)
(0077) {
(0078)     while( fnSTA01() );	
    051E DFC1      RCALL	_fnSTA01
    051F 2300      TST	R16
    0520 F7E9      BNE	0x051E
(0079) 	LCD_CD_L;
    0521 9828      CBI	0x05,0
(0080)     LCD_WR_L;
    0522 9829      CBI	0x05,1
(0081)   //LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
(0082)     LCD_PORT = data;
    0523 B94B      OUT	0x0B,R20
(0083)     LCD_WR_H;
    0524 9A29      SBI	0x05,1
    0525 D31D      RCALL	pop_gset1
    0526 9508      RET
_LCD_WR_CODE:
  code                 --> R20
    0527 D318      RCALL	push_gset1
    0528 2F40      MOV	R20,R16
(0084) }
(0085) /*******************************************************************************
(0086)  写无参数命令 
(0087) *******************************************************************************/
(0088) void LCD_WR_CODE(unsigned char code)
(0089) {
(0090)     while( fnSTA01() );	
    0529 DFB6      RCALL	_fnSTA01
    052A 2300      TST	R16
    052B F7E9      BNE	0x0529
(0091)     LCD_CD_H;
    052C 9A28      SBI	0x05,0
(0092)     LCD_WR_L;
    052D 9829      CBI	0x05,1
(0093)   //LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
(0094)     LCD_PORT = code;
    052E B94B      OUT	0x0B,R20
(0095)     LCD_WR_H;
    052F 9A29      SBI	0x05,1
    0530 D312      RCALL	pop_gset1
    0531 9508      RET
_LCD_WR_CODE1:
  data1                --> R22
  code                 --> R20
    0532 D30B      RCALL	push_gset2
    0533 2F62      MOV	R22,R18
    0534 2F40      MOV	R20,R16
(0096) }
(0097) /*******************************************************************************
(0098)  写单参数的指令 
(0099) *******************************************************************************/
(0100) void LCD_WR_CODE1(unsigned char code, unsigned char data1)
(0101) {    
(0102)     LCD_WR_DATA(data1);
    0535 2F06      MOV	R16,R22
    0536 DFE5      RCALL	_LCD_WR_DATA
(0103)     LCD_WR_CODE(code);    
    0537 2F04      MOV	R16,R20
    0538 DFEE      RCALL	_LCD_WR_CODE
    0539 D2F8      RCALL	pop_gset2
    053A 9508      RET
_LCD_WR_CODE2:
  data2                --> Y+4
  data1                --> R22
  code                 --> R20
    053B D302      RCALL	push_gset2
    053C 2F62      MOV	R22,R18
    053D 2F40      MOV	R20,R16
(0104) }
(0105) /*******************************************************************************
(0106)  写双参数的指令 
(0107) *******************************************************************************/
(0108) void LCD_WR_CODE2(unsigned char code, unsigned char data1, unsigned char data2)
(0109) {    
(0110)     LCD_WR_DATA(data1);
    053E 2F06      MOV	R16,R22
    053F DFDC      RCALL	_LCD_WR_DATA
(0111)     LCD_WR_DATA(data2);
    0540 810C      LDD	R16,Y+4
    0541 DFDA      RCALL	_LCD_WR_DATA
(0112)     LCD_WR_CODE(code);    
    0542 2F04      MOV	R16,R20
    0543 DFE3      RCALL	_LCD_WR_CODE
    0544 D2ED      RCALL	pop_gset2
    0545 9508      RET
_LCD_INIT:
    0546 9721      SBIW	R28,1
(0113) }
(0114) /*******************************************************************************
(0115)  初始化LCD 
(0116) *******************************************************************************/
(0117) void LCD_INIT(void)
(0118) {
(0119)     LCD_WR_CODE(LCD_MOD_OR);
    0547 E800      LDI	R16,0x80
    0548 DFDE      RCALL	_LCD_WR_CODE
(0120)     LCD_WR_CODE(0x98);                  //打开图形显示
    0549 E908      LDI	R16,0x98
    054A DFDC      RCALL	_LCD_WR_CODE
(0121)     LCD_WR_CODE2(LCD_TXT_STP,0,0);
    054B 2422      CLR	R2
    054C 8228      STD	Y+0,R2
    054D 2722      CLR	R18
    054E E400      LDI	R16,0x40
    054F DFEB      RCALL	_LCD_WR_CODE2
(0122)     LCD_WR_CODE2(LCD_TXT_WID,30,0);
    0550 2422      CLR	R2
    0551 8228      STD	Y+0,R2
    0552 E12E      LDI	R18,0x1E
    0553 E401      LDI	R16,0x41
    0554 DFE6      RCALL	_LCD_WR_CODE2
(0123)     LCD_WR_CODE2(LCD_GRH_STP,0,0);
    0555 2422      CLR	R2
    0556 8228      STD	Y+0,R2
    0557 2722      CLR	R18
    0558 E402      LDI	R16,0x42
    0559 DFE1      RCALL	_LCD_WR_CODE2
(0124)     LCD_WR_CODE2(LCD_GRH_WID,30,0);
    055A 2422      CLR	R2
    055B 8228      STD	Y+0,R2
    055C E12E      LDI	R18,0x1E
    055D E403      LDI	R16,0x43
    055E DFDC      RCALL	_LCD_WR_CODE2
    055F 9621      ADIW	R28,1
    0560 9508      RET
_LCD_CLEAR:
  i                    --> R20
  j                    --> R10
  data                 --> R22
    0561 D2DA      RCALL	push_gset3
    0562 2F60      MOV	R22,R16
    0563 9721      SBIW	R28,1
(0125) }
(0126) /*******************************************************************************
(0127)  清整屏 
(0128) *******************************************************************************/
(0129) void LCD_CLEAR(unsigned char data)
(0130) {
(0131)     unsigned char i,j;
(0132)     LCD_WR_CODE(0x98);                  //打开图形显示
    0564 E908      LDI	R16,0x98
    0565 DFC1      RCALL	_LCD_WR_CODE
(0133)     LCD_WR_CODE2(LCD_ADD_POS,0,0);
    0566 2422      CLR	R2
    0567 8228      STD	Y+0,R2
    0568 2722      CLR	R18
    0569 E204      LDI	R16,0x24
    056A DFD0      RCALL	_LCD_WR_CODE2
(0134)     LCD_WR_CODE(LCD_AUT_WR);
    056B EB00      LDI	R16,0xB0
    056C DFBA      RCALL	_LCD_WR_CODE
(0135)     for(i=0;i<128;i++)
    056D 2744      CLR	R20
    056E C009      RJMP	0x0578
(0136)     {
(0137)         for(j=0;j<30;j++)
    056F 24AA      CLR	R10
    0570 C003      RJMP	0x0574
(0138)         {
(0139)             LCD_WR_DATA(data);
    0571 2F06      MOV	R16,R22
    0572 DFA9      RCALL	_LCD_WR_DATA
    0573 94A3      INC	R10
    0574 2D8A      MOV	R24,R10
    0575 318E      CPI	R24,0x1E
    0576 F3D0      BCS	0x0571
    0577 9543      INC	R20
    0578 3840      CPI	R20,0x80
    0579 F3A8      BCS	0x056F
(0140)         }
(0141)     }                               
(0142)     LCD_WR_CODE(LCD_AUT_OVR);
    057A EB02      LDI	R16,0xB2
    057B DFAB      RCALL	_LCD_WR_CODE
    057C 9621      ADIW	R28,1
    057D D2B6      RCALL	pop_gset3
    057E 9508      RET
_PRINT_240128:
  i                    --> R20
  j                    --> R10
  str                  --> R22
    057F D2BC      RCALL	push_gset3
    0580 01B8      MOVW	R22,R16
    0581 9721      SBIW	R28,1
(0143) }
(0144) /*******************************************************************************
(0145)  显示一个240*128的图片 图片的大小为3840 。
(0146) *******************************************************************************/
(0147) void PRINT_240128(const unsigned char *str)
(0148) {
(0149)     unsigned char i,j;
(0150)     LCD_WR_CODE(0x98);
    0582 E908      LDI	R16,0x98
    0583 DFA3      RCALL	_LCD_WR_CODE
(0151)     LCD_WR_CODE2(LCD_ADD_POS,0,0);
    0584 2422      CLR	R2
    0585 8228      STD	Y+0,R2
    0586 2722      CLR	R18
    0587 E204      LDI	R16,0x24
    0588 DFB2      RCALL	_LCD_WR_CODE2
(0152)     LCD_WR_CODE(LCD_AUT_WR);
    0589 EB00      LDI	R16,0xB0
    058A DF9C      RCALL	_LCD_WR_CODE
(0153)     for(i=0;i<128;i++)
    058B 2744      CLR	R20
    058C C00D      RJMP	0x059A
(0154)     {
(0155)         for(j=0;j<30;j++)
    058D 24AA      CLR	R10
    058E C007      RJMP	0x0596
(0156)         {
(0157)             LCD_WR_DATA(*str++);
    058F 011B      MOVW	R2,R22
    0590 5F6F      SUBI	R22,0xFF
    0591 4F7F      SBCI	R23,0xFF
    0592 01F1      MOVW	R30,R2
    0593 9104      LPM	R16,0(Z)
    0594 DF87      RCALL	_LCD_WR_DATA
    0595 94A3      INC	R10
    0596 2D8A      MOV	R24,R10
    0597 318E      CPI	R24,0x1E
    0598 F3B0      BCS	0x058F
    0599 9543      INC	R20
    059A 3840      CPI	R20,0x80
    059B F388      BCS	0x058D
(0158)         }
(0159)     }
(0160)     LCD_WR_CODE(LCD_AUT_OVR);
    059C EB02      LDI	R16,0xB2
    059D DF89      RCALL	_LCD_WR_CODE
    059E 9621      ADIW	R28,1
    059F D294      RCALL	pop_gset3
    05A0 9508      RET
_LCD_SET_ADD:
  ucol                 --> R20
  urow                 --> R22
    05A1 D29C      RCALL	push_gset2
    05A2 2F42      MOV	R20,R18
    05A3 2F60      MOV	R22,R16
    05A4 9721      SBIW	R28,1
(0161) }
(0162) /*******************************************************************************
(0163)  设置当前地址,用于起点定位。
(0164) *******************************************************************************/
(0165) void LCD_SET_ADD(unsigned char urow, unsigned char ucol)
(0166) {
(0167)     LCD_WR_CODE2(LCD_ADD_POS,(urow*30+ucol) & 0xFF,(urow*30+ucol) / 256);
    05A5 E18E      LDI	R24,0x1E
    05A6 9F86      MUL	R24,R22
    05A7 0110      MOVW	R2,R0
    05A8 2E44      MOV	R4,R20
    05A9 2455      CLR	R5
    05AA 0C24      ADD	R2,R4
    05AB 1C35      ADC	R3,R5
    05AC E020      LDI	R18,0
    05AD E031      LDI	R19,1
    05AE 0181      MOVW	R16,R2
    05AF D23D      RCALL	div16s
    05B0 8308      STD	Y+0,R16
    05B1 2D22      MOV	R18,R2
    05B2 7030      ANDI	R19,0
    05B3 E204      LDI	R16,0x24
    05B4 DF86      RCALL	_LCD_WR_CODE2
(0168)     gCurRow = urow;
    05B5 93600145  STS	gCurRow,R22
(0169)     gCurCol = ucol;
    05B7 93400144  STS	gCurCol,R20
    05B9 9621      ADIW	R28,1
    05BA D277      RCALL	pop_gset2
    05BB 9508      RET
_PRINT_words:
  length               --> Y+0
  uRow                 --> R22
  uCol                 --> R10
  i                    --> R12
  k                    --> R14
  j                    --> R20
  ptr                  --> Y+15
  y                    --> Y+13
  x                    --> Y+11
    05BC D227      RCALL	push_arg4
    05BD D27A      RCALL	push_gset5
    05BE 9721      SBIW	R28,1
(0170) }
(0171) /*******************************************************************************
(0172)  ASCII(8*16) 及 汉字(16*16) 显示函数,ASCII与汉字区别在于128做分界。
(0173) *******************************************************************************/
(0174) void PRINT_words (unsigned char x,unsigned char y, char *ptr)
(0175) {
(0176)     unsigned char length=0,i=0,j=0,uRow=0,uCol=0;
    05BF 2400      CLR	R0
    05C0 8208      STD	Y+0,R0
    05C1 24CC      CLR	R12
    05C2 2744      CLR	R20
    05C3 2766      CLR	R22
    05C4 24AA      CLR	R10
(0177)     unsigned int  k=0;
    05C5 24EE      CLR	R14
    05C6 24FF      CLR	R15
(0178) 	uRow = y;
    05C7 856D      LDD	R22,Y+13
(0179)     uCol = x;	            	
    05C8 84AB      LDD	R10,Y+11
(0180) 	LCD_SET_ADD(uRow*16,uCol);      //起点定位
    05C9 2D2A      MOV	R18,R10
    05CA E180      LDI	R24,0x10
    05CB 9F86      MUL	R24,R22
    05CC 2D00      MOV	R16,R0
    05CD DFD3      RCALL	_LCD_SET_ADD
    05CE C003      RJMP	0x05D2
(0181) 
(0182) 	
(0183)     while (ptr[length]!=0)            //探测字串长度
(0184)     {
(0185) 	  length++;
    05CF 8008      LDD	R0,Y+0
    05D0 9403      INC	R0
    05D1 8208      STD	Y+0,R0
    05D2 81E8      LDD	R30,Y+0
    05D3 27FF      CLR	R31
    05D4 840F      LDD	R0,Y+15
    05D5 8818      LDD	R1,Y+16
    05D6 0DE0      ADD	R30,R0
    05D7 1DF1      ADC	R31,R1
    05D8 8020      LDD	R2,Z+0
    05D9 2022      TST	R2
    05DA F7A1      BNE	0x05CF
    05DB C0B2      RJMP	0x068E
(0186)     }		
(0187)     while(i<length)//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
(0188)     {
(0189) 	    uRow = gCurRow;    
    05DC 91600145  LDS	R22,gCurRow
(0190)     	uCol = gCurCol;			
    05DE 90A00144  LDS	R10,gCurCol
(0191)     	if(ptr[i] <= 128)//ASCII
    05E0 2DEC      MOV	R30,R12
    05E1 27FF      CLR	R31
    05E2 840F      LDD	R0,Y+15
    05E3 8818      LDD	R1,Y+16
    05E4 0DE0      ADD	R30,R0
    05E5 1DF1      ADC	R31,R1
    05E6 8020      LDD	R2,Z+0
    05E7 E880      LDI	R24,0x80
    05E8 1582      CP	R24,R2
    05E9 F130      BCS	0x0610
(0192)       	{
(0193)             for(j=0;j<16;j++)
    05EA 2744      CLR	R20
    05EB C020      RJMP	0x060C
(0194)             {

⌨️ 快捷键说明

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