Компилятор WinAVR. Подпрограмма чтения из HD44780 (в режиме 4 бит)
[code]
void LCD_READ(void)
{
byte data;
LCD_DATAPORT=0xff;
LCD_CTRLPORT|=LCD_E;
_delay_us(1);
data=LCD_DATAPIN;
LCD_CTRLPORT&=~LCD_E;
#ifdef LCD_4BIT
LCD_CTRLPORT|=LCD_E;
_delay_us(1);
byte temp=LCD_DATAPIN ;
LCD_CTRLPORT&=~LCD_E;
data&=0x0f;
SWAP(data);
temp&=0x0f;
//data|=temp;
#endif
return data;
}
транслируется в
60 LCD_READ:
61 .LFB12:
62 .LM5:
63 /* prologue: frame size=0 */
64 /* prologue end (size=0) */
65 .LM6:
66 003e 8FEF ldi r24,lo8(-1)
67 0040 88BB out 56-0x20,r24
68 .LM7:
69 0042 D89A sbi 59-0x20,0
70 .LBB42:
71 .LBB43:
72 .LBB44:
73 .LBB45:
74 .LM8:
75 0044 85E0 ldi r24,lo8(5)
76 0046 982F mov r25,r24
77 .LVL0:
78 /* #APP */
79 0048 9A95 1: dec r25
80 004a 01F4 brne 1b
81 /* #NOAPP */
82 .LBE45:
83 .LBE44:
84 .LBE43:
85 .LBE42:
86 .LM9:
87 004c 96B3 in r25,54-0x20
88 .LVL1:
89 .LM10:
90 004e D898 cbi 59-0x20,0
91 .LM11:
92 0050 D89A sbi 59-0x20,0
93 .LBB46:
94 .LBB47:
95 .LBB48:
96 .LBB49:
97 .LM12:
98 /* #APP */
99 0052 8A95 1: dec r24
100 0054 01F4 brne 1b
101 .LVL2:
102 /* #NOAPP */
103 .LBE49:
104 .LBE48:
105 .LBE47:
106 .LBE46:
107 .LM13:
108 0056 86B3 in r24,54-0x20
109 .LVL3:
110 .LM14:
111 0058 D898 cbi 59-0x20,0
112 .LM15:
113 005a 9F70 andi r25,lo8(15)
114 .LM16:
115 /* #APP */
116 005c 9295 swap r25
117 /* #NOAPP */
118 /* epilogue: frame size=0 */
119 005e 0895 ret
Возвращает R24. То есть только последний полубайт. А где старший?