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

📄 so12864.s

📁 采用Mega128控制LCD12864液晶显示器
💻 S
字号:
	.module so12864.c
	.area text(rom, con, rel)
	.dbfile F:\avr\mega128\lcd12864\so12864.c
	.dbfunc e Init_LCD _Init_LCD fV
	.even
_Init_LCD::
	.dbline -1
	.dbline 7
; #include "so12864.h"
; 
; /*************************************************/
; //Init LCD
; /*************************************************/
; void Init_LCD(void)
; {
	.dbline 9
; 	//Make the CS AO RST pin as output
; 	DDR_SPI_CTL = (1 << LCD_AO_TRIS) | (1 << LCD_RST_TRIS) | (1 << LCD_CS_TRIS);
	ldi R24,7
	out 0x11,R24
	.dbline 11
; 
; 	DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);				//设置MOSI,SCK,SS 为OUTPUT,其它为INPUT 
	ldi R24,6
	out 0x17,R24
	.dbline 12
; 	SPCR = (1<<SPE)|(1<<MSTR);						//SPI使能,主机方式,设置SCK为fosc/4,上升沿,MSB First 
	ldi R24,80
	out 0xd,R24
	.dbline 16
; 
; 	/* 一定要先重启LCD,再设置SPI,否则通讯不成功 */
; 
; 	LCD_RST_IO |= BIT(LCD_RST_PIN);
	sbi 0x12,1
	.dbline 17
; 	LCD_CS_IO |= BIT(LCD_CS_PIN);
	sbi 0x12,2
	.dbline 18
; 	LCD_AO_IO |= BIT(LCD_AO_PIN);
	sbi 0x12,0
	.dbline 20
; 
; 	LCD_CS_IO &= ~BIT(LCD_CS_PIN);			//select 12864
	cbi 0x12,2
	.dbline 22
; 	
; 	LCD_RST_IO &= ~BIT(LCD_RST_PIN);			//reset
	cbi 0x12,1
	.dbline 23
; 	nop();
	nop
	.dbline 24
; 	nop();
	nop
	.dbline 25
; 	nop();
	nop
	.dbline 26
; 	LCD_RST_IO |= BIT(LCD_RST_PIN);
	sbi 0x12,1
	.dbline 29
; 	
; 	//write command
; 	Write_LCDCOM(DISPLAY_ON);				//ON DISPLAY
	ldi R16,175
	xcall _Write_LCDCOM
	.dbline 30
; 	Write_LCDCOM(START_LINE_0);				//STAR DISPLAY
	ldi R16,64
	xcall _Write_LCDCOM
	.dbline 31
; 	Write_LCDCOM(ADC_NORMAL);				//ADC NORMAL
	ldi R16,160
	xcall _Write_LCDCOM
	.dbline 32
; 	Write_LCDCOM(DISPLAY_NORMAL);			//Display normal
	ldi R16,166
	xcall _Write_LCDCOM
	.dbline 33
; 	Write_LCDCOM(ALL_POINT_NORMAL);			//CLEAR
	ldi R16,164
	xcall _Write_LCDCOM
	.dbline 34
; 	Write_LCDCOM(BIAS_1_9);					//1/9BIAS
	ldi R16,162
	xcall _Write_LCDCOM
	.dbline 35
; 	Write_LCDCOM(OUTPUT_MPDE_REVERSE);		//COMMON OUTPUT DIRECTION
	ldi R16,200
	xcall _Write_LCDCOM
	.dbline 36
; 	Write_LCDCOM(POWER);					//POWER CONTROL
	ldi R16,47
	xcall _Write_LCDCOM
	.dbline 37
; 	Write_LCDCOM(RESISTOR_RATION);			//RESISTER RATIO
	ldi R16,36
	xcall _Write_LCDCOM
	.dbline 38
; 	Write_LCDCOM(HIBYTE(ELECTRONIC_VOLUME));//VOLUM MODE SET
	ldi R16,129
	xcall _Write_LCDCOM
	.dbline 39
; 	Write_LCDCOM(LOBYTE(ELECTRONIC_VOLUME));
	ldi R16,36
	xcall _Write_LCDCOM
	.dbline 41
; 	
; 	Clear_LCD();
	xcall _Clear_LCD
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Write_LCDCOM _Write_LCDCOM fV
;        command -> R16
	.even
_Write_LCDCOM::
	.dbline -1
	.dbline 49
; }
; 
; 
; /*************************************************/
; //Write command
; /*************************************************/
; void Write_LCDCOM(BYTE command)
; {
	.dbline 50
; 	LCD_AO_IO &= ~BIT(LCD_AO_PIN);
	cbi 0x12,0
	.dbline 51
; 	LCD_CS_IO &= ~BIT(LCD_CS_PIN);
	cbi 0x12,2
	.dbline 52
; 	SPDR = (unsigned char)command; 
	out 0xf,R16
L3:
	.dbline 53
; 	while(!(SPSR&(1<<SPIF)));		//Wait for transmission finish 
L4:
	.dbline 53
	sbis 0xe,7
	rjmp L3
X0:
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r command 16 c
	.dbend
	.dbfunc e Write_LCDDATA _Write_LCDDATA fV
;           data -> R16
	.even
_Write_LCDDATA::
	.dbline -1
	.dbline 59
; }
; /*************************************************/
; //Write data
; /*************************************************/
; void Write_LCDDATA(BYTE data)
; {
	.dbline 60
; 	LCD_AO_IO |= BIT(LCD_AO_PIN);
	sbi 0x12,0
	.dbline 61
; 	LCD_CS_IO &= ~BIT(LCD_CS_PIN);
	cbi 0x12,2
	.dbline 62
; 	SPDR = (unsigned char)data; 
	out 0xf,R16
L7:
	.dbline 63
; 	while(!(SPSR&(1<<SPIF)));		//Wait for transmission finish 
L8:
	.dbline 63
	sbis 0xe,7
	rjmp L7
X1:
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbend
	.dbfunc e Clear_LCD _Clear_LCD fV
;           page -> R20
;            seg -> R22
	.even
_Clear_LCD::
	st -y,R20
	st -y,R22
	.dbline -1
	.dbline 70
; }
; 
; /*************************************************/
; //Clear LCD
; /*************************************************/
; void Clear_LCD()
; {
	.dbline 73
; 	unsigned char seg;
; 	unsigned char page;
; 	for(page = PAGE_0; page < PAGE_8; page++) 	//写页地址共8 页0xb0----0xb8
	ldi R20,176
	xjmp L14
L11:
	.dbline 74
; 	{
	.dbline 75
; 		Write_LCDCOM(page);
	mov R16,R20
	xcall _Write_LCDCOM
	.dbline 76
; 		Write_LCDCOM(0x10); 					//列地址,高低字节两次写入,从第0列开始
	ldi R16,16
	xcall _Write_LCDCOM
	.dbline 77
; 		Write_LCDCOM(0x00);
	clr R16
	xcall _Write_LCDCOM
	.dbline 78
; 		for(seg = 0; seg < 128; seg++)			//写128列
	clr R22
	xjmp L18
L15:
	.dbline 79
; 		{ 
	.dbline 80
; 			Write_LCDDATA(0x00);
	clr R16
	xcall _Write_LCDDATA
	.dbline 81
; 		}
L16:
	.dbline 78
	inc R22
L18:
	.dbline 78
	cpi R22,128
	brlo L15
X2:
	.dbline 82
; 	}
L12:
	.dbline 73
	inc R20
L14:
	.dbline 73
	cpi R20,184
	brlo L11
X3:
	.dbline -2
L10:
	.dbline 0 ; func end
	ld R22,y+
	ld R20,y+
	ret
	.dbsym r page 20 c
	.dbsym r seg 22 c
	.dbend
	.dbfunc e DispEN_LCD _DispEN_LCD fV
;            seg -> R20
;            ptr -> R10,R11
;         column -> R12,R13
;           page -> R14
	.even
_DispEN_LCD::
	xcall push_xgset30FC
	movw R12,R18
	mov R14,R16
	ldd R10,y+8
	ldd R11,y+9
	.dbline -1
	.dbline 89
; }
; 
; /*************************************************/
; //Display English words
; /*************************************************/
; void DispEN_LCD(BYTE page, WORD column, BYTE *ptr)
; {
	.dbline 92
; 	unsigned char seg;
; 	
; 	Write_LCDCOM(page);
	mov R16,R14
	xcall _Write_LCDCOM
	.dbline 93
; 	Write_LCDCOM(HIBYTE(column)); 	//列地址,高低字节两次写入
	movw R16,R12
	mov R16,R17
	clr R17
	andi R17,0
	xcall _Write_LCDCOM
	.dbline 94
; 	Write_LCDCOM(LOBYTE(column));
	mov R16,R12
	xcall _Write_LCDCOM
	.dbline 96
; 
; 	for(seg = 0; seg < 8; seg++)	//写8列
	clr R20
	xjmp L23
L20:
	.dbline 97
; 	{ 
	.dbline 98
; 		Write_LCDDATA((BYTE)(*ptr++));
	movw R30,R10
	ld R16,Z+
	movw R10,R30
	xcall _Write_LCDDATA
	.dbline 99
; 	}
L21:
	.dbline 96
	inc R20
L23:
	.dbline 96
	cpi R20,8
	brlo L20
X4:
	.dbline -2
L19:
	.dbline 0 ; func end
	xjmp pop_xgset30FC
	.dbsym r seg 20 c
	.dbsym r ptr 10 pc
	.dbsym r column 12 s
	.dbsym r page 14 c
	.dbend
	.dbfunc e DispCN_LCD _DispCN_LCD fV
;         offset -> R20
;            seg -> R22
;            ptr -> R10,R11
;         column -> R12,R13
;           page -> R14
	.even
_DispCN_LCD::
	xcall push_xgsetF0FC
	movw R12,R18
	mov R14,R16
	ldd R10,y+10
	ldd R11,y+11
	.dbline -1
	.dbline 106
; }
; 
; /*************************************************/
; //Display Chinese words
; /*************************************************/
; void DispCN_LCD(BYTE page, WORD column, BYTE *ptr)
; {
	.dbline 109
; 	unsigned char seg;
; 	unsigned char offset;
; 	for(offset = 0; offset < 2; offset++)
	clr R20
	xjmp L28
L25:
	.dbline 110
; 	{
	.dbline 111
; 		Write_LCDCOM((BYTE)(page + offset));
	mov R2,R20
	clr R3
	mov R16,R14
	clr R17
	add R16,R2
	adc R17,R3
	xcall _Write_LCDCOM
	.dbline 112
; 		Write_LCDCOM(HIBYTE(column)); 	//列地址,高低字节两次写入
	movw R16,R12
	mov R16,R17
	clr R17
	andi R17,0
	xcall _Write_LCDCOM
	.dbline 113
; 		Write_LCDCOM(LOBYTE(column));
	mov R16,R12
	xcall _Write_LCDCOM
	.dbline 115
; 		
; 		for(seg = 0; seg < 16; seg++)	//写16列
	clr R22
	xjmp L32
L29:
	.dbline 116
; 		{ 
	.dbline 117
; 			Write_LCDDATA((BYTE)(*ptr++));
	movw R30,R10
	ld R16,Z+
	movw R10,R30
	xcall _Write_LCDDATA
	.dbline 118
; 		}
L30:
	.dbline 115
	inc R22
L32:
	.dbline 115
	cpi R22,16
	brlo L29
X5:
	.dbline 119
; 	}
L26:
	.dbline 109
	inc R20
L28:
	.dbline 109
	cpi R20,2
	brlo L25
X6:
	.dbline -2
L24:
	.dbline 0 ; func end
	xjmp pop_xgsetF0FC
	.dbsym r offset 20 c
	.dbsym r seg 22 c
	.dbsym r ptr 10 pc
	.dbsym r column 12 s
	.dbsym r page 14 c
	.dbend
; }

⌨️ 快捷键说明

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