📄 lcdr.asm
字号:
?_Lcd_reverse_LOOP0:
// CALL SET_C
R4 = R2 & 0x000F;
R4 |=0x0A00;
[P_Lcd501Ctrl] = R4;
//送CA_MSB
R4 = R2 & 0x00F0;
R4 = R4 LSR 4;
R4 |=0x0A10;
[P_Lcd501Ctrl] = R4;
NOP;
R3 = 0x0D00;
[P_Lcd501Ctrl] = R3;
NOP;
NOP; //先空读一下
R3 = 0x0D00;
[P_Lcd501Ctrl] = R3;
NOP;
NOP;
R3 = [P_Lcd501Data];
// CALL SET_C
R4 = R2 & 0x000F;
R4 |=0x0A00;
[P_Lcd501Ctrl] = R4;
//送CA_MSB
R4 = R2 & 0x00F0;
R4 = R4 LSR 4;
R4 |=0x0A10;
[P_Lcd501Ctrl] = R4;
R3 ^= 0xFFFF; //将取出来的数按位取反
R3 &= 0x00FF
R3 |= 0x0E00;
[P_Lcd501Ctrl] = R3
R2 +=1
CMP R2,128
JB ?_Lcd_reverse_LOOP0
R2 = 0
R1 += 1
CMP R1,32
JB ?_Lcd_reverse_LOOP
POP R1,R5 FROM [SP];
RETF
//写缓冲区数据到显示
//入口地址:R4,使用前将首地址写入R4
F_Lcd_bitmap:
PUSH R1,R5 TO [SP];
R1 = 0;
R2 = 0;
CALL SET_P_C
R3 = 128*128/4;
?_Lcd_bitmap_LOOP:
R1 = [R4++];
// R1 ^=0x00FF; //将取出来的数按位取反
R1 |= C_WriteData;
[P_Lcd501Ctrl] = R1;
R3 -=1;
JNZ ?_Lcd_bitmap_LOOP;
POP R1,R5 FROM [SP];
RETF
//一条线
F_LINE_T: PUSH R1,R5 TO [SP];
R1 = 0;
R2 = 0;
R3 = 32;
CALL SET_C
CALL W_DATE0 //WRITE "O" TO ALL SCREEN
?_LLOOP:
CALL SET_P
CALL W_03ROW
CALL F_Delay96ms
CALL SET_P
CALL W_00ROW
CALL SET_P
CALL W_0CROW
CALL F_Delay96ms
CALL SET_P
CALL W_00ROW
CALL SET_P
CALL W_30ROW
CALL F_Delay96ms
CALL SET_P
CALL W_00ROW
CALL SET_P
CALL W_C0ROW
CALL F_Delay96ms
CALL SET_P
CALL W_00ROW
R1 +=1;
R3 -=1;
JNZ ?_LLOOP;
POP R1,R5 FROM [SP];
RETF
//写一行0
W_00ROW: R5 = 0x0000;
R5 |=C_WriteData;
R4 = 256;
?_LOOP1: [P_Lcd501Ctrl] = R5;
R4 -=1;
JNZ ?_LOOP1;
RETF
//写一行3
W_03ROW: R5 = 0x0003;
R5 |=C_WriteData;
R4 = 256;
?_LOOP2: [P_Lcd501Ctrl] = R5;
R4 -=1;
JNZ ?_LOOP2;
RETF
//写一行0000,1100
W_0CROW: R5 = 0x000C;
R5 |=C_WriteData;
R4 = 256;
?_LOOP3: [P_Lcd501Ctrl] = R5;
R4 -=1;
JNZ ?_LOOP3;
RETF
//写一行0011,0000
W_30ROW: R5 = 0x0030;
R5 |=C_WriteData;
R4 = 256;
?_LOOP4: [P_Lcd501Ctrl] = R5;
R4 -=1;
JNZ ?_LOOP4;
RETF
//写一行1100,0000
W_C0ROW: R5 = 0x00C0;
R5 |=C_WriteData;
R4 = 256;
?_LOOP5: [P_Lcd501Ctrl] = R5;
R4 -=1;
JNZ ?_LOOP5;
RETF
//画一条线
//入口:R1起始行地址,R2起始列地址
LINE_SCR:
R1 = 0;
R2 = 0;
CALL SET_P_C
R2 = 8192;
?_RE_W: R4 = 0x0000;
// R5 = 4;
?_LOOP: R3 = 128;
?_LINE: R1 = C_WriteData;
R4 |= R1;
[P_Lcd501Ctrl] = R4;
R2 -=1;
JZ ?_SCROLL;
R3 -=1;
JNZ ?_LINE;
// R4 +=0x0055;
CMP R4,0x00FF;
JZ ?_RE_W;
CMP R2,8192;
JNZ ?_LOOP;
//滚屏127
R3 = 1;
?_SCROLL: R1 = 0x0A40;
[P_Lcd501Ctrl] = R1;
R1 = 0x0A50;
[P_Lcd501Ctrl] = R1;
R1 = 0xFFFF
[d_ns] = R1;
// CALL DELAYM
R3 -=1;
JNZ ?_SCROLL;
RETF
//RAM写全零
W_DATE0: PUSH R1,R5 TO [SP];
R3 = 8192;
R1 = 0;
R2 = 0;
CALL SET_P_C
R4 = 0x0E00;
?_LINE0: [P_Lcd501Ctrl] = R4;
// R2 +=1;
R3 -=1;
JNZ ?_LINE0;
POP R1,R5 FROM [SP];
RETF
//读当前数据存储在 TABLE
//R3存储读取字节数
READ_DATA: PUSH R1,R5 TO [SP];
R3 = 2048;
R2 = 0;
?_ADD_IN: R5 = 128;
R1 = 0;
CALL SET_P_C
R2 +=1;
R4 = TABLE;
R1 = C_ReadData;
[P_Lcd501Ctrl] = R1;
R1 = 0x000F;
[d_ns] = R1;
CALL DELAYM
?_READ_LOOP: R1 = C_ReadData;
[P_Lcd501Ctrl] = R1;
R1 = 0x000F;
[d_ns] = R1;
CALL DELAYM
// CALL DELAYN
R1 = [P_Lcd501Data];
[R4++] = R1;
R5 -=1;
JZ ?_ADD_IN;
R3 -=1;
JNZ ?_READ_LOOP;
POP R1,R5 FROM [SP];
RETF
//延时ms
DELAYM: PUSH R2,R5 TO [SP];
R2 =[d_ns];
?_DELAYM_LOOP: NOP;
R2 -=1;
JNZ ?_DELAYM_LOOP;
POP R2,R5 FROM [SP];
RETF
//延时us 12+13+5=5+5 =40
DELAYN:
// NOP;
// NOP;
// NOP;
RETF
//写命令
W_COM:
PUSH R2,R5 TO [SP];
R1 |=C_WriteCommand;
[P_Lcd501Ctrl] = R1;
// R1 = 0x0fff;
// [d_ns] = R1;
// CALL DELAYM //??
POP R2,R5 FROM [SP];
RETF
//写数据
W_DATA: PUSH R2,R5 TO [SP];
R1 |=C_WriteData;
[P_Lcd501Ctrl] = R1;
// R1 = 0x02FF;
// [d_ns] = R1;
// CALL DELAYM
// CALL DELAYN
POP R2,R5 FROM [SP];
RETF
F_LcdInit:
R3 = 0x0AE2; // sys rest
[P_Lcd501Ctrl] = R3;
R1 = 0x0FFF
[d_ns] = R1;
CALL DELAYM //延时
R1 = 0x00EA;
CALL W_COM
R1 = 0x0027;
CALL W_COM
R1 = 0x0023; //set multiplex ratio
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -