📄 nokia_5110.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -onokia_5110.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips NOKIA_LCD\nokia_5110.c]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
DelayXms PROC
;;;20 uint16 D_t;
;;;21 while(xs--)
000000 ea000006 B |L1.32|
;;;22 {
;;;23 for(D_t=Fcclk/1000;D_t>0;D_t--);
|L1.4|
000004 e59f18b8 LDR r1,|L1.2244|
000008 ea000002 B |L1.24|
|L1.12|
00000c e2412001 SUB r2,r1,#1
000010 e1a01802 LSL r1,r2,#16
000014 e1a01821 LSR r1,r1,#16
|L1.24|
000018 e3510000 CMP r1,#0
00001c cafffffa BGT |L1.12|
|L1.32|
000020 e1b02000 MOVS r2,r0
000024 e2403001 SUB r3,r0,#1
000028 e1a00803 LSL r0,r3,#16
00002c e1a00820 LSR r0,r0,#16
000030 1afffff3 BNE |L1.4|
;;;24 }
;;;25
;;;26 }
000034 e12fff1e BX lr
ENDP
LCD_write_byte PROC
;;;253 unsigned char i;
;;;254 IO1CLR=LCD_CE;
000038 e3a03501 MOV r3,#0x400000
00003c e59fc884 LDR r12,|L1.2248|
000040 e58c301c STR r3,[r12,#0x1c]
;;;255 if (command == 0)
000044 e3510000 CMP r1,#0
000048 1a000002 BNE |L1.88|
;;;256 IO0CLR=LCD_DC;
00004c e3a03a02 MOV r3,#0x2000
000050 e58c300c STR r3,[r12,#0xc]
000054 ea000002 B |L1.100|
;;;257 else
;;;258 IO0SET=LCD_DC;
|L1.88|
000058 e3a03a02 MOV r3,#0x2000
00005c e59fc864 LDR r12,|L1.2248|
000060 e58c3004 STR r3,[r12,#4]
;;;259 for(i=0;i<8;i++)
|L1.100|
000064 e3a02000 MOV r2,#0
000068 ea000011 B |L1.180|
;;;260 {
;;;261 if(dat&0x80)
|L1.108|
00006c e3100080 TST r0,#0x80
000070 0a000003 BEQ |L1.132|
;;;262 IO0SET=SDIN;
000074 e3a03a01 MOV r3,#0x1000
000078 e59fc848 LDR r12,|L1.2248|
00007c e58c3004 STR r3,[r12,#4]
000080 ea000002 B |L1.144|
;;;263 else
;;;264 IO0CLR=SDIN;
|L1.132|
000084 e3a03a01 MOV r3,#0x1000
000088 e59fc838 LDR r12,|L1.2248|
00008c e58c300c STR r3,[r12,#0xc]
;;;265 IO0CLR=SCLK;
|L1.144|
000090 e3a03b02 MOV r3,#0x800
000094 e59fc82c LDR r12,|L1.2248|
000098 e58c300c STR r3,[r12,#0xc]
;;;266 dat = dat << 1;
00009c e1a03c80 LSL r3,r0,#25
0000a0 e1a00c23 LSR r0,r3,#24
;;;267 IO0SET=SCLK;
0000a4 e3a03b02 MOV r3,#0x800
0000a8 e58c3004 STR r3,[r12,#4]
0000ac e2823001 ADD r3,r2,#1 ;259
0000b0 e20320ff AND r2,r3,#0xff ;259
|L1.180|
0000b4 e3520008 CMP r2,#8 ;259
0000b8 baffffeb BLT |L1.108| ;259
;;;268 }
;;;269
;;;270 IO1SET=LCD_CE;
0000bc e3a03501 MOV r3,#0x400000
0000c0 e59fc800 LDR r12,|L1.2248|
0000c4 e58c3014 STR r3,[r12,#0x14]
;;;271 }
0000c8 e12fff1e BX lr
ENDP
LCD_clear PROC
;;;63 void LCD_clear(void)
;;;64 {
0000cc e92d4010 PUSH {r4,lr}
;;;65 unsigned int i;
;;;66
;;;67 LCD_write_byte(0x0c, 0);
0000d0 e3a01000 MOV r1,#0
0000d4 e3a0000c MOV r0,#0xc
0000d8 ebfffffe BL LCD_write_byte
;;;68 LCD_write_byte(0x80, 0);
0000dc e3a01000 MOV r1,#0
0000e0 e3a00080 MOV r0,#0x80
0000e4 ebfffffe BL LCD_write_byte
;;;69
;;;70 for (i=0; i<504; i++)
0000e8 e3a04000 MOV r4,#0
0000ec ea000003 B |L1.256|
;;;71 LCD_write_byte(0, 1);
|L1.240|
0000f0 e3a01001 MOV r1,#1
0000f4 e3a00000 MOV r0,#0
0000f8 ebfffffe BL LCD_write_byte
0000fc e2844001 ADD r4,r4,#1 ;70
|L1.256|
000100 e3540f7e CMP r4,#0x1f8 ;70
000104 3afffff9 BCC |L1.240| ;70
;;;72 }
000108 e8bd4010 POP {r4,lr}
00010c e12fff1e BX lr
ENDP
LCD_init PROC
;;;37 void LCD_init(void)
;;;38 {
000110 e52de004 PUSH {lr}
;;;39 // 产生一个让LCD复位的低电平脉冲
;;;40 IO0CLR=LCD_RST;
000114 e3a00901 MOV r0,#0x4000
000118 e59f17a8 LDR r1,|L1.2248|
00011c e581000c STR r0,[r1,#0xc]
;;;41 DelayXms(1);
000120 e3a00001 MOV r0,#1
000124 ebfffffe BL DelayXms
;;;42 IO0SET=LCD_RST;
000128 e3a00901 MOV r0,#0x4000
00012c e59f1794 LDR r1,|L1.2248|
000130 e5810004 STR r0,[r1,#4]
;;;43 IO1CLR=LCD_CE;
000134 e3a00501 MOV r0,#0x400000
000138 e581001c STR r0,[r1,#0x1c]
;;;44 DelayXms(1);
00013c e3a00001 MOV r0,#1
000140 ebfffffe BL DelayXms
;;;45 IO1SET=LCD_CE;
000144 e3a00501 MOV r0,#0x400000
000148 e59f1778 LDR r1,|L1.2248|
00014c e5810014 STR r0,[r1,#0x14]
;;;46 DelayXms(1);
000150 e3a00001 MOV r0,#1
000154 ebfffffe BL DelayXms
;;;47 LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
000158 e3a01000 MOV r1,#0
00015c e3a00021 MOV r0,#0x21
000160 ebfffffe BL LCD_write_byte
;;;48 LCD_write_byte(0xc8, 0); // 设置偏置电压
000164 e3a01000 MOV r1,#0
000168 e3a000c8 MOV r0,#0xc8
00016c ebfffffe BL LCD_write_byte
;;;49 LCD_write_byte(0x06, 0); // 温度校正
000170 e3a01000 MOV r1,#0
000174 e3a00006 MOV r0,#6
000178 ebfffffe BL LCD_write_byte
;;;50 LCD_write_byte(0x13, 0); // 1:48
00017c e3a01000 MOV r1,#0
000180 e3a00013 MOV r0,#0x13
000184 ebfffffe BL LCD_write_byte
;;;51 LCD_write_byte(0x20, 0); // 使用基本命令
000188 e3a01000 MOV r1,#0
00018c e3a00020 MOV r0,#0x20
000190 ebfffffe BL LCD_write_byte
;;;52 LCD_clear(); // 清屏
000194 ebfffffe BL LCD_clear
;;;53 LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
000198 e3a01000 MOV r1,#0
00019c e3a0000c MOV r0,#0xc
0001a0 ebfffffe BL LCD_write_byte
;;;54 IO1CLR=LCD_CE; // 关闭LCD
0001a4 e3a00501 MOV r0,#0x400000
0001a8 e59f1718 LDR r1,|L1.2248|
0001ac e581001c STR r0,[r1,#0x1c]
;;;55 }
0001b0 e49de004 POP {lr}
0001b4 e12fff1e BX lr
ENDP
LCD_set_XY PROC
;;;83 void LCD_set_XY(unsigned char X, unsigned char Y)
;;;84 {
0001b8 e92d4030 PUSH {r4,r5,lr}
0001bc e1a04000 MOV r4,r0
0001c0 e1a05001 MOV r5,r1
;;;85 LCD_write_byte(0x40 | Y, 0); // column
0001c4 e3850040 ORR r0,r5,#0x40
0001c8 e3a01000 MOV r1,#0
0001cc ebfffffe BL LCD_write_byte
;;;86 LCD_write_byte(0x80 | X, 0); // row
0001d0 e3840080 ORR r0,r4,#0x80
0001d4 e3a01000 MOV r1,#0
0001d8 ebfffffe BL LCD_write_byte
;;;87 }
0001dc e8bd4030 POP {r4,r5,lr}
0001e0 e12fff1e BX lr
ENDP
LCD_write_char PROC
;;;97 void LCD_write_char(unsigned char c)
;;;98 {
0001e4 e92d4030 PUSH {r4,r5,lr}
0001e8 e1a04000 MOV r4,r0
;;;99 unsigned char line;
;;;100
;;;101 c -= 32;
0001ec e2440020 SUB r0,r4,#0x20
0001f0 e20040ff AND r4,r0,#0xff
;;;102
;;;103 for (line=0; line<6; line++)
0001f4 e3a05000 MOV r5,#0
0001f8 ea000007 B |L1.540|
;;;104 LCD_write_byte(font6x8[c][line], 1);
|L1.508|
0001fc e0841084 ADD r1,r4,r4,LSL #1
000200 e59f26c4 LDR r2,|L1.2252|
000204 e0821081 ADD r1,r2,r1,LSL #1
000208 e7d10005 LDRB r0,[r1,r5]
00020c e3a01001 MOV r1,#1
000210 ebfffffe BL LCD_write_byte
000214 e2850001 ADD r0,r5,#1 ;103
000218 e20050ff AND r5,r0,#0xff ;103
|L1.540|
00021c e3550006 CMP r5,#6 ;103
000220 bafffff5 BLT |L1.508| ;103
;;;105 }
000224 e8bd4030 POP {r4,r5,lr}
000228 e12fff1e BX lr
ENDP
LCD_write_english_string PROC
;;;116 void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
;;;117 {
00022c e92d4070 PUSH {r4-r6,lr}
000230 e1a04000 MOV r4,r0
000234 e1a06001 MOV r6,r1
000238 e1a05002 MOV r5,r2
;;;118 LCD_set_XY(X,Y);
00023c e1a01006 MOV r1,r6
000240 e1a00004 MOV r0,r4
000244 ebfffffe BL LCD_set_XY
;;;119 while (*s)
000248 ea000002 B |L1.600|
;;;120 {
;;;121 LCD_write_char(*s);
|L1.588|
00024c e5d50000 LDRB r0,[r5,#0]
000250 ebfffffe BL LCD_write_char
;;;122 s++;
000254 e2855001 ADD r5,r5,#1
|L1.600|
000258 e5d50000 LDRB r0,[r5,#0]
00025c e3500000 CMP r0,#0
000260 1afffff9 BNE |L1.588|
;;;123 }
;;;124 }
000264 e8bd4070 POP {r4-r6,lr}
000268 e12fff1e BX lr
ENDP
LCD_write_chinese_string PROC
;;;142 unsigned char line,unsigned char row)
;;;143 {
00026c e92d4ff0 PUSH {r4-r11,lr}
000270 e1a04000 MOV r4,r0
000274 e1a05001 MOV r5,r1
000278 e1a06002 MOV r6,r2
00027c e1a07003 MOV r7,r3
000280 e28d9024 ADD r9,sp,#0x24
000284 e8990300 LDM r9,{r8,r9}
;;;144 unsigned char i,n;
;;;145
;;;146 LCD_set_XY(X,Y); //设置初始位置
000288 e1a01005 MOV r1,r5
00028c e1a00004 MOV r0,r4
000290 ebfffffe BL LCD_set_XY
;;;147
;;;148 for (i=0;i<num;)
000294 e3a0a000 MOV r10,#0
000298 ea000022 B |L1.808|
;;;149 {
;;;150 for (n=0; n<ch_with*2; n++) //写一个汉字
|L1.668|
00029c e3a0b000 MOV r11,#0
0002a0 ea000017 B |L1.772|
;;;151 {
;;;152 if (n==ch_with) //写汉字的下半部分
|L1.676|
0002a4 e15b0006 CMP r11,r6
0002a8 1a00000c BNE |L1.736|
;;;153 {
;;;154 if (i==0) LCD_set_XY(X,Y+1);
0002ac e35a0000 CMP r10,#0
0002b0 1a000004 BNE |L1.712|
0002b4 e2850001 ADD r0,r5,#1
0002b8 e20010ff AND r1,r0,#0xff
0002bc e1a00004 MOV r0,r4
0002c0 ebfffffe BL LCD_set_XY
0002c4 ea000005 B |L1.736|
;;;155 else
;;;156 LCD_set_XY((X+(ch_with+row)*i),Y+1);
|L1.712|
0002c8 e2852001 ADD r2,r5,#1
0002cc e20210ff AND r1,r2,#0xff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -