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

📄 lcd.lst

📁 ST7920液晶控制器的AVR程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
     6DB E010      LDI	R17,0
     6DC 940E 073B CALL	_Delayms
(0232) 	Draw_Pic(0,0,*PIC3);
     6DE E584      LDI	R24,0x54
     6DF E098      LDI	R25,0x8
     6E0 8399      STD	Y+1,R25
     6E1 8388      STD	Y+0,R24
     6E2 2722      CLR	R18
     6E3 2733      CLR	R19
     6E4 2700      CLR	R16
     6E5 2711      CLR	R17
     6E6 940E 08D0 CALL	_Draw_Pic
(0233) 	lcdDisplay(2,0,"设  计  者");
     6E8 E68C      LDI	R24,0x6C
     6E9 E090      LDI	R25,0
     6EA 8399      STD	Y+1,R25
     6EB 8388      STD	Y+0,R24
     6EC 2722      CLR	R18
     6ED E002      LDI	R16,2
     6EE 940E 0816 CALL	_lcdDisplay
(0234) 	lcdDisplay(1,2,"Love");lcdDisplay(10,2," Music");
     6F0 E687      LDI	R24,0x67
     6F1 E090      LDI	R25,0
     6F2 8399      STD	Y+1,R25
     6F3 8388      STD	Y+0,R24
     6F4 E022      LDI	R18,2
     6F5 E001      LDI	R16,1
     6F6 940E 0816 CALL	_lcdDisplay
     6F8 E680      LDI	R24,0x60
     6F9 E090      LDI	R25,0
     6FA 8399      STD	Y+1,R25
     6FB 8388      STD	Y+0,R24
     6FC E022      LDI	R18,2
     6FD E00A      LDI	R16,0xA
     6FE 940E 0816 CALL	_lcdDisplay
(0235) 	Delayms(70);	
     700 E406      LDI	R16,0x46
     701 E010      LDI	R17,0
     702 940E 073B CALL	_Delayms
     704 CF77      RJMP	0x067C
     705 9625      ADIW	R28,5
     706 9508      RET
_Delayus:
  i                    --> Y,+0
  x                    --> Y,+8
     707 940E 091D CALL	push_arg4
     709 9728      SBIW	R28,0x8
