?? lcd.lis
字號:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile D:\ac19-1\lcd.c
0000 .dbfunc e ePutstr _ePutstr fV
0000 ; l -> R20
0000 ; i -> R22
0000 ; ptr -> R10,R11
0000 ; y -> R12
0000 ; x -> R14
.even
0000 _ePutstr::
0000 0E940000 xcall push_gset5
0004 C22E mov R12,R18
0006 E02E mov R14,R16
0008 2297 sbiw R28,2
000A AC84 ldd R10,y+12
000C BD84 ldd R11,y+13
000E .dbline -1
000E .dbline 15
000E ; #include <iom16v.h>
000E ; #include <macros.h>
000E ; #define uchar unsigned char
000E ; #define uint unsigned int
000E ; #define LCM_RS_1 PORTB|=BIT(PB0)
000E ; #define LCM_RS_0 PORTB&=~BIT(PB0)
000E ; #define LCM_RW_1 PORTB|=BIT(PB1)
000E ; #define LCM_RW_0 PORTB&=~BIT(PB1)
000E ; #define LCM_EN_1 PORTB|=BIT(PB2)
000E ; #define LCM_EN_0 PORTB&=~BIT(PB2)
000E ; #define DataPort PORTA
000E ; #define Busy 0x80
000E ; //***************************************
000E ; void ePutstr(uchar x,uchar y,uchar const *ptr)
000E ; {
000E .dbline 16
000E ; uchar i,l=0;
000E 4427 clr R20
0010 01C0 xjmp L3
0012 L2:
0012 .dbline 17
0012 .dbline 17
0012 4395 inc R20
0014 .dbline 17
0014 L3:
0014 .dbline 17
0014 ; while(ptr[l]>31){l++;}// ptr[l]大于31時,為ASCII碼,進入while語句循環,
0014 E42F mov R30,R20
0016 FF27 clr R31
0018 EA0D add R30,R10
001A FB1D adc R31,R11
001C E491 lpm R30,Z
001E 8FE1 ldi R24,31
0020 8E17 cp R24,R30
0022 B8F3 brlo L2
0024 .dbline 19
0024 6627 clr R22
0026 19C0 xjmp L8
0028 L5:
0028 .dbline 19
0028 ; //l累加,計算出字符串長度。
0028 ; for(i=0;i<l;i++){
0028 .dbline 20
0028 ; DisplayOneChar(x++,y,ptr[i]);// 顯示單個字符,同時x軸座標遞增。
0028 E62F mov R30,R22
002A FF27 clr R31
002C EA0D add R30,R10
002E FB1D adc R31,R11
0030 2490 lpm R2,Z
0032 3324 clr R3
0034 3982 std y+1,R3
0036 2882 std y+0,R2
0038 2C2D mov R18,R12
003A 3327 clr R19
003C 2E2C mov R2,R14
003E 3324 clr R3
0040 822D mov R24,R2
0042 8F5F subi R24,255 ; addi 1
0044 E82E mov R14,R24
0046 022D mov R16,R2
0048 1127 clr R17
004A 25D0 xcall _DisplayOneChar
004C .dbline 21
004C ; if(x==8){//若x等于16,進入if語句。
004C 8E2D mov R24,R14
004E 8830 cpi R24,8
0050 19F4 brne L9
0052 .dbline 21
0052 .dbline 22
0052 ; x=0;y^=1;// x賦0,y與1按位異或(取反)。
0052 EE24 clr R14
0054 .dbline 22
0054 81E0 ldi R24,1
0056 C826 eor R12,R24
0058 .dbline 23
0058 ; }
0058 L9:
0058 .dbline 24
0058 L6:
0058 .dbline 19
0058 6395 inc R22
005A L8:
005A .dbline 19
005A 6417 cp R22,R20
005C 28F3 brlo L5
005E .dbline -2
005E L1:
005E 2296 adiw R28,2
0060 0E940000 xcall pop_gset5
0064 .dbline 0 ; func end
0064 0895 ret
0066 .dbsym r l 20 c
0066 .dbsym r i 22 c
0066 .dbsym r ptr 10 pkc
0066 .dbsym r y 12 c
0066 .dbsym r x 14 c
0066 .dbend
0066 .dbfunc e LocateXY _LocateXY fV
0066 ; temp -> R20
0066 ; posy -> R22
0066 ; posx -> R10
.even
0066 _LocateXY::
0066 0E940000 xcall push_gset3
006A 622F mov R22,R18
006C A02E mov R10,R16
006E .dbline -1
006E .dbline 28
006E ; }
006E ; }
006E ; //*************************************
006E ; void LocateXY(char posx,char posy)
006E ; {
006E .dbline 30
006E ; uchar temp;
006E ; temp&=0x7f;// temp 的變化范圍0~7。
006E 4F77 andi R20,127
0070 .dbline 31
0070 ; temp=posx&0x07;//屏蔽高5位。
0070 4A2D mov R20,R10
0072 4770 andi R20,7
0074 .dbline 32
0074 ; posy&=0x01;// posy的變化范圍0~1。
0074 6170 andi R22,1
0076 .dbline 33
0076 ; switch(posy)
0076 7727 clr R23
0078 6130 cpi R22,1
007A E0E0 ldi R30,0
007C 7E07 cpc R23,R30
007E 09F0 breq L15
0080 01C0 xjmp L13
0082 X0:
0082 .dbline 34
0082 ; {
0082 L15:
0082 .dbline 35
0082 ; case 1:temp|=0x40;break;//若posy 為1(顯示第2行),地址碼+0x40。
0082 4064 ori R20,64
0084 .dbline 35
0084 .dbline 36
0084 ; default:break;
0084 L13:
0084 .dbline 38
0084 ; }
0084 ; temp|=0x80;//指令碼為地址碼+0x80。
0084 4068 ori R20,128
0086 .dbline 39
0086 ; LcdWriteCommand(temp,0);// 將指令temp 寫入LCM,忽略忙信號檢測。
0086 2227 clr R18
0088 3327 clr R19
008A 042F mov R16,R20
008C 1127 clr R17
008E 45D0 xcall _LcdWriteCommand
0090 .dbline -2
0090 L11:
0090 0E940000 xcall pop_gset3
0094 .dbline 0 ; func end
0094 0895 ret
0096 .dbsym r temp 20 c
0096 .dbsym r posy 22 c
0096 .dbsym r posx 10 c
0096 .dbend
0096 .dbfunc e DisplayOneChar _DisplayOneChar fV
0096 ; Wdata -> y+4
0096 ; y -> R22
0096 ; x -> R20
.even
0096 _DisplayOneChar::
0096 0E940000 xcall push_gset2
009A 622F mov R22,R18
009C 402F mov R20,R16
009E .dbline -1
009E .dbline 43
009E ; }
009E ; //**************************************
009E ; void DisplayOneChar(uchar x,uchar y,uchar Wdata)
009E ; {
009E .dbline 44
009E ; LocateXY(x,y);//調用LocateXY 函數定位顯示地址。
009E 262F mov R18,R22
00A0 042F mov R16,R20
00A2 E1DF xcall _LocateXY
00A4 .dbline 45
00A4 ; LcdWriteData(Wdata);//將數據Wdata寫入LCM。
00A4 0C81 ldd R16,y+4
00A6 1127 clr R17
00A8 4FD0 xcall _LcdWriteData
00AA .dbline -2
00AA L16:
00AA 0E940000 xcall pop_gset2
00AE .dbline 0 ; func end
00AE 0895 ret
00B0 .dbsym l Wdata 4 c
00B0 .dbsym r y 22 c
00B0 .dbsym r x 20 c
00B0 .dbend
00B0 .dbfunc e InitLcd _InitLcd fV
.even
00B0 _InitLcd::
00B0 .dbline -1
00B0 .dbline 49
00B0 ; }
00B0 ; //****************************************
00B0 ; void InitLcd(void)
00B0 ; {
00B0 .dbline 50
00B0 ; LcdWriteCommand(0x38,0); //8位數據傳送,2行顯示,5*7字形,不檢測忙信號
00B0 2227 clr R18
00B2 3327 clr R19
00B4 08E3 ldi R16,56
00B6 10E0 ldi R17,0
00B8 30D0 xcall _LcdWriteCommand
00BA .dbline 51
00BA ; Delay_nms(5);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -