📄 lcd.lst
字号:
__start:
__text_start:
EE EFCF LDI R28,0xFF
EF E1D0 LDI R29,0x10
F0 BFCD OUT 0x3D,R28
F1 BFDE OUT 0x3E,R29
F2 51CE SUBI R28,0x1E
F3 40D0 SBCI R29,0
F4 EA0A LDI R16,0xAA
F5 8308 STD Y+0,R16
F6 2400 CLR R0
F7 E0E0 LDI R30,0
F8 E0F1 LDI R31,1
F9 E011 LDI R17,1
FA 30E0 CPI R30,0
FB 07F1 CPC R31,R17
FC F011 BEQ 0x00FF
FD 9201 ST R0,Z+
FE CFFB RJMP 0x00FA
FF 8300 STD Z+0,R16
100 EDEC LDI R30,0xDC
101 E0F1 LDI R31,1
102 E0A0 LDI R26,0
103 E0B1 LDI R27,1
104 E011 LDI R17,1
105 E000 LDI R16,0
106 BF0B OUT 0x3B,R16
107 3DEC CPI R30,0xDC
108 07F1 CPC R31,R17
109 F021 BEQ 0x010E
10A 95C8 LPM
10B 9631 ADIW R30,1
10C 920D ST R0,X+
10D CFF9 RJMP 0x0107
10E 940E 01AD CALL _main
_exit:
110 CFFF RJMP _exit
FILE: F:\avr\mega128\lcd12864\so12864.c
(0001) #include "so12864.h"
(0002)
(0003) /*************************************************/
(0004) //Init LCD
(0005) /*************************************************/
(0006) void Init_LCD(void)
(0007) {
(0008) //Make the CS AO RST pin as output
(0009) DDR_SPI_CTL = (1 << LCD_AO_TRIS) | (1 << LCD_RST_TRIS) | (1 << LCD_CS_TRIS);
_Init_LCD:
111 E087 LDI R24,7
112 BB81 OUT 0x11,R24
(0010)
(0011) DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK); //设置MOSI,SCK,SS 为OUTPUT,其它为INPUT
113 E086 LDI R24,6
114 BB87 OUT 0x17,R24
(0012) SPCR = (1<<SPE)|(1<<MSTR); //SPI使能,主机方式,设置SCK为fosc/4,上升沿,MSB First
115 E580 LDI R24,0x50
116 B98D OUT 0x0D,R24
(0013)
(0014) /* 一定要先重启LCD,再设置SPI,否则通讯不成功 */
(0015)
(0016) LCD_RST_IO |= BIT(LCD_RST_PIN);
117 9A91 SBI 0x12,1
(0017) LCD_CS_IO |= BIT(LCD_CS_PIN);
118 9A92 SBI 0x12,2
(0018) LCD_AO_IO |= BIT(LCD_AO_PIN);
119 9A90 SBI 0x12,0
(0019)
(0020) LCD_CS_IO &= ~BIT(LCD_CS_PIN); //select 12864
11A 9892 CBI 0x12,2
(0021)
(0022) LCD_RST_IO &= ~BIT(LCD_RST_PIN); //reset
11B 9891 CBI 0x12,1
(0023) nop();
11C 0000 NOP
(0024) nop();
11D 0000 NOP
(0025) nop();
11E 0000 NOP
(0026) LCD_RST_IO |= BIT(LCD_RST_PIN);
11F 9A91 SBI 0x12,1
(0027)
(0028) //write command
(0029) Write_LCDCOM(DISPLAY_ON); //ON DISPLAY
120 EA0F LDI R16,0xAF
121 D016 RCALL _Write_LCDCOM
(0030) Write_LCDCOM(START_LINE_0); //STAR DISPLAY
122 E400 LDI R16,0x40
123 D014 RCALL _Write_LCDCOM
(0031) Write_LCDCOM(ADC_NORMAL); //ADC NORMAL
124 EA00 LDI R16,0xA0
125 D012 RCALL _Write_LCDCOM
(0032) Write_LCDCOM(DISPLAY_NORMAL); //Display normal
126 EA06 LDI R16,0xA6
127 D010 RCALL _Write_LCDCOM
(0033) Write_LCDCOM(ALL_POINT_NORMAL); //CLEAR
128 EA04 LDI R16,0xA4
129 D00E RCALL _Write_LCDCOM
(0034) Write_LCDCOM(BIAS_1_9); //1/9BIAS
12A EA02 LDI R16,0xA2
12B D00C RCALL _Write_LCDCOM
(0035) Write_LCDCOM(OUTPUT_MPDE_REVERSE); //COMMON OUTPUT DIRECTION
12C EC08 LDI R16,0xC8
12D D00A RCALL _Write_LCDCOM
(0036) Write_LCDCOM(POWER); //POWER CONTROL
12E E20F LDI R16,0x2F
12F D008 RCALL _Write_LCDCOM
(0037) Write_LCDCOM(RESISTOR_RATION); //RESISTER RATIO
130 E204 LDI R16,0x24
131 D006 RCALL _Write_LCDCOM
(0038) Write_LCDCOM(HIBYTE(ELECTRONIC_VOLUME));//VOLUM MODE SET
132 E801 LDI R16,0x81
133 D004 RCALL _Write_LCDCOM
(0039) Write_LCDCOM(LOBYTE(ELECTRONIC_VOLUME));
134 E204 LDI R16,0x24
135 D002 RCALL _Write_LCDCOM
(0040)
(0041) Clear_LCD();
136 D00D RCALL _Clear_LCD
137 9508 RET
(0042) }
(0043)
(0044)
(0045) /*************************************************/
(0046) //Write command
(0047) /*************************************************/
(0048) void Write_LCDCOM(BYTE command)
(0049) {
(0050) LCD_AO_IO &= ~BIT(LCD_AO_PIN);
_Write_LCDCOM:
command --> R16
138 9890 CBI 0x12,0
(0051) LCD_CS_IO &= ~BIT(LCD_CS_PIN);
139 9892 CBI 0x12,2
(0052) SPDR = (unsigned char)command;
13A B90F OUT 0x0F,R16
(0053) while(!(SPSR&(1<<SPIF))); //Wait for transmission finish
13B 9B77 SBIS 0x0E,7
13C CFFE RJMP 0x013B
13D 9508 RET
(0054) }
(0055) /*************************************************/
(0056) //Write data
(0057) /*************************************************/
(0058) void Write_LCDDATA(BYTE data)
(0059) {
(0060) LCD_AO_IO |= BIT(LCD_AO_PIN);
_Write_LCDDATA:
data --> R16
13E 9A90 SBI 0x12,0
(0061) LCD_CS_IO &= ~BIT(LCD_CS_PIN);
13F 9892 CBI 0x12,2
(0062) SPDR = (unsigned char)data;
140 B90F OUT 0x0F,R16
(0063) while(!(SPSR&(1<<SPIF))); //Wait for transmission finish
141 9B77 SBIS 0x0E,7
142 CFFE RJMP 0x0141
143 9508 RET
_Clear_LCD:
page --> R20
seg --> R22
144 934A ST R20,-Y
145 936A ST R22,-Y
(0064) }
(0065)
(0066) /*************************************************/
(0067) //Clear LCD
(0068) /*************************************************/
(0069) void Clear_LCD()
(0070) {
(0071) unsigned char seg;
(0072) unsigned char page;
(0073) for(page = PAGE_0; page < PAGE_8; page++) //写页地址共8 页0xb0----0xb8
146 EB40 LDI R20,0xB0
147 C00E RJMP 0x0156
(0074) {
(0075) Write_LCDCOM(page);
148 2F04 MOV R16,R20
149 DFEE RCALL _Write_LCDCOM
(0076) Write_LCDCOM(0x10); //列地址,高低字节两次写入,从第0列开始
14A E100 LDI R16,0x10
14B DFEC RCALL _Write_LCDCOM
(0077) Write_LCDCOM(0x00);
14C 2700 CLR R16
14D DFEA RCALL _Write_LCDCOM
(0078) for(seg = 0; seg < 128; seg++) //写128列
14E 2766 CLR R22
14F C003 RJMP 0x0153
(0079) {
(0080) Write_LCDDATA(0x00);
150 2700 CLR R16
151 DFEC RCALL _Write_LCDDATA
152 9563 INC R22
153 3860 CPI R22,0x80
154 F3D8 BCS 0x0150
155 9543 INC R20
156 3B48 CPI R20,0xB8
157 F380 BCS 0x0148
158 9169 LD R22,Y+
159 9149 LD R20,Y+
15A 9508 RET
_DispEN_LCD:
seg --> R20
ptr --> R10
column --> R12
page --> R14
15B 940E 0224 CALL push_xgset30FC
15D 0169 MOVW R12,R18
15E 2EE0 MOV R14,R16
15F 84A8 LDD R10,Y+8
160 84B9 LDD R11,Y+9
(0081) }
(0082) }
(0083) }
(0084)
(0085) /*************************************************/
(0086) //Display English words
(0087) /*************************************************/
(0088) void DispEN_LCD(BYTE page, WORD column, BYTE *ptr)
(0089) {
(0090) unsigned char seg;
(0091)
(0092) Write_LCDCOM(page);
161 2D0E MOV R16,R14
162 DFD5 RCALL _Write_LCDCOM
(0093) Write_LCDCOM(HIBYTE(column)); //列地址,高低字节两次写入
163 0186 MOVW R16,R12
164 2F01 MOV R16,R17
165 2711 CLR R17
166 7010 ANDI R17,0
167 DFD0 RCALL _Write_LCDCOM
(0094) Write_LCDCOM(LOBYTE(column));
168 2D0C MOV R16,R12
169 DFCE RCALL _Write_LCDCOM
(0095)
(0096) for(seg = 0; seg < 8; seg++) //写8列
16A 2744 CLR R20
16B C005 RJMP 0x0171
(0097) {
(0098) Write_LCDDATA((BYTE)(*ptr++));
16C 01F5 MOVW R30,R10
16D 9101 LD R16,Z+
16E 015F MOVW R10,R30
16F DFCE RCALL _Write_LCDDATA
170 9543 INC R20
171 3048 CPI R20,0x8
172 F3C8 BCS 0x016C
173 940C 020E JMP pop_xgset30FC
_DispCN_LCD:
offset --> R20
seg --> R22
ptr --> R10
column --> R12
page --> R14
175 940E 0222 CALL push_xgsetF0FC
177 0169 MOVW R12,R18
178 2EE0 MOV R14,R16
179 84AA LDD R10,Y+10
17A 84BB LDD R11,Y+11
(0099) }
(0100) }
(0101)
(0102) /*************************************************/
(0103) //Display Chinese words
(0104) /*************************************************/
(0105) void DispCN_LCD(BYTE page, WORD column, BYTE *ptr)
(0106) {
(0107) unsigned char seg;
(0108) unsigned char offset;
(0109) for(offset = 0; offset < 2; offset++)
17B 2744 CLR R20
17C C018 RJMP 0x0195
(0110) {
(0111) Write_LCDCOM((BYTE)(page + offset));
17D 2E24 MOV R2,R20
17E 2433 CLR R3
17F 2D0E MOV R16,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -