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

📄 yj1602.s

📁 AVR单片机开发版资料测试程序里的源程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module YJ1602.C
	.area text(rom, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 28
; /*******************************************
;   文件:YJ1602.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2006年12月10日 
;   功能:驱动开发板上的1602液晶
;   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #include <stdio.h>			//标准输入输出头文件
; #include <AVR_PQ1A.h>		//包含自定义常量头文件
; 
; #pragma data:code
; const uchar CGRAM[LCDa_CGMAX] =
; {
; 	//8*5字模
; 	0x00,0x01,0x1F,0x11,0x1F,0x01,0x01,0x01,		// 第1、2行显示"中"字
; 	0x00,0x00,0x1E,0x02,0x1E,0x00,0x00,0x00,		
; 	0x00,0x01,0x1F,0x04,0x02,0x01,0x02,0x04,		// 第3、4行显示"文"字
; 	0x00,0x00,0x1f,0x04,0x08,0x10,0x08,0x04,		
; 	0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01,		// 第5、6行显示心型
; 	0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,		
; 	0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01,		// 第7、8行显示心型
; 	0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,		
; };
; #pragma data:data
; /*******************************************
	.dbline 30
; 函数名称: LCD1602_portini
; 功    能: 初始化1602液晶用到的IO口
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 31
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 31
L3:
	.dbline 31
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 31
; 参    数: 无
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
	.dbline 32
; 返回值  : 无
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r US 22 i
	.dbend
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             MS -> R16,R17
	.even
_Delayms::
	xcall push_gset2
	.dbline -1
	.dbline 40
; /********************************************/
; void LCD1602_portini(void)
; {
; 	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
; 	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
; }
; /*******************************************
; 函数名称: LCD1602_readbyte
	.dbline 42
; 功    能: 从1602液晶读出一个字节数据或者指令
; 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 43
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 43
L12:
	.dbline 43
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 43
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L11
L8:
	.dbline 42
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 42
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 44
; 返回值  : dByte--读回的数据或者指令
; /********************************************/
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r MS 16 i
	.dbend
	.dbfunc e Board_init _Board_init fV
	.even
_Board_init::
	.dbline -1
	.dbline 52
; uchar LCD1602_readbyte(uchar DatCmd)
; {
;  	uchar dByte;
; 	if (DatCmd == iCmd)		 //指令操作
; 		LCDa_CLR_RS;
; 	else
; 		LCDa_SET_RS;
; 		
	.dbline 53
; 	LCDa_SET_RW;	   	  	 //读操作
	ldi R24,255
	out 0x1a,R24
	.dbline 54
; 	LCDa_SET_E;
	out 0x17,R24
	.dbline 55
; 	LCDa_DATA_DDR=0x00;	 //数据总线定义为输入
	out 0x14,R24
	.dbline 56
; 	dByte=LCDa_DI;			 //读数据或者指令
	out 0x11,R24
	.dbline 58
; 	Delayms(1);				 //时序调整
; 	LCDa_CLR_E;	
	clr R2
	out 0xd,R2
	.dbline 60
; 	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
; 	return dByte;
	sbi 0x1b,6
	.dbline 61
; }
	cbi 0x15,6
	.dbline 62
; /*******************************************
	cbi 0x1b,1
	.dbline 63
; 函数名称: LCD1602_sendbyte
	out 0x18,R24
	.dbline 64
; 功    能: 向1602液晶写入一个字节数据或者指令
	sbi 0x1b,2
	.dbline 65
; 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 66
; 	  	  dByte--为写入1602的数据或者指令
	cbi 0x1b,2
	.dbline 68
; 返回值  : 无
; /********************************************/
	clr R2
	out 0x18,R2
	.dbline 69
; void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
	sbi 0x1b,3
	.dbline 70
; {
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 71
; 	if (DatCmd == iCmd)		//指令操作
	cbi 0x1b,3
	.dbline 73
; 		LCDa_CLR_RS;
; 	else
	ldi R24,255
	out 0x18,R24
	.dbline 74
; 		LCDa_SET_RS;
	sbi 0x1b,4
	.dbline 75
; 		
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 76
; 	LCDa_CLR_RW;			//写操作
	cbi 0x1b,4
	.dbline 78
; 	LCDa_SET_E;
; 	LCDa_DO = dByte;		//写入数据
	ldi R24,255
	out 0x12,R24
	.dbline 79
; 	Delayms(1);
	sbi 0x1b,7
	.dbline 80
; 	LCDa_CLR_E;	
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 81
; }
	cbi 0x1b,7
	.dbline -2
	.dbline 84
; /*******************************************
; 函数名称: LCD1602_sendstr
; 功    能: 向1602液晶写入一个字符串
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.area code(ram, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.area lit(rom, con, rel)
_CGRAM::
	.byte 0,1
	.byte 31,17
	.byte 31,1
	.byte 1,1
	.byte 0,0
	.byte 30,2
	.byte 30,0
	.byte 0,0
	.byte 0,1
	.byte 31,4
	.byte 2,1
	.byte 2,4
	.byte 0,0
	.byte 31,4
	.byte 8,16
	.byte 8,4
	.byte 0,14
	.byte 17,16
	.byte 8,4
	.byte 2,1
	.byte 0,14
	.byte 17,1
	.byte 2,4
	.byte 8,16
	.byte 0,14
	.byte 17,16
	.byte 8,4
	.byte 2,1
	.byte 0,14
	.byte 17,1
	.byte 2,4
	.byte 8,16
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
	.dbsym e CGRAM _CGRAM A[64:64]c
	.area data(ram, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
	.dbfunc e LCD1602_portini _LCD1602_portini fV
	.even
_LCD1602_portini::
	.dbline -1
	.dbline 35
	.dbline 36
	in R24,0x11
	ori R24,112
	out 0x11,R24
	.dbline 37
	in R24,0x17
	ori R24,255
	out 0x17,R24
	.dbline -2
	.dbline 38
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
;          dByte -> R20
;         DatCmd -> R20
	.even
_LCD1602_readbyte::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 46
	.dbline 48
	tst R20
	brne L18
	.dbline 49
	cbi 0x12,4
	xjmp L19
L18:
	.dbline 51
	sbi 0x12,4
L19:
	.dbline 53
	sbi 0x12,5
	.dbline 54
	sbi 0x12,6
	.dbline 55
	clr R2
	out 0x17,R2
	.dbline 56
	in R20,0x16
	.dbline 57
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 58
	cbi 0x12,6
	.dbline 59
	in R24,0x17
	ori R24,255
	out 0x17,R24
	.dbline 60
	mov R16,R20
	.dbline -2
L17:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dByte 20 c
	.dbsym r DatCmd 20 c
	.dbend
	.dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
;          dByte -> R20
;         DatCmd -> R22
	.even
_LCD1602_sendbyte::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 70
	.dbline 71
	tst R22
	brne L21
	.dbline 72
	cbi 0x12,4
	xjmp L22
L21:
	.dbline 74
	sbi 0x12,4
L22:
	.dbline 76
	cbi 0x12,5
	.dbline 77
	sbi 0x12,6
	.dbline 78
	out 0x18,R20
	.dbline 79
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 80
	cbi 0x12,6
	.dbline -2
	.dbline 81
L20:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r dByte 20 c
	.dbsym r DatCmd 22 c
	.dbend
	.dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
;       ptString -> R20,R21
	.even
_LCD1602_sendstr::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 89
; 参    数: ptString--字符串指针
; 返回值  : 无
; /********************************************/
; void LCD1602_sendstr(uchar *ptString)
; {
	xjmp L25
L24:
	.dbline 91
	.dbline 92
	movw R30,R20
	ld R18,Z+
	movw R20,R30
	ldi R16,1
	xcall _LCD1602_sendbyte
	.dbline 93
L25:
	.dbline 90
; 	while((*ptString)!='\0')		 //字符串未结束
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L24
	.dbline -2
	.dbline 94
; 	{
; 		LCD1602_sendbyte(iDat, *ptString++);
; 	}
; }
L23:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ptString 20 pc
	.dbend
	.dbfunc e LCD1602_clear _LCD1602_clear fV
	.even
_LCD1602_clear::
	.dbline -1
	.dbline 102
; /*******************************************
; 函数名称: LCD1602_clear
; 功    能: 1602液晶清屏
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void LCD1602_clear(void)
; {
	.dbline 103
; 	LCD1602_sendbyte(iCmd,LCDa_CLS);
	ldi R18,1
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 104
; 	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!

⌨️ 快捷键说明

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