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

📄 lcddrive.s

📁 AVR-MEGA8单片机中使用AD转换的一个例子
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module LCDDrive.C
	.area text(rom, con, rel)
	.dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
	.area lit(rom, con, rel)
_CharMap::
	.byte 128,129
	.byte 130,131
	.byte 132,133
	.byte 134,135
	.byte 144,145
	.byte 146,147
	.byte 148,149
	.byte 150,151
	.byte 136,137
	.byte 138,139
	.byte 140,141
	.byte 142,143
	.byte 152,153
	.byte 154,155
	.byte 156,157
	.byte 158,159
	.dbfile D:\学习\AVRpro\Mega8程序\TestADC\FontModel.h
	.dbsym e CharMap _CharMap A[32:4:8]kc
	.area text(rom, con, rel)
	.dbfile D:\学习\AVRpro\Mega8程序\TestADC\FontModel.h
	.dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
	.dbfunc e Delay_1ms _Delay_1ms fV
;              j -> R16,R17
	.even
_Delay_1ms::
	.dbline -1
	.dbline 22
; //*********************************************
;  //MCU:ATMEL AVR MEGA8 ,晶振频率:8MHz,频率越高,播放Mp3越流畅
;  //LCD:128*64
;  //LCD型号:FYD12864-0402B
;  //制作人:平顶山工学院计算机系,郭猛
; //*********************************************
; # include "iom8v.h"
; # include "macros.h"
; #include <math.h>
; #include "FontModel.h"
; #include "LCDFun.h"
; 
; //LCD驱动用到的变量:
; uchar LCD_COM;		//LCD控制命令字
; uchar LCD_DAT;		//LCD数据
; //绘图方式下的坐标:
; uchar AC_X;			//X坐标
; uchar AC_Y;			//Y坐标
; 
; //延时1ms
; void Delay_1ms(void)
; {	 
	.dbline 24
; 	 unsigned int j;
; 	 for(j=1;j<(unsigned int)(XTAL*143-2);j++) NOP();
	ldi R16,1
	ldi R17,0
	rjmp L5
L2:
	.dbline 24
	nop
L3:
	.dbline 24
	subi R16,255  ; offset = 1
	sbci R17,255
L5:
	.dbline 24
	ldi R24,1142
	ldi R25,4
	cp R16,R24
	cpc R17,R25
	brlo L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r j 16 i
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R10
;              j -> R20
;              n -> R12,R13
	.even
_Delay::
	rcall push_xgset303C
	movw R12,R16
	.dbline -1
	.dbline 29
; }
; /*******************************************延时子程序**********************************************/
; ///////////////////n的取值最好不要超过500!!!
; void Delay(unsigned int n)
; {
	.dbline 31
; 	uchar i,j;
; 	for(i=0;i<(uchar)(n/100);i++)
	clr R10
	rjmp L10
L7:
	.dbline 32
; 	  for(j=0;j<100;j++) Delay_1ms();   //100mS
	clr R20
	rjmp L14
L11:
	.dbline 32
	rcall _Delay_1ms
L12:
	.dbline 32
	inc R20
L14:
	.dbline 32
	cpi R20,100
	brlo L11
X1:
L8:
	.dbline 31
	inc R10
L10:
	.dbline 31
	ldi R18,100
	ldi R19,0
	movw R16,R12
	rcall div16u
	cp R10,R16
	brlo L7
X2:
	.dbline -2
L6:
	.dbline 0 ; func end
	rjmp pop_xgset303C
	.dbsym r i 10 c
	.dbsym r j 20 c
	.dbsym r n 12 i
	.dbend
	.dbfunc e LCD_AK_Control _LCD_AK_Control fV
;          OnOff -> R16
	.even
_LCD_AK_Control::
	.dbline -1
	.dbline 37
; }
; 
; //*************************************LCD背光控制***************************************
; void LCD_AK_Control(uchar OnOff)			//On0FF=1,背光显示开;
; {
	.dbline 38
; 	if(OnOff) CLRPORT(LCD_AK); else SETPORT(LCD_AK);
	tst R16
	breq L16
X3:
	.dbline 38
	cbi 0x12,3
	rjmp L17
L16:
	.dbline 38
	sbi 0x12,3
L17:
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbsym r OnOff 16 c
	.dbend
	.dbfunc e SendToSID _SendToSID fV
;        bitcode -> R20
;              i -> R10
;            dat -> R18
;         bitNum -> R16
	.even
_SendToSID::
	st -y,R10
	st -y,R20
	.dbline -1
	.dbline 42
; }
; 
; void SendToSID(unsigned char bitNum, unsigned char dat)//向串行数据线发送指定位数一个数据
; {
	.dbline 44
; 	unsigned char i,bitcode;
; 	for(i=0;i<bitNum;i++)
	clr R10
	rjmp L22
L19:
	.dbline 45
; 	{
	.dbline 46
; 	 	bitcode=dat & 0x80;
	mov R20,R18
	andi R20,128
	.dbline 47
; 		if(bitcode!=0) SETPORT(SID); else CLRPORT(SID); //SID = dat & 0x80;
	breq L23
X4:
	.dbline 47
	sbi 0x12,6
	rjmp L24
L23:
	.dbline 47
	cbi 0x12,6
L24:
	.dbline 48
; 		dat = dat << 1;
	lsl R18
	.dbline 49
; 		CLRPORT(SCLK); 	  	 	//SCLK = 0;
	cbi 0x12,7
	.dbline 50
; 		SETPORT(SCLK);	 		//SCLK = 1;
	sbi 0x12,7
	.dbline 51
; 		CLRPORT(SCLK);			//SCLK = 0; 
	cbi 0x12,7
	.dbline 52
; 	}
L20:
	.dbline 44
	inc R10
L22:
	.dbline 44
	cp R10,R16
	brlo L19
X5:
	.dbline -2
L18:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r bitcode 20 c
	.dbsym r i 10 c
	.dbsym r dat 18 c
	.dbsym r bitNum 16 c
	.dbend
	.dbfunc e Write_LCD_Com _Write_LCD_Com fV
;        SynCode -> R20
	.even
_Write_LCD_Com::
	st -y,R20
	.dbline -1
	.dbline 57
; }
; 
; //*************************************写入LCD控制字******************************
; void Write_LCD_Com(void)						//对LCD写入控制命令
; {
	.dbline 60
; 	//	SynCode为同步码
; 	unsigned char SynCode;
; 	CLRPORT(CS);	//CS=0;
	cbi 0x12,5
	.dbline 61
; 	SETPORT(CS);	//CS=1;
	sbi 0x12,5
	.dbline 63
; 
; 	SynCode = 0xFF;	 		 	//同步码
	ldi R20,255
	.dbline 64
; 	SendToSID(5,SynCode);
	mov R18,R20
	ldi R16,5
	rcall _SendToSID
	.dbline 66
; 
; 	SynCode = 0x00;	 		 	//写入代码RW,RS,0,3位代码
	clr R20
	.dbline 67
; 	SendToSID(3,SynCode);
	mov R18,R20
	ldi R16,3
	rcall _SendToSID
	.dbline 69
; 
; 	SynCode = LCD_COM & 0xF0;	//写入代码COM数据的高四位 要发送的数据格式是XXXX0000
	lds R20,_LCD_COM
	andi R20,240
	.dbline 70
; 	SendToSID(8,SynCode);
	mov R18,R20
	ldi R16,8
	rcall _SendToSID
	.dbline 72
; 
; 	SynCode = LCD_COM & 0x0F;	//写入代码COM数据的低四位	0000XXXX
	lds R20,_LCD_COM
	andi R20,15
	.dbline 73
; 	SynCode = SynCode<<4;    	//要发送的数据格式是XXXX0000
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 74
; 	SendToSID(8,SynCode);
	mov R18,R24
	ldi R16,8
	rcall _SendToSID
	.dbline 75
; 	Delay_1ms() ;	//必要的延时
	rcall _Delay_1ms
	.dbline -2
L25:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r SynCode 20 c
	.dbend
	.dbfunc e Write_LCD_Data _Write_LCD_Data fV
;        bitcode -> R10
;       iSynCode -> R22
;        SynCode -> R20
	.even
_Write_LCD_Data::
	rcall push_xgsetF00C
	.dbline -1
	.dbline 80
; }
; 
; //*************************************写入LCD数据**********************************
; void Write_LCD_Data(void)						//对LCD写入8位数据
; {
	.dbline 84
; 	//	iSynCode为同步码计数器,同步码为5位,	SynCode为同步码
; 	unsigned char iSynCode,SynCode;
; 	uchar bitcode;
; 	CLRPORT(CS);	//CS=0;
	cbi 0x12,5
	.dbline 85
; 	SETPORT(CS);	//CS=1;
	sbi 0x12,5
	.dbline 87
; 
; 	SynCode = 0xFF;	 //同步码
	ldi R20,255
	.dbline 88
; 	SendToSID(5,SynCode);
	mov R18,R20
	ldi R16,5
	rcall _SendToSID
	.dbline 89
; 	SynCode = 0x40;	 //写入代码RW,RS,0,3位代码
	ldi R20,64
	.dbline 90
; 	SendToSID(3,SynCode);
	mov R18,R20
	ldi R16,3
	rcall _SendToSID
	.dbline 92
; 
; 	SynCode = LCD_DAT & 0xF0;	 //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
	lds R20,_LCD_DAT
	andi R20,240
	.dbline 93
; 	for(iSynCode=0;iSynCode<8;iSynCode++)
	clr R22
	rjmp L30
L27:
	.dbline 94
; 	{
	.dbline 95
; 		bitcode = SynCode & 0x80;
	mov R24,R20
	andi R24,128
	mov R10,R24
	.dbline 96
; 		if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;	
	tst R24
	breq L31
X6:
	.dbline 96
	sbi 0x12,6
	rjmp L32
L31:
	.dbline 96
	cbi 0x12,6
L32:
	.dbline 97
; 		SynCode = SynCode << 1;
	lsl R20
	.dbline 98
; 		CLRPORT(SCLK); 	  	 	//SCLK = 0;
	cbi 0x12,7
	.dbline 99
; 		SETPORT(SCLK);	 		//SCLK = 1;
	sbi 0x12,7
	.dbline 100
; 		CLRPORT(SCLK);			//SCLK = 0; 
	cbi 0x12,7
	.dbline 102
; 		
; 	}
L28:
	.dbline 93
	inc R22
L30:
	.dbline 93
	cpi R22,8
	brlo L27
X7:
	.dbline 103
; 	SynCode = LCD_DAT & 0x0F;	 //写入代码COM数据的低四位	0000XXXX
	lds R20,_LCD_DAT
	andi R20,15
	.dbline 104
; 	SynCode = SynCode<<4;    //要发送的数据格式是XXXX0000
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 105
; 	for(iSynCode=0;iSynCode<8;iSynCode++)
	clr R22
	rjmp L36
L33:
	.dbline 106
; 	{
	.dbline 107
; 		bitcode = SynCode & 0x80;
	mov R24,R20
	andi R24,128
	mov R10,R24
	.dbline 108
; 		if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;	
	tst R24
	breq L37
X8:
	.dbline 108
	sbi 0x12,6
	rjmp L38
L37:
	.dbline 108
	cbi 0x12,6
L38:
	.dbline 109
; 		SynCode = SynCode << 1;
	lsl R20
	.dbline 110
; 		CLRPORT(SCLK); 	  	 	//SCLK = 0;
	cbi 0x12,7
	.dbline 111
; 		SETPORT(SCLK);	 		//SCLK = 1;
	sbi 0x12,7
	.dbline 112
; 		CLRPORT(SCLK);			//SCLK = 0; 
	cbi 0x12,7
	.dbline 113
; 	}
L34:
	.dbline 105
	inc R22
L36:
	.dbline 105
	cpi R22,8
	brlo L33
X9:
	.dbline 114
; 	Delay_1ms();
	rcall _Delay_1ms
	.dbline -2
L26:
	.dbline 0 ; func end
	rjmp pop_xgsetF00C
	.dbsym r bitcode 10 c
	.dbsym r iSynCode 22 c
	.dbsym r SynCode 20 c
	.dbend
	.dbfunc e LCD_Ini _LCD_Ini fV
	.even
_LCD_Ini::
	.dbline -1
	.dbline 124
; }
; 
; //*************************************LCD屏幕初始化**************************************
; //LCD接口:
; //CS    <==>PD5;
; //SID   <==>PD6;
; //SCLK  <==>PD7;
; //LCD_AK<==>PD3;		//背光控制,=0时打开背光
; void LCD_Ini(void)				//初始化,并进入文本模式				
; {
	.dbline 126
; 	//LCD端口初始化,将PD7~PD5端口设置为输出方式
; 	DDRD|=0xE0;
	in R24,0x11
	ori R24,224
	out 0x11,R24
	.dbline 127
; 	_NOP();
	nop
	.dbline 129
; 
; 	LCD_COM =0x30;//功能设置为8BIT控制界面,基本指令集
	ldi R24,48
	sts _LCD_COM,R24
	.dbline 130
; 	Write_LCD_Com();//调用写指令子程序
	rcall _Write_LCD_Com
	.dbline 131
; 	Delay(5);//39uS
	ldi R16,5
	ldi R17,0
	rcall _Delay
	.dbline 133
;  
; 	LCD_COM =0x0C;//显示打开,光标关,反白不显示
	ldi R24,12
	sts _LCD_COM,R24
	.dbline 134
; 	Write_LCD_Com();//调用写指令子程序
	rcall _Write_LCD_Com
	.dbline 135
; 	Delay(5);//39uS
	ldi R16,5
	ldi R17,0
	rcall _Delay
	.dbline 137
; 
; 	LCD_COM =0x01;//清除屏幕显示,将DDRAM的地址计数器归零
	ldi R24,1
	sts _LCD_COM,R24
	.dbline 138
; 	Write_LCD_Com();//调用写指令子程序
	rcall _Write_LCD_Com
	.dbline 139
; 	Delay(5);//39uS
	ldi R16,5
	ldi R17,0
	rcall _Delay

⌨️ 快捷键说明

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