📄 lcd.s
字号:
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 + -