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

📄 lcd.lst

📁 ST7920液晶控制器的AVR程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
     7CF 9566      LSR	R22
     7D0 9566      LSR	R22
     7D1 9566      LSR	R22
(0097) 	x &= 0x0f;//x%16;
     7D2 704F      ANDI	R20,0xF
(0098) 	x  = 0x80 +(ytemp<<3) + (x>>1);			 		//0 |0x80	~	0x87|	
     7D3 2E24      MOV	R2,R20
     7D4 9426      LSR	R2
     7D5 2F46      MOV	R20,R22
     7D6 0F44      LSL	R20
     7D7 0F44      LSL	R20
     7D8 0F44      LSL	R20
     7D9 5840      SUBI	R20,0x80
     7DA 0D42      ADD	R20,R2
(0099) 	WriteCommand(x);								//1 |                   																																 
     7DB 2F04      MOV	R16,R20
     7DC DF8B      RCALL	_WriteCommand
(0100) 	                               					//. |数值表示st的位址   
(0101) 							                 		//. |					
(0102) 													//31|                   																												 		
(0103) 													//0	|0x88	~   0x8f|   
(0104) 	FunctionSet();					//功能设置 8位数据,基本指令                                                                                                                     	
     7DD E300      LDI	R16,0x30
     7DE DF89      RCALL	_WriteCommand
     7DF 940C 099B JMP	pop_xgsetF00C
