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

📄 lcd.s

📁 AVR单片机 C语言程序设计经典实用
💻 S
📖 第 1 页 / 共 5 页
字号:
	std y+1,R23
	std y+0,R22
	mov R18,R10
	mov R16,R20
	xcall _LCD_Write_Char
	.dbline 882
; 			wPointerY +=1;
	inc R10
	.dbline 883
; 		}
	xjmp L197
L196:
	.dbline 885
; 		else
; 		{
	.dbline 886
; 			wTemp = wTemp<<8;
	mov R13,R12
	clr R12
	.dbline 887
; 			wTemp |= *string++;
	movw R30,R14
	ld R2,Z+
	movw R14,R30
	clr R3
	or R12,R2
	or R13,R3
	.dbline 888
; 			wStrPtr = FindStringIndexFromCode(wTemp);
	movw R16,R12
	xcall _FindStringIndexFromCode
	movw R22,R16
	.dbline 889
; 			LCD_Write_Word(wPointerX,wPointerY,wStrPtr);
	std y+1,R23
	std y+0,R22
	mov R18,R10
	mov R16,R20
	xcall _LCD_Write_Word
	.dbline 890
; 			wPointerY +=2;
	mov R24,R10
	subi R24,254    ; addi 2
	mov R10,R24
	.dbline 891
; 		}
L197:
	.dbline 892
L194:
	.dbline 875
	movw R30,R14
	ldd R2,z+0
	tst R2
	breq X19
	xjmp L193
X19:
	.dbline -2
	.dbline 893
; 	}
; }
L192:
	adiw R28,2
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r wPointerX 20 c
	.dbsym r wStrPtr 22 pkc
	.dbsym r wPointerY 10 c
	.dbsym r wTemp 12 i
	.dbsym l invert 14 c
	.dbsym r string 14 pc
	.dbsym r Y 22 c
	.dbsym r X 10 c
	.dbend
	.dbfunc e Win_Show_Screen _Win_Show_Screen fV
;          wTemp -> R20
;            Ptr -> R22,R23
	.even
_Win_Show_Screen::
	xcall push_gset2
	movw R22,R16
	sbiw R28,3
	.dbline -1
	.dbline 902
; 
; //******************************************************************************
; // Function    : Win_Show_Screen
; // Input       : Ptr-pointer to display frame 
; // Output      : none
; // Description : Display a Window on LCD
; //******************************************************************************
; void Win_Show_Screen(const struct LCDString *Ptr)
; {
	.dbline 904
; 	INT8U wTemp;
; 	for(wTemp = 0;wTemp < 4;wTemp++)
	clr R20
	xjmp L202
L199:
	.dbline 905
	.dbline 906
	clr R2
	std y+2,R2
	movw R30,R22
	adiw R30,2
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	std y+1,R31
	std y+0,R30
	movw R30,R22
	lpm R18,Z
	adiw R30,1
	lpm R16,Z
	xcall _LCD_Show_String
	.dbline 907
	subi R22,252  ; offset = 4
	sbci R23,255
	.dbline 908
L200:
	.dbline 904
	inc R20
L202:
	.dbline 904
	cpi R20,4
	brlo L199
	.dbline -2
	.dbline 909
; 	{
; 		LCD_Show_String(Ptr->wXPointer,Ptr->wYPointer,Ptr->StrPointer,0);
; 		Ptr++;
; 	}
; }
L198:
	adiw R28,3
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r wTemp 20 c
	.dbsym r Ptr 22 pkX
	.dbend
	.dbfunc e FindStringIndexFromCode _FindStringIndexFromCode fpkc
;           High -> R20,R21
;            Low -> R22,R23
;          wData -> R10,R11
;            pDB -> R12,R13
;            Mid -> R14,R15
;          wCode -> R2,R3
	.even
_FindStringIndexFromCode::
	xcall push_gset5
	movw R2,R16
	.dbline -1
	.dbline 918
; 
; //******************************************************************************
; // Function    : FindStringIndexFromCode
; // Input       : wCode-mask of a char or word 
; // Output      : pointer to the mask array
; // Description : find the mask array address for given char/word code
; //******************************************************************************
; const INT8U *FindStringIndexFromCode(INT16U wCode)
; {
	.dbline 925
; 	INT16U	Low;
; 	INT16U	High;
; 	INT16U	Mid;
; 	const struct DataBaseIndex *pDB;
; 	INT16U	wData;
; 	
; 	Low = 0;
	clr R22
	clr R23
	.dbline 926
; 	High = wDataBaseLength - 1;
	lds R20,_wDataBaseLength
	lds R21,_wDataBaseLength+1
	subi R20,1
	sbci R21,0
	xjmp L205
L204:
	.dbline 929
; 	
; 	while(Low <= High)
; 	{
	.dbline 930
; 		Mid = (Low + High) >> 1;
	movw R14,R22
	add R14,R20
	adc R15,R21
	lsr R15
	ror R14
	.dbline 932
; 		
; 		pDB = &DataBaseIndexList[Mid];
	ldi R16,4
	ldi R17,0
	movw R18,R14
	xcall empy16s
	movw R12,R16
	ldi R24,<_DataBaseIndexList
	ldi R25,>_DataBaseIndexList
	add R12,R24
	adc R13,R25
	.dbline 933
; 		wData = pDB -> Code;
	movw R30,R12
	lpm R10,Z+
	lpm R11,Z
	.dbline 935
; 		
; 		if(wCode == wData)
	cp R2,R10
	cpc R3,R11
	brne L207
	.dbline 936
; 		{
	.dbline 937
; 			return(pDB->Ptr);
	movw R30,R12
	adiw R30,2
	lpm R16,Z+
	lpm R17,Z
	xjmp L203
L207:
	.dbline 939
; 		}
; 		else if(wCode < wData)
	cp R2,R10
	cpc R3,R11
	brsh L209
	.dbline 940
; 		{
	.dbline 941
; 			High = Mid - 1;
	movw R20,R14
	subi R20,1
	sbci R21,0
	.dbline 942
; 		}
	xjmp L210
L209:
	.dbline 944
; 		else
; 		{
	.dbline 945
; 			Low = Mid + 1;
	movw R22,R14
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 946
; 		}
L210:
	.dbline 947
L205:
	.dbline 928
	cp R20,R22
	cpc R21,R23
	brsh L204
	.dbline 948
; 	}
; 	return(0);
	clr R16
	clr R17
	.dbline -2
L203:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r High 20 i
	.dbsym r Low 22 i
	.dbsym r wData 10 i
	.dbsym r pDB 12 pkX
	.dbsym r Mid 14 i
	.dbsym r wCode 2 i
	.dbend
	.dbfunc e Initial_DataBaseLength _Initial_DataBaseLength fi
;        wLength -> R16,R17
;    DataBasePtr -> R18,R19
	.even
_Initial_DataBaseLength::
	.dbline -1
	.dbline 958
; }
; 	
; //******************************************************************************
; // Function    : Initial_DataBaseLength
; // Input       : none 
; // Output      : length of the database
; // Description : calculate the length of the database
; //*******************************************************************************
; INT16U Initial_DataBaseLength(void)
; {
	.dbline 959
; 	INT16U wLength = 0;
	clr R16
	clr R17
	.dbline 960
; 	const struct DataBaseIndex *DataBasePtr = DataBaseIndexList;
	ldi R18,<_DataBaseIndexList
	ldi R19,>_DataBaseIndexList
	xjmp L213
L212:
	.dbline 962
	.dbline 963
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 964
	subi R18,252  ; offset = 4
	sbci R19,255
	.dbline 965
L213:
	.dbline 961
; 	while(DataBasePtr->Code != 0xFFFF)
	movw R30,R18
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	cpi R30,255
	ldi R30,255
	cpc R31,R30
	brne L212
	.dbline 966
; 	{
; 		wLength++;
; 		DataBasePtr++;
; 	}
; 	return(wLength);
	.dbline -2
L211:
	.dbline 0 ; func end
	ret
	.dbsym r wLength 16 i
	.dbsym r DataBasePtr 18 pkX
	.dbend
	.dbfunc e Int2Char _Int2Char fV
;         wWidth -> R10
;            Ptr -> R20,R21
;          wData -> R22,R23
	.even
_Int2Char::
	xcall push_gset3
	movw R20,R18
	movw R22,R16
	ldd R10,y+6
	.dbline -1
	.dbline 977
; }
; 
; //******************************************************************************
; // Function    : Int2Char
; // Input       : wData-data to be converted,Ptr-pointer to buffer
; //               wWidth-length to convert 
; // Output      : none
; // Description : convert decimal to char
; //*******************************************************************************
; void Int2Char(INT16U wData,INT8U *Ptr,INT8U wWidth)
; {
	.dbline 978
; 	if(wWidth == 1)
	mov R24,R10
	cpi R24,1
	brne L216
	.dbline 979
; 	{
	.dbline 980
; 		*Ptr++ = wData + '0';
	movw R24,R22
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 981
; 	}
	xjmp L217
L216:
	.dbline 982
; 	else if(wWidth == 2)
	mov R24,R10
	cpi R24,2
	brne L218
	.dbline 983
; 	{
	.dbline 984
; 		*Ptr++ = wData/10 + '0';
	ldi R18,10
	ldi R19,0
	movw R16,R22
	xcall div16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 985
; 		*Ptr++ = wData%10 + '0';
	ldi R18,10
	ldi R19,0
	movw R16,R22
	xcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 986
; 	}
	xjmp L219
L218:
	.dbline 987
; 	else if(wWidth == 3)
	mov R24,R10
	cpi R24,3
	brne L220
	.dbline 988
; 	{
	.dbline 989
; 		*Ptr++ = wData/100;
	ldi R18,100
	ldi R19,0
	movw R16,R22
	xcall div16u
	movw R30,R20
	st Z+,R16
	movw R20,R30
	.dbline 990
; 		*Ptr++ = (wData%100)/10 + '0';
	ldi R18,100
	ldi R19,0
	movw R16,R22
	xcall mod16u
	ldi R18,10
	ldi R19,0
	xcall div16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 991
; 		*Ptr++ = (wData%10) + '0';
	ldi R18,10
	ldi R19,0
	movw R16,R22
	xcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 992
; 	}
	xjmp L221
L220:
	.dbline 993
; 	else if(wWidth == 4)
	mov R24,R10
	cpi R24,4
	breq X20
	xjmp L222
X20:
	.dbline 994
; 	{
	.dbline 995
; 		*Ptr++ = wData/1000 + '0';
	ldi R18,1000
	ldi R19,3
	movw R16,R22
	xcall div16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 996
; 		*Ptr++ = (wData%1000)/100 + '0';
	ldi R18,1000
	ldi R19,3
	movw R16,R22
	xcall mod16u
	ldi R18,100
	ldi R19,0
	xcall div16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 997
; 		*Ptr++ = (wData%100)/10 + '0';
	ldi R18,100
	ldi R19,0
	movw R16,R22
	xcall mod16u
	ldi R18,10
	ldi R19,0
	xcall div16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 998
; 		*Ptr++ = (wData%10) + '0';
	ldi R18,10
	ldi R19,0
	movw R16,R22
	xcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	st Z+,R24
	movw R20,R30
	.dbline 999
; 	}
L222:
L221:
L219:
L217:
	.dbline -2
	.dbline 1000
; }
L215:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r wWidth 10 c
	.dbsym r Ptr 20 pc
	.dbsym r wData 22 i
	.dbend
	.dbfunc e LCD_Show_Time _LCD_Show_Time fV
	.even
