📄 lcd_driver.txt
字号:
000142 2400 MOVS r4,#0
;;;157 LCD_CS_L; //选中片选
000144 2000 MOVS r0,#0
000146 49b5 LDR r1,|L1.1052|
000148 6008 STR r0,[r1,#0]
;;;158
;;;159 LCD_RS_L; //命令读写控制RS->0有效
00014a 49b1 LDR r1,|L1.1040|
00014c f8c101a4 STR r0,[r1,#0x1a4]
;;;160 LCD_DATA_OUT(index); //写入寄存器地址
000150 4618 MOV r0,r3
000152 f7fffffe BL LCD_DATA_OUT
;;;161
;;;162 LCD_RS_H; //数据读写控制RS->1有效
000156 2001 MOVS r0,#1
000158 49b1 LDR r1,|L1.1056|
00015a 6008 STR r0,[r1,#0]
;;;163 temp = LCD_DATA_IN();
00015c f7fffffe BL LCD_DATA_IN
000160 4604 MOV r4,r0
;;;164 LCD_CS_H; //关闭片选
000162 2001 MOVS r0,#1
000164 49aa LDR r1,|L1.1040|
000166 f8c101a0 STR r0,[r1,#0x1a0]
;;;165 return temp;
00016a 4620 MOV r0,r4
;;;166 }
00016c bd10 POP {r4,pc}
;;;167
ENDP
LCD_DrawPoint PROC
;;;173 ////////////////////////////////////////////////////////////////////////////////
;;;174 void LCD_DrawPoint(u16 x, u16 y, u16 color)
00016e b570 PUSH {r4-r6,lr}
;;;175 {
000170 4606 MOV r6,r0
000172 460c MOV r4,r1
000174 4615 MOV r5,r2
;;;176 if ((x > X_END) || (y > Y_END)) //显示不能超过最大坐标值
000176 2eef CMP r6,#0xef
000178 dc02 BGT |L1.384|
00017a f5b47fa0 CMP r4,#0x140
00017e db00 BLT |L1.386|
|L1.384|
;;;177 {
;;;178 return;
;;;179 }
;;;180 LCD_SetCursor(x, y);
;;;181
;;;182 LCD_WriteGRAM_EN();
;;;183 LCD_DATA_OUT(color);
;;;184 LCD_WR_END();
;;;185 }
000180 bd70 POP {r4-r6,pc}
|L1.386|
000182 4621 MOV r1,r4 ;180
000184 4630 MOV r0,r6 ;180
000186 f7fffffe BL LCD_SetCursor
00018a f7fffffe BL LCD_WriteGRAM_EN
00018e 4628 MOV r0,r5 ;183
000190 f7fffffe BL LCD_DATA_OUT
000194 2001 MOVS r0,#1 ;184
000196 49a1 LDR r1,|L1.1052|
000198 6008 STR r0,[r1,#0] ;184
00019a bf00 NOP
00019c e7f0 B |L1.384|
;;;186 ////////////////////////////////////////////////////////////////////////////////
ENDP
LCD_GetPoint PROC
;;;191 ////////////////////////////////////////////////////////////////////////////////
;;;192 u16 LCD_GetPoint(u16 x, u16 y)
00019e b5f0 PUSH {r4-r7,lr}
;;;193 {
0001a0 4606 MOV r6,r0
0001a2 460f MOV r7,r1
;;;194 ////////////////////////////////////////////////////////////////////////////////
;;;195 // 对于8位模式,则数据端口要进行两次操作,下图是16位模式情况下的操作 //
;;;196 // nCS ----\__________________________________________/------- //
;;;197 // RS ------\____________/----------------------------------- //
;;;198 // nRD -------------------------\_____/------\_____/---------- //
;;;199 // nWR --------\_______/-------------------------------------- //
;;;200 // DB[0:15] ---------[Address]-------[Dummy]-------[data]---------- //
;;;201 // 注意:在读GRAM时,要先设置读地址,再写读命令,然后是Dummy Read,最后 //
;;;202 // 才是数据。同时,在8位模式下,Dummy Read 是一个Word的时间,意味//
;;;203 // 着RD要产生2次上升沿,最后读回来的数据还要进行转换 //
;;;204 ////////////////////////////////////////////////////////////////////////////////
;;;205 u16 temp_color = 0;
0001a4 2400 MOVS r4,#0
;;;206 u16 temp = 0;
0001a6 2500 MOVS r5,#0
;;;207
;;;208 LCD_SetCursor(x,y);
0001a8 4639 MOV r1,r7
0001aa 4630 MOV r0,r6
0001ac f7fffffe BL LCD_SetCursor
;;;209
;;;210 LCD_ReadGRAM_EN();
0001b0 f7fffffe BL LCD_ReadGRAM_EN
;;;211
;;;212 DUMMY_READ(); //第一次不读
0001b4 2000 MOVS r0,#0
0001b6 4998 LDR r1,|L1.1048|
0001b8 6008 STR r0,[r1,#0]
0001ba f04f0001 MOV r0,#1
0001be 4994 LDR r1,|L1.1040|
0001c0 f8c101ac STR r0,[r1,#0x1ac]
;;;213 temp_color = LCD_DATA_IN();
0001c4 f7fffffe BL LCD_DATA_IN
0001c8 4604 MOV r4,r0
;;;214
;;;215 LCD_WR_END();
0001ca 2001 MOVS r0,#1
0001cc 4993 LDR r1,|L1.1052|
0001ce 6008 STR r0,[r1,#0]
;;;216
;;;217 temp = temp_color >> 11; //RRRRRGGGGGGBBBBB 改为
0001d0 ea4f25e4 ASR r5,r4,#11
;;;218 temp |= temp_color << 11; //BBBBBGGGGGGRRRRR 格式
0001d4 ea4520c4 ORR r0,r5,r4,LSL #11
0001d8 b285 UXTH r5,r0
;;;219 temp |= (temp_color & 0x07E0); //0000011111100000 = 0x07E0
0001da f40460fc AND r0,r4,#0x7e0
0001de ea400505 ORR r5,r0,r5
;;;220
;;;221 return temp;
0001e2 4628 MOV r0,r5
;;;222 }
0001e4 bdf0 POP {r4-r7,pc}
;;;223 ////////////////////////////////////////////////////////////////////////////////
ENDP
LCD_SetWindow PROC
;;;229 ////////////////////////////////////////////////////////////////////////////////
;;;230 void LCD_SetWindow(u16 start_x,u16 start_y,
0001e6 b5f0 PUSH {r4-r7,lr}
;;;231 u16 end_x,u16 end_y)
;;;232 {
0001e8 4604 MOV r4,r0
0001ea 460f MOV r7,r1
0001ec 4615 MOV r5,r2
0001ee 461e MOV r6,r3
;;;233
;;;234 LCD_WriteRegister(0x0050, start_x);
0001f0 4621 MOV r1,r4
0001f2 2050 MOVS r0,#0x50
0001f4 f7fffffe BL LCD_WriteRegister
;;;235 LCD_WriteRegister(0x0052, start_y);
0001f8 4639 MOV r1,r7
0001fa 2052 MOVS r0,#0x52
0001fc f7fffffe BL LCD_WriteRegister
;;;236 LCD_WriteRegister(0x0051, end_x);
000200 4629 MOV r1,r5
000202 2051 MOVS r0,#0x51
000204 f7fffffe BL LCD_WriteRegister
;;;237 LCD_WriteRegister(0x0053, end_y);
000208 4631 MOV r1,r6
00020a 2053 MOVS r0,#0x53
00020c f7fffffe BL LCD_WriteRegister
;;;238
;;;239 //驱动ICR61514->设置GARM地址
;;;240 ////////////////////////////////////////
;;;241 # if R61514_EN > 0
;;;242 end_x <<= 8; //高8位是垂直结束地址
;;;243 end_x |= (unsigned char)start_x;//低8位是垂直开始地址(水平GRAM地址也是如此 )
;;;244 end_y <<= 8;
;;;245 end_y |= (unsigned char)start_y;
;;;246
;;;247 LCD_WriteRegister(0x0044, end_x);
;;;248 LCD_WriteRegister(0x0045, end_y);
;;;249 # endif
;;;250 LCD_SetCursor(start_x, start_y);//设置起始绘图的GRAM地址
000210 4639 MOV r1,r7
000212 4620 MOV r0,r4
000214 f7fffffe BL LCD_SetCursor
;;;251
;;;252 }
000218 bdf0 POP {r4-r7,pc}
;;;253 //LCD清屏函数
ENDP
LCD_Clear PROC
;;;254 void LCD_Clear(u16 color)
00021a b530 PUSH {r4,r5,lr}
;;;255 {
00021c 4605 MOV r5,r0
;;;256 unsigned long i;
;;;257 LCD_SetWindow(0, 0, X_END, Y_END);
00021e f240133f MOV r3,#0x13f
000222 22ef MOVS r2,#0xef
000224 2100 MOVS r1,#0
000226 4608 MOV r0,r1
000228 f7fffffe BL LCD_SetWindow
;;;258 LCD_WriteGRAM_EN();
00022c f7fffffe BL LCD_WriteGRAM_EN
;;;259 for(i=0; i< X_SIZE*Y_SIZE; i++) //R61514为128*160
000230 2400 MOVS r4,#0
000232 e003 B |L1.572|
|L1.564|
;;;260 {
;;;261 LCD_DATA_OUT(color);
000234 4628 MOV r0,r5
000236 f7fffffe BL LCD_DATA_OUT
00023a 1c64 ADDS r4,r4,#1 ;259
|L1.572|
00023c f5b43f96 CMP r4,#0x12c00 ;259
000240 d3f8 BCC |L1.564|
;;;262 }
;;;263 LCD_WR_END();
000242 2001 MOVS r0,#1
000244 4975 LDR r1,|L1.1052|
000246 6008 STR r0,[r1,#0]
;;;264
;;;265 LCD_SetWindow(0,0, X_END, Y_END); //恢复全局作图区
000248 f240133f MOV r3,#0x13f
00024c f04f02ef MOV r2,#0xef
000250 f04f0100 MOV r1,#0
000254 4608 MOV r0,r1
000256 f7fffffe BL LCD_SetWindow
;;;266 }
00025a bd30 POP {r4,r5,pc}
;;;267 //填充一个矩形区域
ENDP
LCD_Fill PROC
;;;268 void LCD_Fill(u16 start_x,u16 start_y,
00025c e92d43f0 PUSH {r4-r9,lr}
;;;269 u16 end_x,u16 end_y,
;;;270 u16 color)
;;;271 {
000260 4604 MOV r4,r0
000262 460d MOV r5,r1
000264 4616 MOV r6,r2
000266 461f MOV r7,r3
000268 f8dd901c LDR r9,[sp,#0x1c]
;;;272 unsigned long i;
;;;273
;;;274 LCD_SetWindow(start_x, start_y, end_x, end_y);
00026c 463b MOV r3,r7
00026e 4632 MOV r2,r6
000270 4629 MOV r1,r5
000272 4620 MOV r0,r4
000274 f7fffffe BL LCD_SetWindow
;;;275
;;;276 LCD_WriteGRAM_EN();
000278 f7fffffe BL LCD_WriteGRAM_EN
;;;277 for(i=0; i < (end_x - start_x + 1)*(end_y - start_y + 1); i++)
00027c f04f0800 MOV r8,#0
000280 e004 B |L1.652|
|L1.642|
;;;278 {
;;;279 LCD_DATA_OUT(color); //填充颜色
000282 4648 MOV r0,r9
000284 f7fffffe BL LCD_DATA_OUT
000288 f1080801 ADD r8,r8,#1 ;277
|L1.652|
00028c 1b30 SUBS r0,r6,r4 ;277
00028e 1c40 ADDS r0,r0,#1 ;277
000290 1b79 SUBS r1,r7,r5 ;277
000292 1c49 ADDS r1,r1,#1 ;277
000294 4348 MULS r0,r1,r0 ;277
000296 4540 CMP r0,r8 ;277
000298 d8f3 BHI |L1.642|
;;;280 }
;;;281 LCD_WR_END();
00029a 2001 MOVS r0,#1
00029c 495f LDR r1,|L1.1052|
00029e 6008 STR r0,[r1,#0]
;;;282
;;;283 LCD_SetWindow(0,0, X_END, Y_END); //恢复全局作图区
0002a0 f240133f MOV r3,#0x13f
0002a4 f04f02ef MOV r2,#0xef
0002a8 f04f0100 MOV r1,#0
0002ac 4608 MOV r0,r1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -