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

📄 lcd12864.s

📁 这是用于atmega128控制12864显示的源程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module lcd12864.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\018-LCD12864\lcd12864.c
	.dbfunc e delay_us _delay_us fV
;              n -> R16,R17
	.even
_delay_us::
	.dbline -1
	.dbline 33
; /*
; 	LCD12864液晶屏驱动模块
; 	1、可直接嵌入到项目中使用
; 	2、晶振频率:1M
; 	3、如晶振提高低层驱动延时要作相应修改
; 
; 	AVR_AFA
; 	www.iccavr.com
; */
; 
; #include <iom128v.h>
; #include "font.h"
; 
; #define RS_CLR	PORTC &= ~(1 << PC2)		/*命令或数据选择*/
; #define RS_SET	PORTC |= (1 << PC2)			/*RS = 1命令,RS = 0数据*/
; 
; #define RW_CLR	PORTC &= ~(1 << PC3)		/*读取或写入选择*/
; #define RW_SET	PORTC |= (1 << PC3)			/*RW = 1读,RW = 0写*/
; 
; #define EN_CLR	PORTC &= ~(1 << PC4)		/*读写使能信号*/
; #define EN_SET	PORTC |= (1 << PC4)			/*下降沿有效*/
; 
; #define RST_CLR	PORTC &= ~(1 << PC5)		/*芯片复位脚*/
; #define RST_SET	PORTC |= (1 << PC5)			/*高电平复位*/
; 
; #define CSA_CLR	PORTC &= ~(1 << PC7)		/*左半屏片选*/
; #define CSA_SET	PORTC |= (1 << PC7)			/*高电平选中*/
; 
; #define CSB_CLR	PORTC &= ~(1 << PC6)		/*右半屏片选*/
; #define CSB_SET	PORTC |= (1 << PC6)			/*高电平选中*/
; 
; /*延时函数*/
; void delay_us(unsigned int n) {
	.dbline 35
; 
; 	if (n == 0) {
	cpi R16,0
	cpc R16,R17
	brne L5
X0:
	.dbline 35
	.dbline 36
; 		return ;
	xjmp L1
L4:
	.dbline 38
L5:
	.dbline 38
; 		}
; 	while (--n);
	movw R24,R16
	sbiw R24,1
	movw R16,R24
	cpi R16,0
	cpc R16,R17
	brne L4
X1:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r n 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              a -> R20
;              b -> R22
;              i -> R16
	.even
_delay_ms::
	xcall push_gset2
	.dbline -1
	.dbline 42
; }
; 
; /*延时函数*/
; void delay_ms(unsigned char i) {
	.dbline 45
	ldi R20,1
	xjmp L11
L8:
	.dbline 45
; 
; 	unsigned char a, b;
; 	for (a = 1; a < i; a++) {
	.dbline 46
	ldi R22,1
	xjmp L15
L12:
	.dbline 46
	.dbline 47
	.dbline 48
L13:
	.dbline 46
	inc R22
L15:
	.dbline 46
	tst R22
	brne L12
	.dbline 49
L9:
	.dbline 45
	inc R20
L11:
	.dbline 45
	cp R20,R16
	brlo L8
	.dbline -2
L7:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r a 20 c
	.dbsym r b 22 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e LCD0_write_com _LCD0_write_com fV
;            com -> R20
	.even
_LCD0_write_com::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 53
; 		for (b = 1; b; b++) {
; 			;
; 			}
; 		}
; }
; 
; /*显示屏命令写入函数前半屏*/
; void LCD0_write_com(unsigned char com) {
	.dbline 55
; 	
; 	RS_CLR;
	cbi 0x15,2
	.dbline 56
; 	RW_CLR;
	cbi 0x15,3
	.dbline 57
; 	CSA_SET;
	sbi 0x15,7
	.dbline 58
; 	CSB_CLR;
	cbi 0x15,6
	.dbline 59
; 	EN_SET;
	sbi 0x15,4
	.dbline 60
; 	PORTA = com;
	out 0x1b,R20
	.dbline 61
; 	delay_us(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_us
	.dbline 62
; 	EN_CLR;
	cbi 0x15,4
	.dbline -2
L16:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r com 20 c
	.dbend
	.dbfunc e LCD1_write_com _LCD1_write_com fV
;            com -> R20
	.even
_LCD1_write_com::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 66
; }
; 
; /*显示屏命令写入函数后半屏*/
; void LCD1_write_com(unsigned char com) {
	.dbline 68
; 	
; 	RS_CLR;
	cbi 0x15,2
	.dbline 69
; 	RW_CLR;
	cbi 0x15,3
	.dbline 70
; 	CSA_CLR;
	cbi 0x15,7
	.dbline 71
; 	CSB_SET;
	sbi 0x15,6
	.dbline 72
; 	EN_SET;
	sbi 0x15,4
	.dbline 73
; 	PORTA = com;
	out 0x1b,R20
	.dbline 74
; 	delay_us(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_us
	.dbline 75
; 	EN_CLR;
	cbi 0x15,4
	.dbline -2
L17:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r com 20 c
	.dbend
	.dbfunc e LCD0_write_data _LCD0_write_data fV
;           data -> R20
	.even
_LCD0_write_data::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 79
; }
; 
; /*显示屏命令写入函数*/
; void LCD0_write_data(unsigned char data) {
	.dbline 81
; 
; 	RS_SET;
	sbi 0x15,2
	.dbline 82
; 	RW_CLR;
	cbi 0x15,3
	.dbline 83
; 	CSA_SET;
	sbi 0x15,7
	.dbline 84
; 	CSB_CLR;
	cbi 0x15,6
	.dbline 85
; 	EN_SET;
	sbi 0x15,4
	.dbline 86
; 	PORTA = data;
	out 0x1b,R20
	.dbline 87
; 	delay_us(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_us
	.dbline 88
; 	EN_CLR;
	cbi 0x15,4
	.dbline -2
L18:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD1_write_data _LCD1_write_data fV
;           data -> R20
	.even
_LCD1_write_data::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 92
; }
; 
; /*显示屏命令写入函数*/
; void LCD1_write_data(unsigned char data) {
	.dbline 94
; 
; 	RS_SET;
	sbi 0x15,2
	.dbline 95
; 	RW_CLR;
	cbi 0x15,3
	.dbline 96
; 	CSA_CLR;
	cbi 0x15,7
	.dbline 97
; 	CSB_SET;
	sbi 0x15,6
	.dbline 98
; 	EN_SET;
	sbi 0x15,4
	.dbline 99
; 	PORTA = data;
	out 0x1b,R20
	.dbline 100
; 	delay_us(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_us
	.dbline 101
; 	EN_CLR;
	cbi 0x15,4
	.dbline -2
L19:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e disp_clear _disp_clear fV
;              x -> R20
;              y -> R10
;             x1 -> R22
;             x0 -> R12
	.even
_disp_clear::
	xcall push_gset4
	mov R22,R18
	mov R12,R16
	ldd R10,y+8
	.dbline -1
	.dbline 105
; }
; 
; /*显示屏清空显示*/
; void disp_clear(unsigned char x0, unsigned char x1, unsigned char y) {
	.dbline 110
; 
; 	unsigned char x;
; 	
; 	/*清除高位*/	
; 	x = x0;
	mov R20,R12
	.dbline 111
; 	if (x < 63) {						/*地址在左半屏范围内*/
	cpi R20,63
	brsh L24
	.dbline 111
	.dbline 112
; 		LCD0_write_com(y | 0xB8);
	mov R16,R10
	ori R16,184
	xcall _LCD0_write_com
	.dbline 113
; 		LCD0_write_com(x | 0x40);
	mov R16,R20
	ori R16,64
	xcall _LCD0_write_com
	.dbline 114
; 		}
	xjmp L24
L23:
	.dbline 115
; 	while (x < x1) {
	.dbline 116
; 		LCD0_write_data(0x00);
	clr R16
	xcall _LCD0_write_data
	.dbline 117
; 		x ++;
	inc R20
	.dbline 118
; 		if (x > 63) {					/*判断地址是否越界*/
	ldi R24,63
	cp R24,R20
	brsh L26
	.dbline 118
	.dbline 119
; 			break;
	xjmp L25
L26:
	.dbline 121
L24:
	.dbline 115
	cp R20,R22
	brlo L23
L25:
	.dbline 122
; 			}
; 		}
; 	if (x < x1) {						/*地址进入左半屏范围*/
	cp R20,R22
	brsh L31
	.dbline 122
	.dbline 123
; 		LCD1_write_com(y | 0xB8);
	mov R16,R10
	ori R16,184
	xcall _LCD1_write_com
	.dbline 124
; 		LCD1_write_com(x | 0x40);
	mov R16,R20
	ori R16,64
	xcall _LCD1_write_com
	.dbline 125
; 		}
	xjmp L31
L30:
	.dbline 126
	.dbline 127
	clr R16
	xcall _LCD1_write_data
	.dbline 128
	inc R20
	.dbline 129
L31:
	.dbline 126
; 	while (x < x1) {
	cp R20,R22
	brlo L30
	.dbline 132
; 		LCD1_write_data(0x00);
; 		x ++;
; 		}
; 
; 	/*清除低位*/
; 	x = x0;
	mov R20,R12
	.dbline 133
; 	if (x < 63) {						/*地址在左半屏范围内*/
	cpi R20,63
	brsh L36
	.dbline 133
	.dbline 134
; 		LCD0_write_com((y+1) | 0xB8);
	mov R16,R10
	subi R16,255    ; addi 1
	ori R16,184
	xcall _LCD0_write_com
	.dbline 135
; 		LCD0_write_com(x | 0x40);
	mov R16,R20
	ori R16,64
	xcall _LCD0_write_com
	.dbline 136
; 		}
	xjmp L36
L35:
	.dbline 137
; 	while (x < x1) {
	.dbline 138
; 		LCD0_write_data(0x00);
	clr R16
	xcall _LCD0_write_data
	.dbline 139
; 		x ++;
	inc R20
	.dbline 140
; 		if (x > 63) {					/*判断地址是否越界*/
	ldi R24,63
	cp R24,R20
	brsh L38
	.dbline 140
	.dbline 141
; 			break;
	xjmp L37
L38:
	.dbline 143
L36:
	.dbline 137
	cp R20,R22
	brlo L35
L37:
	.dbline 144
; 			}
; 		}
; 	if (x < x1) {						/*地址进入左半屏范围*/
	cp R20,R22
	brsh L43
	.dbline 144
	.dbline 145
; 		LCD1_write_com((y+1) | 0xB8);
	mov R16,R10
	subi R16,255    ; addi 1
	ori R16,184
	xcall _LCD1_write_com
	.dbline 146
; 		LCD1_write_com(x | 0x40);
	mov R16,R20
	ori R16,64
	xcall _LCD1_write_com
	.dbline 147
; 		}
	xjmp L43
L42:
	.dbline 148
	.dbline 149
	clr R16
	xcall _LCD1_write_data
	.dbline 150
	inc R20
	.dbline 151
L43:
	.dbline 148
; 	while (x < x1) {
	cp R20,R22
	brlo L42
	.dbline -2
L20:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r x 20 c
	.dbsym r y 10 c
	.dbsym r x1 22 c
	.dbsym r x0 12 c
	.dbend
	.dbfunc e disp_char _disp_char fV
;              q -> R20,R21
;              i -> R22
;          ascii -> y+8
;              y -> R12
;              x -> R10
	.even
_disp_char::
	xcall push_gset4
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 155
; 		LCD1_write_data(0x00);
; 		x ++;
; 		}
; }
; 
; /*在指定位置显示一个ASCII 字符*/
; void disp_char(unsigned char x, unsigned char y, unsigned char ascii) {
	.dbline 157
; 
; 	unsigned char i = 0x00;
	clr R22
	.dbline 160
; 	const unsigned char *q;				/*取字库指针*/
; 	
; 	ascii -= 0x20;
	ldd R24,y+8
	subi R24,32
	std y+8,R24
	.dbline 161
; 	q = &ENGLISH_FONT[ascii * 16];		/*定位指针地址*/
	ldi R24,16
	ldd R0,y+8
	mul R24,R0
	movw R20,R0
	ldi R24,<_ENGLISH_FONT
	ldi R25,>_ENGLISH_FONT
	add R20,R24
	adc R21,R25
	.dbline 164
; 
; 	/*显示高8位*/	
; 	i = 0x00;
	.dbline 165
; 	if (x < 64) {						/*地址在左半屏范围内*/
	mov R24,R10
	cpi R24,64
	brsh L46
	.dbline 165
	.dbline 166
; 		LCD0_write_com(y | 0xB8);
	mov R16,R12
	ori R16,184
	xcall _LCD0_write_com
	.dbline 167
; 		LCD0_write_com(x | 0x40);
	mov R16,R10
	ori R16,64
	xcall _LCD0_write_com
	xjmp L49
L48:
	.dbline 168
; 		while (i < 8) {
	.dbline 169
; 			LCD0_write_data(*q);

⌨️ 快捷键说明

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