_LCD_Show_Time::
	sbiw R28,3
	.dbline -1
	.dbline 1011
; 	
; //******************************************************************************
; // Function    : LCD_Show_Time
; // Input       : none 
; // Output      : none
; // Description : Display real time on lcd
; //*******************************************************************************
; 	INT8U wTemp[20];
; 	INT8U *Ptr;
; void LCD_Show_Time(void)
; {
	.dbline 1013
; 
; 	Ptr = &wTemp[0];
	ldi R24,<_wTemp
	ldi R25,>_wTemp
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1014
; 	Int2Char(20,Ptr,2);
	ldi R24,2
	std y+0,R24
	lds R18,_Ptr
	lds R19,_Ptr+1
	ldi R16,20
	ldi R17,0
	xcall _Int2Char
	.dbline 1015
; 	Ptr += 2;
	lds R24,_Ptr
	lds R25,_Ptr+1
	adiw R24,2
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1016
; 	Int2Char(bYear,Ptr,2);
	ldi R24,2
	std y+0,R24
	lds R18,_Ptr
	lds R19,_Ptr+1
	lds R16,_bYear
	clr R17
	xcall _Int2Char
	.dbline 1017
; 	Ptr += 2;
	lds R24,_Ptr
	lds R25,_Ptr+1
	adiw R24,2
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1018
; 	*Ptr++ = '-';
	ldi R24,45
	lds R30,_Ptr
	lds R31,_Ptr+1
	st Z+,R24
	sts _Ptr+1,R31
	sts _Ptr,R30
	.dbline 1019
; 	Int2Char(bMonth,Ptr,2);
	ldi R24,2
	std y+0,R24
	movw R18,R30
	lds R16,_bMonth
	clr R17
	xcall _Int2Char
	.dbline 1020
; 	Ptr += 2;
	lds R24,_Ptr
	lds R25,_Ptr+1
	adiw R24,2
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1021
; 	*Ptr++ = '-';
	ldi R24,45
	lds R30,_Ptr
	lds R31,_Ptr+1
	st Z+,R24
	sts _Ptr+1,R31
	sts _Ptr,R30
	.dbline 1022
; 	Int2Char(bDate,Ptr,2);
	ldi R24,2
	std y+0,R24
	movw R18,R30
	lds R16,_bDate
	clr R17
	xcall _Int2Char
	.dbline 1023
; 	Ptr += 2;
	lds R24,_Ptr
	lds R25,_Ptr+1
	adiw R24,2
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1024
; 	*Ptr++ = ' ';
	ldi R24,32
	lds R30,_Ptr
	lds R31,_Ptr+1
	st Z+,R24
	sts _Ptr+1,R31
	sts _Ptr,R30
	.dbline 1025
; 	Int2Char(bMinute,Ptr,2);
	ldi R24,2
	std y+0,R24
	movw R18,R30
	lds R16,_bMinute
	clr R17
	xcall _Int2Char
	.dbline 1026
; 	Ptr += 2;
	lds R24,_Ptr
	lds R25,_Ptr+1
	adiw R24,2
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1027
; 	*Ptr++ = ':';
	ldi R24,58
	lds R30,_Ptr
	lds R31,_Ptr+1
	st Z+,R24
	sts _Ptr+1,R31
	sts _Ptr,R30
	.dbline 1028
; 	Int2Char(bSecond,Ptr,2);
	ldi R24,2
	std y+0,R24
	movw R18,R30
	lds R16,_bSecond
	clr R17
	xcall _Int2Char
	.dbline 1029
; 	Ptr += 2;
	lds R24,_Ptr
	lds R25,_Ptr+1
	adiw R24,2
	sts _Ptr+1,R25
	sts _Ptr,R24
	.dbline 1030
; 	*Ptr++ = '\0';	
	clr R2
	movw R30,R24
	st Z+,R2
	sts _Ptr+1,R31
	sts _Ptr,R30
	.dbline 1031
; 	LCD_Show_String(3,0,wTemp,0); 
	std y+2,R2
	ldi R24,<_wTemp
	ldi R25,>_wTemp
	std y+1,R25
	std y+0,R24
	clr R18
	ldi R16,3
	xcall _LCD_Show_String
	.dbline -2
	.dbline 1032
; }
L224:
	adiw R28,3
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\LCD菜单系统设计\LCD.c
_Ptr::
	.blkb 2
	.dbsym e Ptr _Ptr pc
_w

⌨️ 快捷键说明

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