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

📄 7920_16.s

📁 avr驱动显示屏LCD12864R(7920)
💻 S
字号:
	.module _7920_16.c
	.area lit(rom, con, rel)
_mynew1::
	.byte 55,57,50,48,95,51,'w,'i,'r,'e,'s,95,'d,'e,'m,'o
	.byte 0
	.dbfile E:\YM200\DEMO\LCD12864R(7920)\7920_16.c
	.dbsym e mynew1 _mynew1 A[17:17]kc
_mynew2::
	.byte 'C,'r,'e,'a,'t,'e,32,'b,'y,58,'C,'A,'N,'Y,0
	.dbsym e mynew2 _mynew2 A[15:15]kc
_mynew3::
	.byte 'E,95,'m,'a,'i,'l,58,'C,'A,'N,'Y,95,57,57,57,64
	.byte 0
	.dbsym e mynew3 _mynew3 A[17:17]kc
_mynew4::
	.byte 49,54,51,46,'c,'o,'m,0
	.dbsym e mynew4 _mynew4 A[8:8]kc
	.area text(rom, con, rel)
	.dbfile E:\YM200\DEMO\LCD12864R(7920)\7920_16.c
	.dbfunc e main _main fV
;              i -> R20
	.even
_main::
	sbiw R28,1
	.dbline -1
	.dbline 40
