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

📄 12864-7920.s

📁 16个单片机c语言实验程序
💻 S
字号:
	.module _12864-7920.c
	.area text(rom, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
	.dbfunc e s_ms _s_ms fV
;             ms -> R16,R17
	.even
_s_ms::
	.dbline -1
	.dbline 20
; //12864液晶的试验程序,驱动芯片为ST7920
; //目标板为DDC-16A
; //驱动方式-并口
; //JP10短路块位于右侧,JP1两个短路块均插好
; //调节V0电位器调整对比度
; //注意:因为厂家不同液晶的19脚和20脚(背光)有时会不同,导致背光不亮,需要注意。
; 
; #include <iom16v.h>
; #include <string.h>
; 
; #define uchar unsigned char 
; #define uint unsigned int 
; 
; #define RS (1<<5)
; #define RW (1<<6)
; #define EN (1<<7)
; 
; //延时函数
; void s_ms(uint ms)
; {
	.dbline 21
; 	for(;ms>1;ms--);
	xjmp L5
L2:
	.dbline 21
L3:
	.dbline 21
	subi R16,1
	sbci R17,0
L5:
	.dbline 21
	ldi R24,1
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlo L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r ms 16 i
	.dbend
	.area data(ram, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
_text_1::
	.blkb 15
	.area idata
	.byte 177,177,190,169,182,171,191,216,191,170,183,162,176,229,0
	.area data(ram, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
	.dbsym e text_1 _text_1 A[15:15]c
_text_2::
	.blkb 14
	.area idata
	.byte 'W,'W,'W,46,'I,'S,'M,'C,'U,46,'C,'O,'M,0
	.area data(ram, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
	.dbsym e text_2 _text_2 A[14:14]c
_text_3::
	.blkb 15
	.area idata
	.byte 'W,'D,'D,95,'C,'N,64,49,50,54,46,'C,'O,'M,0
	.area data(ram, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
	.dbsym e text_3 _text_3 A[15:15]c
_text_4::
	.blkb 10
	.area idata
	.byte 'Q,'Q,58,54,50,49,53,50,48,0
	.area data(ram, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
	.dbsym e text_4 _text_4 A[10:10]c
	.area text(rom, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
	.dbfunc e WriteDataLCM _WriteDataLCM fV
;          WDLCM -> R10
	.even
_WriteDataLCM::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 32
; }	
; 
; //此处定义字符串
; char text_1[]={"北京东控开发板"};
; char text_2[]={"WWW.ISMCU.COM"};
; char text_3[]={"WDD_CN@126.COM"};
; char text_4[]={"QQ:621520"};
; 
; //写数据
; void WriteDataLCM(unsigned char WDLCM)
; {
	.dbline 34
; 	//ReadStatusLCM(); //检测忙
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 35
; 	PORTA|=RS;       //RS=1    
	sbi 0x1b,5
	.dbline 36
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 37
; 	PORTA&=~RW;      //RW=0
	cbi 0x1b,6
	.dbline 38
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 39
; 	PORTA|=EN;       //EN=1
	sbi 0x1b,7
	.dbline 40
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 41
; 	PORTD=WDLCM;     //输出数据
	out 0x12,R10
	.dbline 42
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 43
; 	PORTA&=~EN;      //EN=0
	cbi 0x1b,7
	.dbline 44
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline -2
L6:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r WDLCM 10 c
	.dbend
	.dbfunc e WriteCommandLCM _WriteCommandLCM fV
;          WCLCM -> R10
	.even
_WriteCommandLCM::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 49
; }
; 
; //写指令
; void WriteCommandLCM(unsigned char WCLCM) 
; {
	.dbline 51
; 	//ReadStatusLCM(); //根据需要检测忙
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 52
; 	PORTA&=~RS;      //RS=0
	cbi 0x1b,5
	.dbline 53
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 54
; 	PORTA&=~RW;      //RW=0
	cbi 0x1b,6
	.dbline 55
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 56
; 	PORTA|=EN;       //EN=1
	sbi 0x1b,7
	.dbline 57
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 58
; 	PORTD=WCLCM;     //输出指令
	out 0x12,R10
	.dbline 59
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 60
; 	PORTA&=~EN;      //EN=0
	cbi 0x1b,7
	.dbline 61
; 	s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline -2
L7:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r WCLCM 10 c
	.dbend
	.dbfunc e ReadStatusLCM _ReadStatusLCM fV
;           flag -> R20
;           temp -> R10
	.even
_ReadStatusLCM::
	st -y,R10
	st -y,R20
	.dbline -1
	.dbline 66
; }
; 
; //读状态:检测忙
; void ReadStatusLCM(void)
; {
	.dbline 68
; 	uchar temp;
;     uchar flag = 1;
	ldi R20,1
	xjmp L10
L9:
	.dbline 70
;     while(flag==1)
; 	{
	.dbline 71
; 	    DDRD=0x00;      //端口A改为输入
	clr R2
	out 0x11,R2
	.dbline 72
; 		PORTD=0xff;    
	ldi R24,255
	out 0x12,R24
	.dbline 73
; 		s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 74
; 		PORTA&=~RS;     //RS=0
	cbi 0x1b,5
	.dbline 75
; 		s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 76
; 		PORTA|=RW;      //RW=1
	sbi 0x1b,6
	.dbline 77
; 		s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 78
; 		PORTA|=EN;      //EN=1
	sbi 0x1b,7
	.dbline 79
; 		s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 80
; 		temp = PIND;    //读端口A
	in R10,0x10
	.dbline 81
; 		s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 82
; 		DDRD=0xff;      //端口A改为
	ldi R24,255
	out 0x11,R24
	.dbline 83
; 		s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 84
; 		PORTA&=~EN;     //EN=0
	cbi 0x1b,7
	.dbline 85
; 		s_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 86
; 		if(temp>>7==0)
	mov R2,R10
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	lsr R2
	brne L12
X1:
	.dbline 87
; 		flag = 0;
	clr R20
L12:
	.dbline 88
; 	}
L10:
	.dbline 69
	cpi R20,1
	breq L9
X2:
	.dbline -2
L8:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r flag 20 c
	.dbsym r temp 10 c
	.dbend
	.dbfunc e LCMInit _LCMInit fV
	.even
_LCMInit::
	.dbline -1
	.dbline 93
; }
; 
; //LCM初始化
; void LCMInit(void) 
; {
	.dbline 94
; 	WriteCommandLCM(0x38);    //三次显示模式设置,不检测忙信号
	ldi R16,56
	xcall _WriteCommandLCM
	.dbline 95
; 	s_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 96
; 	WriteCommandLCM(0x38);
	ldi R16,56
	xcall _WriteCommandLCM
	.dbline 97
; 	s_ms(1000); 
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 98
; 	WriteCommandLCM(0x38);
	ldi R16,56
	xcall _WriteCommandLCM
	.dbline 99
; 	s_ms(1000); 
	ldi R16,1000
	ldi R17,3
	xcall _s_ms
	.dbline 100
; 	WriteCommandLCM(0x38);    //显示模式设置,开始要求每次检测忙信号
	ldi R16,56
	xcall _WriteCommandLCM
	.dbline 101
; 	WriteCommandLCM(0x08);    //关闭显示
	ldi R16,8
	xcall _WriteCommandLCM
	.dbline 102
; 	WriteCommandLCM(0x01);    //显示清屏
	ldi R16,1
	xcall _WriteCommandLCM
	.dbline 103
; 	WriteCommandLCM(0x06);    //显示光标移动设置
	ldi R16,6
	xcall _WriteCommandLCM
	.dbline 104
; 	WriteCommandLCM(0x0C);    //显示开及光标设置
	ldi R16,12
	xcall _WriteCommandLCM
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e DisplayList _DisplayList fV
;              p -> R14,R15
;         length -> R14
;              i -> R10
;          DData -> R12,R13
;              X -> R20
	.even
_DisplayList::
	xcall push_xgset30FC
	movw R12,R18
	mov R20,R16
	.dbline -1
	.dbline 116
; }
; 
; //按指定位置显示一串字符
; //液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
; //          从第一行第一列开始,依次向左,如果想在不同的
; //          位置显示,只需修改相应的行值即可。液晶显示
; //          完毕后,转入语音文本发送。
; //DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
; //			第二行显示;X为0x88在第三行显示;X为0x98在
; //			第四行显示;DData为显示数组。
; void DisplayList(unsigned char X,char *DData)
; {
	.dbline 118
; 	unsigned char length;
; 	unsigned char i=0;
	clr R10
	.dbline 120
; 	char *p;
; 	p = DData;
	movw R14,R12
	.dbline 121
; 	length = strlen(p);
	movw R16,R14
	xcall _strlen
	mov R14,R16
	.dbline 122
; 	WriteCommandLCM(0x08);
	ldi R16,8
	xcall _WriteCommandLCM
	.dbline 123
; 	WriteCommandLCM(X);
	mov R16,R20
	xcall _WriteCommandLCM
	.dbline 124
; 	WriteCommandLCM(0x06);
	ldi R16,6
	xcall _WriteCommandLCM
	.dbline 125
; 	WriteCommandLCM(0x0C);
	ldi R16,12
	xcall _WriteCommandLCM
	.dbline 126
; 	WriteCommandLCM(X);
	mov R16,R20
	xcall _WriteCommandLCM
	.dbline 127
; 	for(i=0;i<length;i++)
	xjmp L19
L16:
	.dbline 128
; 	{
	.dbline 129
; 		WriteDataLCM(DData[i]);
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R16,z+0
	xcall _WriteDataLCM
	.dbline 130
; 		i++;
	inc R10
	.dbline 131
; 		WriteDataLCM(DData[i]);
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R16,z+0
	xcall _WriteDataLCM
	.dbline 132
; 	}
L17:
	.dbline 127
	inc R10
L19:
	.dbline 127
	cp R10,R14
	brlo L16
X3:
	.dbline -2
L15:
	.dbline 0 ; func end
	xjmp pop_xgset30FC
	.dbsym r p 14 pc
	.dbsym r length 14 c
	.dbsym r i 10 c
	.dbsym r DData 12 pc
	.dbsym r X 20 c
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 137
; }
; 
; //主函数
; void main(void)
; {
	.dbline 139
;     //端口初始化
; 	DDRA=0xff;
	ldi R24,255
	out 0x1a,R24
	.dbline 140
; 	PORTA=0xff;
	out 0x1b,R24
	.dbline 141
; 	DDRB=0xff;
	out 0x17,R24
	.dbline 142
; 	PORTB=0xff;
	out 0x18,R24
	.dbline 143
; 	DDRD=0xff;
	out 0x11,R24
	.dbline 144
; 	PORTD=0x00;
	clr R2
	out 0x12,R2
	.dbline 146
; 	
; 	s_ms(200); 
	ldi R16,200
	ldi R17,0
	xcall _s_ms
	.dbline 147
; 	s_ms(200);  
	ldi R16,200
	ldi R17,0
	xcall _s_ms
	.dbline 148
; 	LCMInit(); //LCM初始化   //液晶初始化
	xcall _LCMInit
	.dbline 150
; 
;     DisplayList(0x80,text_1);     //显示第一行
	ldi R18,<_text_1
	ldi R19,>_text_1
	ldi R16,128
	xcall _DisplayList
	.dbline 151
; 	DisplayList(0x90,text_2);     //显示第二行
	ldi R18,<_text_2
	ldi R19,>_text_2
	ldi R16,144
	xcall _DisplayList
	.dbline 152
; 	DisplayList(0x88,text_3);     //显示第三行
	ldi R18,<_text_3
	ldi R19,>_text_3
	ldi R16,136
	xcall _DisplayList
	.dbline 153
; 	DisplayList(0x98,text_4);     //显示第四行
	ldi R18,<_text_4
	ldi R19,>_text_4
	ldi R16,152
	xcall _DisplayList
L21:
	.dbline 154
; 	while(1);
L22:
	.dbline 154
	xjmp L21
X4:
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbend
; }

⌨️ 快捷键说明

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