FILE: F:\毕业设计\LCM12864\ST7920.c
(0001) #include "ST7920.h"
(0002) void Delayus(ulong x);
(0003) void Delayms(uchar x);
(0004) void BUSYLOOP(void);
(0005) void WriteCommand(uchar command);
(0006) void WriteData(uchar data);
(0007) 
(0008) /**********************延时程序START********************************/
(0009) void Delayus(ulong x)  	
(0010) {	ulong i;
(0011) 	i = x<<4;
     70A E084      LDI	R24,4
     70B E090      LDI	R25,0
     70C 8508      LDD	R16,Y+8
     70D 8519      LDD	R17,Y+9
     70E 852A      LDD	R18,Y+10
     70F 853B      LDD	R19,Y+11
     710 938A      ST	R24,-Y
     711 940E 09A2 CALL	lsl32
     713 8308      STD	Y+0,R16
     714 8319      STD	Y+1,R17
     715 832A      STD	Y+2,R18
     716 833B      STD	Y+3,R19
(0012) 	while(i--);
     717 8028      LDD	R2,Y+0
     718 8039      LDD	R3,Y+1
     719 804A      LDD	R4,Y+2
     71A 805B      LDD	R5,Y+3
     71B 822C      STD	Y+4,R2
     71C 823D      STD	Y+5,R3
     71D 824E      STD	Y+6,R4
     71E 825F      STD	Y+7,R5
     71F E081      LDI	R24,1
     720 E090      LDI	R25,0
     721 E0A0      LDI	R26,0
     722 E0B0      LDI	R27,0
     723 802C      LDD	R2,Y+4
     724 803D      LDD	R3,Y+5
     725 804E      LDD	R4,Y+6
     726 805F      LDD	R5,Y+7
     727 1A28      SUB	R2,R24
     728 0A39      SBC	R3,R25
     729 0A4A      SBC	R4,R26
     72A 0A5B      SBC	R5,R27
     72B 8228      STD	Y+0,R2
     72C 8239      STD	Y+1,R3
     72D 824A      STD	Y+2,R4
     72E 825B      STD	Y+3,R5
     72F 802C      LDD	R2,Y+4
     730 803D      LDD	R3,Y+5
     731 804E      LDD	R4,Y+6
     732 805F      LDD	R5,Y+7
     733 E000      LDI	R16,0
     734 1620      CP	R2,R16
     735 0630      CPC	R3,R16
     736 0640      CPC	R4,R16
     737 0650      CPC	R5,R16
     738 F6F1      BNE	0x0717
     739 962C      ADIW	R28,0xC
     73A 9508      RET
_Delayms:
  i                    --> R20
  x                    --> R10
     73B 940E 098A CALL	push_xgset300C
     73D 2EA0      MOV	R10,R16
(0013) }
(0014) void Delayms(uchar x)
(0015) {   uint i;
(0016) 	i = x;
     73E 2D4A      MOV	R20,R10
     73F 2755      CLR	R21
     740 C005      RJMP	0x0746
(0017) 	while(i--)Delayus(1000);
     741 EE08      LDI	R16,0xE8
     742 E013      LDI	R17,3
     743 E020      LDI	R18,0
     744 E030      LDI	R19,0
     745 DFC1      RCALL	_Delayus
     746 011A      MOVW	R2,R20
     747 5041      SUBI	R20,1
     748 4050      SBCI	R21,0
     749 2022      TST	R2
     74A F7B1      BNE	0x0741
     74B 2033      TST	R3
     74C F7A1      BNE	0x0741
     74D 940C 098F JMP	pop_xgset300C
(0018) } 	 
(0019) void BUSYLOOP(void)
(0020) {
(0021)  	Delayus(10);
_BUSYLOOP:
     74F E00A      LDI	R16,0xA
     750 E010      LDI	R17,0
     751 E020      LDI	R18,0
     752 E030      LDI	R19,0
     753 DFB3      RCALL	_Delayus
     754 9508      RET
_lcm_out:
  d                    --> R22
  i                    --> R20
  a                    --> R16
     755 934A      ST	R20,-Y
     756 936A      ST	R22,-Y
(0022) }
(0023) /**********************延时程序END********************************/
(0024)          
(0025) /**********************串行方式相关程序START*********************/								
(0026) void lcm_out(uchar a)
(0027) {
(0028) 	char i,d;
(0029) 	for(i=0;i<8;i++)
     757 2744      CLR	R20
     758 C00A      RJMP	0x0763
(0030) 	{
(0031) 		clrbit(LCD_CTRL,E);  
     759 98C7      CBI	0x18,7
(0032) 		d=a&0x80;
     75A 2F60      MOV	R22,R16
     75B 7860      ANDI	R22,0x80
(0033) 		if(d)
     75C F011      BEQ	0x075F
(0034) 			setbit(LCD_CTRL,RW);
     75D 9AC6      SBI	0x18,6
     75E C001      RJMP	0x0760
(0035) 		else
(0036) 			clrbit(LCD_CTRL,RW);
     75F 98C6      CBI	0x18,6
(0037) 		a<<=1;
     760 0F00      LSL	R16
(0038) 		setbit(LCD_CTRL,E); //上升弦发送
     761 9AC7      SBI	0x18,7
     762 9543      INC	R20
     763 3048      CPI	R20,0x8
     764 F3A0      BCS	0x0759
     765 9169      LD	R22,Y+
     766 9149      LD	R20,Y+
     767 9508      RET
_WriteCommand:
  s                    --> R20
  command              --> R22
     768 934A      ST	R20,-Y
     769 936A      ST	R22,-Y
     76A 2F60      MOV	R22,R16
(0039) 	}
(0040) }
(0041) 
(0042) 
(0043) void WriteCommand(uchar command)	//发送命令字
(0044) {    
(0045) 	uchar s;  //,i; 
(0046) 	s=command&0xf0;
     76B 2F46      MOV	R20,R22
     76C 7F40      ANDI	R20,0xF0
(0047) 	lcm_out(0xf8); 			   //送写命令指令  1111 1 RW=0 RS=0  0
     76D EF08      LDI	R16,0xF8
     76E DFE6      RCALL	_lcm_out
(0048) 	lcm_out(s);            //发送高四位数据
     76F 2F04      MOV	R16,R20
     770 DFE4      RCALL	_lcm_out
(0049) 	s=command&0x0f;
     771 2F46      MOV	R20,R22
     772 704F      ANDI	R20,0xF
(0050) 	s<<=4;
     773 2F84      MOV	R24,R20
     774 708F      ANDI	R24,0xF
     775 9582      SWAP	R24
     776 2F48      MOV	R20,R24
(0051) 	lcm_out(s);            //发送低四位数据
     777 2F08      MOV	R16,R24
     778 DFDC      RCALL	_lcm_out
     779 9169      LD	R22,Y+
     77A 9149      LD	R20,Y+
     77B 9508      RET
_WriteData:
  s                    --> R20
  data                 --> R22
     77C 934A      ST	R20,-Y
     77D 936A      ST	R22,-Y
     77E 2F60      MOV	R22,R16
(0052) 	//for(i=1;i>0;i--)BUSYLOOP();	//延时10us	 延时后写命令就消失?
(0053) }
(0054) 
(0055) 
(0056) void WriteData(uchar data)
(0057) {
(0058)     
(0059) 	uchar s;  //,i; 
(0060) 	s=data&0xf0;
     77F 2F46      MOV	R20,R22
     780 7F40      ANDI	R20,0xF0
(0061) 	lcm_out(0xfa);         //送写数据指令  1111 1 RW=0 RS=1  0
     781 EF0A      LDI	R16,0xFA
     782 DFD2      RCALL	_lcm_out
(0062) 	lcm_out(s);
     783 2F04      MOV	R16,R20
     784 DFD0      RCALL	_lcm_out
(0063) 	s=data&0x0f;
     785 2F46      MOV	R20,R22
     786 704F      ANDI	R20,0xF
(0064) 	s<<=4;
     787 2F84      MOV	R24,R20
     788 708F      ANDI	R24,0xF
     789 9582      SWAP	R24
     78A 2F48      MOV	R20,R24
(0065) 	lcm_out(s);
     78B 2F08      MOV	R16,R24
     78C DFC8      RCALL	_lcm_out
     78D 9169      LD	R22,Y+
     78E 9149      LD	R20,Y+
     78F 9508      RET
_lcdSetXY:
  position             --> R20
  y                    --> R10
  x                    --> R22
     790 940E 0994 CALL	push_xgsetF00C
     792 2EA2      MOV	R10,R18
     793 2F60      MOV	R22,R16
(0066) 	//for(i=1;i>0;i--)BUSYLOOP();	//延时10us	延时后写命令就无效?
(0067) }
(0068) /**********************串行方式相关程序END*********************/
(0069)   
(0070)                 
(0071) /**********************液晶文字显示相关程序START*************/
(0072) 
(0073) 
(0074) void lcdSetXY(uchar x,uchar y)  //定位坐标的位置,这个主要跟字符显示相关
(0075) {  //x:横0-15   y:纵 0-3  ;x,y对应12864的坐标
(0076)  	unsigned char position=0;
     794 2744      CLR	R20
(0077) 	x &= 0x0f;//x%16;
     795 706F      ANDI	R22,0xF
(0078) 	switch(y%4)
     796 E024      LDI	R18,4
     797 E030      LDI	R19,0
     798 2D0A      MOV	R16,R10
     799 2711      CLR	R17
     79A 940E 0922 CALL	mod16s
     79C 0158      MOVW	R10,R16
     79D 3000      CPI	R16,0
     79E 0701      CPC	R16,R17
     79F F071      BEQ	0x07AE
     7A0 01C5      MOVW	R24,R10
     7A1 3001      CPI	R16,1
     7A2 E0E0      LDI	R30,0
     7A3 071E      CPC	R17,R30
     7A4 F069      BEQ	0x07B2
     7A5 3002      CPI	R16,2
     7A6 E0E0      LDI	R30,0
     7A7 071E      CPC	R17,R30
     7A8 F069      BEQ	0x07B6
     7A9 3003      CPI	R16,3
     7AA E0E0      LDI	R30,0
     7AB 071E      CPC	R17,R30
     7AC F069      BEQ	0x07BA
     7AD C00F      RJMP	0x07BD
(0079) 	{    //第零行和第二行寄存器连续   第一行和第三行寄存器连续
(0080) 	  case 0: position = 0x80 + (x>>1); break;		// |0x80	~	0x87|
     7AE 2F46      MOV	R20,R22
     7AF 9546      LSR	R20
     7B0 5840      SUBI	R20,0x80
     7B1 C00B      RJMP	0x07BD
(0081) 		case 1: position = 0x90 + (x>>1); break;		// |0x90	~   0x97|
     7B2 2F46      MOV	R20,R22
     7B3 9546      LSR	R20
     7B4 5740      SUBI	R20,0x70
     7B5 C007      RJMP	0x07BD
(0082) 		case 2: position = 0x88 + (x>>1); break;		// |0x88 	~   0x8f|
     7B6 2F46      MOV	R20,R22
     7B7 9546      LSR	R20
     7B8 5748      SUBI	R20,0x78
     7B9 C003      RJMP	0x07BD
(0083) 		case 3: position = 0x98 + (x>>1); break;		// |0x98	~	0x9f|
     7BA 2F46      MOV	R20,R22
     7BB 9546      LSR	R20
     7BC 5648      SUBI	R20,0x68
(0084) 		default: break;
(0085) 	}
(0086) 	WriteCommand(position);
     7BD 2F04      MOV	R16,R20
     7BE DFA9      RCALL	_WriteCommand
     7BF 940C 099B JMP	pop_xgsetF00C
_SetGraphicAddr:
  ytemp                --> R22
  y                    --> R10
  x                    --> R20
     7C1 940E 0994 CALL	push_xgsetF00C
     7C3 2EA2      MOV	R10,R18
     7C4 2F40      MOV	R20,R16
(0087) } 
(0088) 
(0089) //x:横0-15   y:纵 0-63  
(0090) void SetGraphicAddr(uchar x,uchar y)
(0091) {
(0092)  	uchar ytemp;
(0093) 	EX_FT();  //跟绘图设置有关  8BIT控制界面,扩充指令集,,绘图显示开
     7C5 E306      LDI	R16,0x36
     7C6 DFA1      RCALL	_WriteCommand
(0094) 	ytemp = (y & 0x1f) | 0x80;
     7C7 2D6A      MOV	R22,R10
     7C8 716F      ANDI	R22,0x1F
     7C9 6860      ORI	R22,0x80
(0095) 	WriteCommand(ytemp);							//先写st7920 垂直坐标
     7CA 2F06      MOV	R16,R22
     7CB DF9C      RCALL	_WriteCommand
(0096) 	ytemp = (y>>5); 		//12864的y坐标打印32的对应ST水平坐标0x88~0x8f,垂直坐标(y-32)
     7CC 2D6A      MOV	R22,R10
     7CD 9566      LSR	R22
     7CE 9566      LSR	R22

⌨️ 快捷键说明

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