; //12864液晶(ST7920驱动)的3线串行驱动 MCU=ATMega16(L)
; 
; /***********************************************************************
; 工    程:ST7920驱动的12864液晶的3线串行驱动模式
; 引脚定义:
; 	RS(CS)=====>PB0
;     	RW(SID)====>PB1
;         EN(SCLK)===>PB2
;     	PSB为硬件控制,接高电平为8位或4位的并行模式,接低电平为串行模式
; ************************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; 
; #define uchar unsigned char
; #define uint unsigned int 
; #define nop()  NOP()
; #define xtal 8
; 
; #define Set_CS() DDRB |= (1<<0);PORTB |= (1<<0)
; #define Set_SID() DDRB |= (1<<1);PORTB |= (1<<1)
; #define Set_SCLK() DDRB |= (1<<2);PORTB |= (1<<2)
; 
; #define Clr_CS() DDRB |= (1<<0);PORTB &=~(1<<0)
; #define Clr_SID() DDRB |= (1<<1);PORTB &=~(1<<1)
; #define Clr_SCLK() DDRB |= (1<<2);PORTB &=~(1<<2)
; 
; //====================================================================
; //函数声明
; void Delay(uint ms);      //延时子程序
; void W_1byte(uchar RW, uchar RS, uchar W_data);
; void Write_8bits(uint W_bits);
; void LCD_Init(void);
; /*********************************************************************/ 
; const uchar mynew1[]={"7920_3wires_demo"};
; const uchar mynew2[]={"Create by:CANY"};
; const uchar mynew3[]={"E_mail:CANY_999@"};
; const uchar mynew4[]={"163.com"};
; /*********************************************************************/
; void main()
; {
	.dbline 41
; 	uchar i = 0;
	clr R20
	.dbline 42
;  	Clr_CS();
	sbi 0x17,0
	.dbline 42
	cbi 0x18,0
	.dbline 43
;  	Clr_SID();
	sbi 0x17,1
	.dbline 43
	cbi 0x18,1
	.dbline 44
;  	Clr_SCLK();
	sbi 0x17,2
	.dbline 44
	cbi 0x18,2
	.dbline 45
;  	LCD_Init();
	xcall _LCD_Init
	xjmp L3
L2:
	.dbline 47
;  	while(1)
;  	{ 
	.dbline 48
;   		nop();
	nop
	.dbline 49
;   		nop();
	nop
	.dbline 50
;   		W_1byte(0,0,0x80);   			//显示的地址0x80
	ldi R24,128
	std y+0,R24
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 51
;   		nop();
	nop
	.dbline 52
;   		for(i=0;mynew1[i]!='\0';i++)
	clr R20
	xjmp L8
L5:
	.dbline 53
	.dbline 54
	ldi R24,<_mynew1
	ldi R25,>_mynew1
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	std y+0,R30
	ldi R18,1
	clr R16
	xcall _W_1byte
	.dbline 55
L6:
	.dbline 52
	inc R20
L8:
	.dbline 52
	ldi R24,<_mynew1
	ldi R25,>_mynew1
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	tst R30
	brne L5
	.dbline 56
;   		{
;    			W_1byte(0,1,mynew1[i]);
; 		  }
;   		W_1byte(0,0,0x90);     			//显示的地址0x90
	ldi R24,144
	std y+0,R24
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 57
;   		for(i=0;mynew2[i]!='\0';i++)
	clr R20
	xjmp L12
L9:
	.dbline 58
	.dbline 59
	ldi R24,<_mynew2
	ldi R25,>_mynew2
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	std y+0,R30
	ldi R18,1
	clr R16
	xcall _W_1byte
	.dbline 60
L10:
	.dbline 57
	inc R20
L12:
	.dbline 57
	ldi R24,<_mynew2
	ldi R25,>_mynew2
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	tst R30
	brne L9
	.dbline 61
;   		{
;    			W_1byte(0,1,mynew2[i]); 
;   		}
;   		W_1byte(0,0,0x88);   			//显示的地址0x88
	ldi R24,136
	std y+0,R24
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 62
;   		for(i=0;mynew3[i]!='\0';i++)
	clr R20
	xjmp L16
L13:
	.dbline 63
	.dbline 64
	ldi R24,<_mynew3
	ldi R25,>_mynew3
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	std y+0,R30
	ldi R18,1
	clr R16
	xcall _W_1byte
	.dbline 65
L14:
	.dbline 62
	inc R20
L16:
	.dbline 62
	ldi R24,<_mynew3
	ldi R25,>_mynew3
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	tst R30
	brne L13
	.dbline 66
;   		{
;    			W_1byte(0,1,mynew3[i]);
;   		}
;   		W_1byte(0,0,0x98);     			//显示的地址0x98
	ldi R24,152
	std y+0,R24
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 67
;   		for(i=0;mynew4[i]!='\0';i++)
	clr R20
	xjmp L20
L17:
	.dbline 68
	.dbline 69
	ldi R24,<_mynew4
	ldi R25,>_mynew4
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	std y+0,R30
	ldi R18,1
	clr R16
	xcall _W_1byte
	.dbline 70
L18:
	.dbline 67
	inc R20
L20:
	.dbline 67
	ldi R24,<_mynew4
	ldi R25,>_mynew4
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	tst R30
	brne L17
	.dbline 71
;   		{
;    			W_1byte(0,1,mynew4[i]);
;   		}
;   		nop();
	nop
	.dbline 72
	.dbline 73
	.dbline 74
L22:
	.dbline 72
	.dbline 72
	xjmp L22
L3:
	.dbline 46
	xjmp L2
X0:
	.dbline -2
L1:
	adiw R28,1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e LCD_Init _LCD_Init fV
;            cmd -> R20
	.even
_LCD_Init::
	xcall push_gset1
	sbiw R28,1
	.dbline -1
	.dbline 80
;   		for(;;)
;   		{
;     			continue;
;   		} 
;  }
; }
; /******************************************************************/
; void LCD_Init(void)
; {
	.dbline 82
; 	uchar cmd;
;   	cmd=0x30;   				//功能设置 8位数据,基本指令
	ldi R20,48
	.dbline 83
;  	W_1byte(0,0,cmd);
	std y+0,R20
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 84
;  	Delay(2);
	ldi R16,2
	ldi R17,0
	xcall _Delay
	.dbline 85
;  	cmd=0x0C;   				//显示状态 ON,游标OFF,反白OFF
	ldi R20,12
	.dbline 86
;  	W_1byte(0,0,cmd); 			//写指令
	std y+0,R20
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 87
;  	Delay(2);
	ldi R16,2
	ldi R17,0
	xcall _Delay
	.dbline 88
;  	cmd=0x01;   				//清除显示
	ldi R20,1
	.dbline 89
;  	W_1byte(0,0,cmd); 			//写指令
	std y+0,R20
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 90
;  	Delay(2);
	ldi R16,2
	ldi R17,0
	xcall _Delay
	.dbline 91
;  	cmd=0x02;   				//地址归位
	ldi R20,2
	.dbline 92
;  	W_1byte(0,0,cmd); 			//写指令
	std y+0,R20
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 93
;  	Delay(2);
	ldi R16,2
	ldi R17,0
	xcall _Delay
	.dbline 94
;  	cmd=0x80;   				//设置DDRAM地址
	ldi R20,128
	.dbline 95
;  	W_1byte(0,0,cmd); 			//写指令
	std y+0,R20
	clr R18
	clr R16
	xcall _W_1byte
	.dbline 96
;  	Delay(2);   				//延时
	ldi R16,2
	ldi R17,0
	xcall _Delay
	.dbline -2
L25:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r cmd 20 c
	.dbend
	.dbfunc e W_1byte _W_1byte fV
;         H_data -> R22,R23
;           S_ID -> R10,R11
;         L_data -> R20,R21
;         W_data -> y+6
;             RS -> R20
;             RW -> R22
	.even
_W_1byte::
	xcall push_gset3
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 109
; }
; /*******************************************************************
; 函 数 名:W_1byte
; 入口参数:RW、RS、W_data
; 函数作用:写一个字节的数据到12864液晶,包括指令和数据
; 说    明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
;    	 (一般RW都设为0,即只向液晶写数据,不读数据)
;           RS=1,写入的是数据;RS=0,写入的是指令;
;     	 一般模式:RW=0,RS=1;写数据
;        	 RW=0,RS=0;写指令
; ********************************************************************/
; void W_1byte(uchar RW, uchar RS, uchar W_data)
; {
	.dbline 110
; 	uint H_data,L_data,S_ID = 0xf8;  	//11111RWRS0
	ldi R24,248
	ldi R25,0
	movw R10,R24
	.dbline 111
;  	if(RW == 0)
	tst R22
	brne L27
	.dbline 112
;  	{
	.dbline 113
;    		S_ID &=~ 0x04;
	andi R24,251
	movw R10,R24
	.dbline 114
; 	}
	xjmp L28
L27:
	.dbline 116
;  	else     //if(RW==1)
;  	{
	.dbline 117
;    		S_ID |= 0X04;
	movw R24,R10
	ori R24,4
	movw R10,R24
	.dbline 118
;  	}
L28:
	.dbline 119
;  	if(RS == 0)
	tst R20
	brne L29
	.dbline 120
;  	{
	.dbline 121
;    		S_ID &=~ 0x02;
	movw R24,R10
	andi R24,253
	movw R10,R24
	.dbline 122
;  	}
	xjmp L30
L29:
	.dbline 124
;  	else     //if(RS==1)
;  	{
	.dbline 125
;    		S_ID |= 0X02;
	movw R24,R10
	ori R24,2
	movw R10,R24
	.dbline 126
;  	}
L30:
	.dbline 127
;  	H_data = W_data;
	ldd R22,y+6
	clr R23
	.dbline 128
;  	H_data &= 0xf0;   			//屏蔽低4位的数据
	andi R22,240
	andi R23,0
	.dbline 129
;  	L_data = W_data;     			//xxxx0000格式
	ldd R20,y+6
	clr R21
	.dbline 130
;  	L_data &= 0x0f;   			//屏蔽高4位的数据
	andi R20,15
	andi R21,0
	.dbline 131
;  	L_data <<= 4;   			//xxxx0000格式
	lsl R20
	rol R21
	lsl R20
	rol R21
	lsl R20
	rol R21
	lsl R20
	rol R21
	.dbline 132
;  	Set_CS();
	sbi 0x17,0
	.dbline 132
	sbi 0x18,0
	.dbline 133
;  	Write_8bits(S_ID);   			//发送S_ID
	movw R16,R10
	xcall _Write_8bits
	.dbline 134
;  	Write_8bits(H_data); 			//发送H_data
	movw R16,R22
	xcall _Write_8bits
	.dbline 135
;  	Write_8bits(L_data); 			//发送L_data
	movw R16,R20
	xcall _Write_8bits
	.dbline 136
;  	Clr_CS(); 
	sbi 0x17,0
	.dbline 136
	cbi 0x18,0
	.dbline -2
L26:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r H_data 22 i
	.dbsym r S_ID 10 i
	.dbsym r L_data 20 i
	.dbsym l W_data 6 c
	.dbsym r RS 20 c
	.dbsym r RW 22 c
	.dbend
	.dbfunc e Write_8bits _Write_8bits fV
;      Temp_data -> R20,R21
;              i -> R22,R23
;         W_bits -> R10,R11
	.even
_Write_8bits::
	xcall push_gset3
	movw R10,R16
	.dbline -1
	.dbline 144
; }
; /********************************************************************
; 函 数 名:Write_8bits
; 入口参数:W_bits
; 函数作用:负责串行输出8个bit位
; ********************************************************************/
; void Write_8bits(uint W_bits)
; {
	.dbline 146
; 	uint i,Temp_data;
;  	for(i=0; i<8; i++)
	clr R22
	clr R23
	xjmp L35
L32:
	.dbline 147
;  	{
	.dbline 148
;   		Temp_data = W_bits;
	movw R20,R10
	.dbline 149
;   		Temp_data <<= i;
	movw R18,R22
	movw R16,R20
	xcall lsl16
	movw R20,R16
	.dbline 150
;   		if((Temp_data&0x80)==0)  //bit7 is zero
	sbrc R16,7
	rjmp L36
	.dbline 151
;   		{
	.dbline 152
;    			Clr_SID();
	sbi 0x17,1
	.dbline 152
	cbi 0x18,1
	.dbline 153
;    			nop();
	nop
	.dbline 154
;    			Set_SCLK();
	sbi 0x17,2
	.dbline 154
	sbi 0x18,2
	.dbline 155
;    			nop();
	nop
	.dbline 156
;    			nop();
	nop
	.dbline 157
;    			Clr_SCLK();
	sbi 0x17,2
	.dbline 157
	cbi 0x18,2
	.dbline 158
;    			nop();
	nop
	.dbline 159
;    			Clr_SID();
	sbi 0x17,1
	.dbline 159
	cbi 0x18,1
	.dbline 160
;   		}
	xjmp L37
L36:
	.dbline 162
;   		else         //bit7 is one
;   		{
	.dbline 163
;    			Set_SID();
	sbi 0x17,1
	.dbline 163
	sbi 0x18,1
	.dbline 164
;    			nop();
	nop
	.dbline 165
;    			Set_SCLK();
	sbi 0x17,2
	.dbline 165
	sbi 0x18,2
	.dbline 166
;    			nop();
	nop
	.dbline 167
;    			nop();
	nop
	.dbline 168
;    			Clr_SCLK();
	sbi 0x17,2
	.dbline 168
	cbi 0x18,2
	.dbline 169
;    			nop();
	nop
	.dbline 170
;    			Clr_SID();
	sbi 0x17,1
	.dbline 170
	cbi 0x18,1
	.dbline 171
;   		} 
L37:
	.dbline 172
L33:
	.dbline 146
	subi R22,255  ; offset = 1
	sbci R23,255
L35:
	.dbline 146
	cpi R22,8
	ldi R30,0
	cpc R23,R30
	brlo L32
	.dbline -2
L31:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Temp_data 20 i
	.dbsym r i 22 i
	.dbsym r W_bits 10 i
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R20,R21
;             ms -> R16,R17
	.even
_Delay::
	xcall push_gset1
	.dbline -1
	.dbline 180
;  	}
; }
; /********************************************************************
; 函 数 名:Delay
; 入口参数:ms
; 函数作用:毫秒级的延时程序,当晶振为12Mhz时,xtal=12;
; ********************************************************************/
; void Delay(uint ms) 
; { 
	xjmp L40
L39:
	.dbline 183
; 	uint i; 
;     	while(ms--)    
;    	{ 
	.dbline 184
;      		for(i=1;i<(uint)(xtal*143-2);i++) 
	ldi R20,1
	ldi R21,0
	xjmp L45
L42:
	.dbline 185
L43:
	.dbline 184
	subi R20,255  ; offset = 1
	sbci R21,255
L45:
	.dbline 184
	cpi R20,118
	ldi R30,4
	cpc R21,R30
	brlo L42
	.dbline 186
L40:
	.dbline 182
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L39
	tst R3
	brne L39
X1:
	.dbline -2
L38:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r ms 16 i
	.dbend

⌨️ 快捷键说明

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