(0105) } 
(0106) 
(0107) 
(0108) void lcdInit()		//液晶初始化						
(0109) { 
(0110) 	//初始化控制管脚
(0111) 	DDR_LCD_CTRL |= BIT(RS);
_lcdInit:
     7E1 9ABD      SBI	0x17,5
(0112) 	DDR_LCD_CTRL |= BIT(RW);  
     7E2 9ABE      SBI	0x17,6
(0113) 	DDR_LCD_CTRL |= BIT(E);
     7E3 9ABF      SBI	0x17,7
(0114) 	LCD_CTRL |= BIT(RS);
     7E4 9AC5      SBI	0x18,5
(0115) 	LCD_CTRL |= BIT(RW);  
     7E5 9AC6      SBI	0x18,6
(0116) 	LCD_CTRL |= BIT(E);
     7E6 9AC7      SBI	0x18,7
(0117) 	
(0118) 	FunctionSet();                      
     7E7 E300      LDI	R16,0x30
     7E8 DF7F      RCALL	_WriteCommand
(0119) 	Delayus(150); 
     7E9 E906      LDI	R16,0x96
     7EA E010      LDI	R17,0
     7EB E020      LDI	R18,0
     7EC E030      LDI	R19,0
     7ED DF19      RCALL	_Delayus
(0120) 	                             	
(0121) 	FunctionSet(); 
     7EE E300      LDI	R16,0x30
     7EF DF78      RCALL	_WriteCommand
(0122) 	Delayus(50);
     7F0 E302      LDI	R16,0x32
     7F1 E010      LDI	R17,0
     7F2 E020      LDI	R18,0
     7F3 E030      LDI	R19,0
     7F4 DF12      RCALL	_Delayus
(0123) 	                    	
(0124)   DisplayOff();
     7F5 E008      LDI	R16,0x8
     7F6 DF71      RCALL	_WriteCommand
(0125) 	Delayus(150);
     7F7 E906      LDI	R16,0x96
     7F8 E010      LDI	R17,0
     7F9 E020      LDI	R18,0
     7FA E030      LDI	R19,0
     7FB DF0B      RCALL	_Delayus
(0126)                                                 
(0127) 	lcdClear(); //清屏程序 需要毫秒级的延时
     7FC E001      LDI	R16,1
     7FD DF6A      RCALL	_WriteCommand
     7FE E00A      LDI	R16,0xA
     7FF DF3B      RCALL	_Delayms
(0128) 	Delayus(150);
     800 E906      LDI	R16,0x96
     801 E010      LDI	R17,0
     802 E020      LDI	R18,0
     803 E030      LDI	R19,0
     804 DF02      RCALL	_Delayus
(0129)   EntryModeSet();  //设定写入时候指针右移               
     805 E006      LDI	R16,6
     806 DF61      RCALL	_WriteCommand
(0130) 	DisplayOn(); 
     807 E00C      LDI	R16,0xC
     808 DF5F      RCALL	_WriteCommand
(0131) 	Delayus(50); 
     809 E302      LDI	R16,0x32
     80A E010      LDI	R17,0
     80B E020      LDI	R18,0
     80C E030      LDI	R19,0
     80D DEF9      RCALL	_Delayus
(0132) 	DisplayOn(); 
     80E E00C      LDI	R16,0xC
     80F DF58      RCALL	_WriteCommand
(0133) 	Delayus(50);                 
     810 E302      LDI	R16,0x32
     811 E010      LDI	R17,0
     812 E020      LDI	R18,0
     813 E030      LDI	R19,0
     814 DEF2      RCALL	_Delayus
     815 9508      RET
_lcdDisplay:
  LineDispCnt          --> R12
  i                    --> R10
  ptr                  --> R20
  y                    --> R14
  x                    --> R22
     816 940E 097F CALL	push_xgsetF0FC
     818 2EE2      MOV	R14,R18
     819 2F60      MOV	R22,R16
     81A 854A      LDD	R20,Y+10
     81B 855B      LDD	R21,Y+11
(0134) } 
(0135) 
(0136) void lcdDisplay( uchar x, uchar y, uchar *ptr ) //行写满自动换行
(0137) {   
(0138) 	uchar i;
(0139) 	uchar LineDispCnt = 0;
(0140) 	LineDispCnt = (16-x+x%2);
     81C E012      LDI	R17,2
     81D 2F06      MOV	R16,R22
     81E 940E 095C CALL	mod8u
     820 E180      LDI	R24,0x10
     821 2EC8      MOV	R12,R24
     822 1AC6      SUB	R12,R22
     823 0EC0      ADD	R12,R16
(0141) 	lcdSetXY(x,y);
     824 2D2E      MOV	R18,R14
     825 2F06      MOV	R16,R22
     826 DF69      RCALL	_lcdSetXY
(0142) 	i = 0;
     827 24AA      CLR	R10
     828 C017      RJMP	0x0840
(0143) 	while((ptr[i])!='\0')
(0144) 	{
(0145) 		WriteData(ptr[i]);
     829 2DEA      MOV	R30,R10
     82A 27FF      CLR	R31
     82B 0FE4      ADD	R30,R20
     82C 1FF5      ADC	R31,R21
     82D 8100      LDD	R16,Z+0
     82E DF4D      RCALL	_WriteData
(0146) 		i++;
     82F 94A3      INC	R10
(0147) 		if( i%16 == LineDispCnt%16 ) 
     830 E110      LDI	R17,0x10
     831 2D0C      MOV	R16,R12
     832 940E 095C CALL	mod8u
     834 2E20      MOV	R2,R16
     835 E110      LDI	R17,0x10
     836 2D0A      MOV	R16,R10
     837 940E 095C CALL	mod8u
     839 1502      CP	R16,R2
     83A F429      BNE	0x0840
(0148) 		{
(0149) 		   y++;
     83B 94E3      INC	R14
(0150) 		   x = 0;
     83C 2766      CLR	R22
(0151) 		   lcdSetXY(x,y);
     83D 2D2E      MOV	R18,R14
     83E 2F06      MOV	R16,R22
     83F DF50      RCALL	_lcdSetXY
     840 2DEA      MOV	R30,R10
     841 27FF      CLR	R31
     842 0FE4      ADD	R30,R20
     843 1FF5      ADC	R31,R21
     844 8020      LDD	R2,Z+0
     845 2022      TST	R2
     846 F711      BNE	0x0829
     847 940C 0974 JMP	pop_xgsetF0FC
_lcdDispChar:
  c                    --> Y,+2
  y                    --> R12
  x                    --> R10
     849 92AA      ST	R10,-Y
     84A 92CA      ST	R12,-Y
     84B 2EC2      MOV	R12,R18
     84C 2EA0      MOV	R10,R16
(0152) 		}
(0153) 	}
(0154) }
(0155) 
(0156) void lcdDispChar( uchar x, uchar y, uchar c )
(0157) {
(0158)    lcdSetXY(x,y);
     84D 2D2C      MOV	R18,R12
     84E 2D0A      MOV	R16,R10
     84F DF40      RCALL	_lcdSetXY
(0159)    WriteData(c);
     850 810A      LDD	R16,Y+2
     851 DF2A      RCALL	_WriteData
     852 90C9      LD	R12,Y+
     853 90A9      LD	R10,Y+
     854 9508      RET
_lcdDispGraphic:
  widthOver            --> R20
  i                    --> R14
  j                    --> R10
  ptr                  --> R22
  y                    --> R12
  x                    --> Y,+14
  width                --> Y,+12
  length               --> Y,+10
     855 940E 091D CALL	push_arg4
     857 940E 097F CALL	push_xgsetF0FC
     859 88C8      LDD	R12,Y+16
     85A 896A      LDD	R22,Y+18
     85B 897B      LDD	R23,Y+19
(0160) }
(0161) 
(0162) void lcdDispGraphic(uchar length,uchar width, uchar x,uchar y,const unsigned char *ptr)
(0163) {   //x:横0-15   y:纵 0-63  
(0164)    uchar i,j;
(0165)    uchar widthOver=0;
     85C 2744      CLR	R20
(0166)    if((width + x) > 16) {widthOver = (width + x - 16);width = (16-x);}  //超出屏幕
     85D 842C      LDD	R2,Y+12
     85E 840E      LDD	R0,Y+14
     85F 0C20      ADD	R2,R0
     860 E180      LDI	R24,0x10
     861 1582      CP	R24,R2
     862 F428      BCC	0x0868
     863 854C      LDD	R20,Y+12
     864 0D40      ADD	R20,R0
     865 5140      SUBI	R20,0x10
     866 1980      SUB	R24,R0
     867 878C      STD	Y+12,R24
(0167)    for(i = 0;i< length;i++)
     868 24EE      CLR	R14
     869 C017      RJMP	0x0881
(0168)    {
(0169)    	 	SetGraphicAddr(x,y);   				  //定位12864坐标
     86A 2D2C      MOV	R18,R12
     86B 850E      LDD	R16,Y+14
     86C DF54      RCALL	_SetGraphicAddr
(0170) 		for(j = 0; j< width;j++)
     86D 24AA      CLR	R10
     86E C007      RJMP	0x0876
(0171)    	 	{
(0172)    	 		WriteData(*ptr++);
     86F 011B      MOVW	R2,R22
     870 5F6F      SUBI	R22,0xFF
     871 4F7F      SBCI	R23,0xFF
     872 01F1      MOVW	R30,R2
     873 9104      LPM	R16,255(Z)
     874 DF07      RCALL	_WriteData
     875 94A3      INC	R10
     876 840C      LDD	R0,Y+12
     877 14A0      CP	R10,R0
     878 F3B0      BCS	0x086F
(0173)    	 	}
(0174) 		if(widthOver)ptr +=widthOver;  
     879 2344      TST	R20
     87A F021      BEQ	0x087F
     87B 2E24      MOV	R2,R20
     87C 2433      CLR	R3
     87D 0D62      ADD	R22,R2
     87E 1D73      ADC	R23,R3
(0175)    	 	y++;
     87F 94C3      INC	R12
     880 94E3      INC	R14
     881 840A      LDD	R0,Y+10
     882 14E0      CP	R14,R0
     883 F330      BCS	0x086A
     884 940E 0974 CALL	pop_xgsetF0FC
     886 9624      ADIW	R28,4
     887 9508      RET
_ClearArea:
  i                    --> R10
  j                    --> R22
  back                 --> Y,+14
  y                    --> R12
  x                    --> Y,+10
  width                --> R14
  length               --> R20
     888 940E 097F CALL	push_xgsetF0FC
     88A 2EE2      MOV	R14,R18
     88B 2F40      MOV	R20,R16
     88C 84CC      LDD	R12,Y+12
(0176)    }
(0177) }
(0178) 
(0179) 
(0180) void ClearArea(uchar length,uchar width, uchar x,uchar y,uchar back)
(0181) {
(0182)     uchar i=0,j=0;
     88D 24AA      CLR	R10
     88E 2766      CLR	R22
(0183)    	 for(i = 0;i< length;i++)
     88F C00C      RJMP	0x089C
(0184)    {
(0185)    	 	SetGraphicAddr(x,y);   				  //定位12864坐标
     890 2D2C      MOV	R18,R12
     891 850A      LDD	R16,Y+10
     892 DF2E      RCALL	_SetGraphicAddr
(0186) 		for(j = 0; j< width;j++)
     893 2766      CLR	R22
     894 C003      RJMP	0x0898
(0187)    	 	{
(0188)    	 		WriteData(back);
     895 850E      LDD	R16,Y+14
     896 DEE5      RCALL	_WriteData
     897 9563      INC	R22
     898 156E      CP	R22,R14
     899 F3D8      BCS	0x0895
(0189)    	 	}
(0190)    	 	y++;
     89A 94C3      INC	R12
     89B 94A3      INC	R10
     89C 16A4      CP	R10,R20
     89D F390      BCS	0x0890
     89E 940C 0974 JMP	pop_xgsetF0FC
_DrawLevelLing:
  y1                   --> Y,+9
  x1                   --> Y,+7
  y0                   --> R12
  x0                   --> R10
     8A0 92AA      ST	R10,-Y
     8A1 92CA      ST	R12,-Y
     8A2 2EC2      MOV	R12,R18
     8A3 2EA0      MOV	R10,R16
     8A4 9725      SBIW	R28,5
(0191)    }
(0192) }
(0193) 
(0194) 
(0195) void DrawLevelLing( uchar x0,uchar y0, uchar x1,uchar y1)
(0196) {
(0197)  	 ClearArea(1,x1 - x0,x0,y0,0xff);
     8A5 EF8F      LDI	R24,0xFF
     8A6 838C      STD	Y+4,R24
     8A7 82CA      STD	Y+2,R12
     8A8 82A8      STD	Y+0,R10
     8A9 812F      LDD	R18,Y+7
     8AA 192A      SUB	R18,R10
     8AB E001      LDI	R16,1
     8AC DFDB      RCALL	_ClearArea
     8AD 9625      ADIW	R28,5
     8AE 90C9      LD	R12,Y+
     8AF 90A9      LD	R10,Y+
     8B0 9508      RET
_PicClear1:
  COUNT3               --> R20
  LCD_X                --> R22
  LCD_Y                --> R10
  COUNT2               --> R12
  COUNT1               --> R14
     8B1 940E 097F CALL	push_xgsetF0FC

⌨️ 快捷键说明

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