📄 lcdr.asm
字号:
.include SPT6608.inc
.ram
.var page
.var cloumn
.var d_ns
.var INCRE
DIS_BUF: .DW 2048 //128*30
.const C_WriteCommand = 0x0A00
.const C_WriteData = 0x0E00
.const C_ReadStatus = 0x0900
.const C_ReadData = 0x0D00
.text
.public _main
_main:
SP = 0xFFF; //堆栈初始化
R1 = 0x55AA;
[P_Watchdog_Clr] = R1; //复位后清看门狗
R1 = 0xFFFF;
[P_IntClr] = R1; //清所有中断标志位
R1 = B_28M + B_FoscDivBy2;
[P_SystemClock] = R1; //初始速度调整为低速0.7M
//iod0设置为输出
R1 = 00000001b;
[P_IOD_Dir] = R1
R1 = 00000001b
[P_IOD_Data] = R1
CALL F_LcdInit
LCDTEST:
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
CALL F_Lcd_clear
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
R4 = TABLE;
CALL F_Lcd_bitmap
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
CALL F_Delay1s
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
// CALL F_Lcd_reverse_block
CALL F_Lcd_reverse
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
CALL F_Delay1s
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
CALL F_Lcd_clear
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
R4 = TABLE1;
CALL F_Lcd_bitmap
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
CALL F_Delay1s
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
// CALL F_Lcd_reverse_block
CALL F_Lcd_reverse
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
CALL F_Delay1s
// CALL W_DATE0 //清全屏
// CALL F_Delay1s
R1 = 00000000b
[P_IOD_Data] = R1 //开始前输出低
CALL F_LINE_T
R1 = 00000001b
[P_IOD_Data] = R1 //结束后输出高
CALL F_Delay1s
GOTO LCDTEST;
//设置页地址
SET_P: PUSH R1,R5 TO [SP];
R4 = R1;
//
R1 &=0x0010;
R3 = R1 LSR 4;
R1 = 0x0A70;
R1 |= R3;
[P_Lcd501Ctrl] = R1;
//
R4 &=0x000F;
R3 = 0x0A60;
R3 |=R4;
[P_Lcd501Ctrl] = R3;
POP R1,R5 FROM [SP];
RETF
//送列地址
SET_C: PUSH R4 TO [SP];
//送CA_LSB
R4 = R2 & 0x000F;
R4 |=C_WriteCommand;
[P_Lcd501Ctrl] = R4;
//送CA_MSB
R4 = R2 & 0x00F0;
R4 = R4 LSR 4;
R4 |=0x0A10;
[P_Lcd501Ctrl] = R4;
POP R4 FROM [SP];
RETF;
//设置页地址和列地址。
//入口:R1为页地址,R2为列地址
SET_P_C: PUSH R1,R5 TO [SP];
R4 = R1;
// R3 =0x0000;
// [P_Lcd501BdySel] = R3;
//送PA_MSB
R1 &=0x0010;
R3 =R1 LSR 4;
R1 = 0x0A70;
R1 |= R3;
[P_Lcd501Ctrl] = R1;
//送PA_LSB
R4 &=0x000F;
R3 = 0x0A60;
R3 |=R4;
[P_Lcd501Ctrl] = R3;
//送CA_LSB
R4 = R2;
R3 = C_WriteCommand;
R2 &=0x000F;
R3 |=R2;
[P_Lcd501Ctrl] = R3;
//送CA_MSB
R3 = 0x0A10;
R4 &=0x00F0;
R4 = R4 LSR 4;
R3 |=R4;
[P_Lcd501Ctrl] = R3;
POP R1,R5 FROM [SP];
RETF;
//送显示数据
//入口:R1
SEND_DATA:
R2 = C_WriteData;
R2 |= R1;
[P_Lcd501Ctrl] = R1;
RETF;
//读当前地址数据
//入口:R1
RE_DIS_DATA: R1 = C_ReadData;
[P_Lcd501Ctrl] = R1;
CALL DELAYN
R1 = C_ReadData;
[P_Lcd501Ctrl] = R1;
CALL DELAYN
R1 = [P_Lcd501Data];
RETF;
// 全部点亮
ALL_ON_SCR: R1 = 0x0AA5;
[P_Lcd501Ctrl] = R1;
RETF;
//显示图片
//
DISPLAY_BMP: PUSH R1,R5 TO [SP];
R5 = 8;
?_SHADE_LOOP: R4 = 4;
R1 = 0;
R2 = 0;
?_FOUR_LEVEL: R3 = 0;
[INCRE] =R3;
?_PAGE_LOOP: CALL SET_P_C
R3 = 128;
PUSH R1,R5 TO [SP];
?_W_BMP: R1 = 0;
R1 +=[INCRE];
CALL W_DATA
R3 -=1;
JNZ ?_W_BMP;
R2 = [INCRE];
R2 +=63;
[INCRE] =R2;
POP R1,R5 FROM [SP];
R1 +=1;
R2 =R1-31;
JNZ ?_PAGE_LOOP;
R4 -=1;
JNZ ?_FOUR_LEVEL;
R5 -=1;
JNZ ?_SHADE_LOOP;
POP R1,R5 FROM [SP];
RETF
//clear screen
F_Lcd_clear:
PUSH R1,R5 TO [SP];
R1 = 0;
R2 = 0;
CALL SET_P_C
R3 = 128*128/4;
?_Lcd_clear_LOOP:
R1 = C_WriteData;
[P_Lcd501Ctrl] = R1;
R3 -=1;
JNZ ?_Lcd_clear_LOOP;
POP R1,R5 FROM [SP];
RETF
//read data one page, reverse and write
F_Lcd_reverse_block:
PUSH R1,R5 TO [SP];
R1 = 0;
R2 = 0;
?_Lcd_reverse_BLOOP:
R4 = DIS_BUF
CALL SET_P_C
R3 = C_ReadData;
[P_Lcd501Ctrl] = R3;
CALL DELAYN //先空读一下
?_Lcd_reverse_b0:
R3 = C_ReadData;
[P_Lcd501Ctrl] = R3;
CALL DELAYN
R3 = [P_Lcd501Data];
// CALL SET_P_C
R3 ^=0xFFFF; //将取出来的数按位取反
R3 &= 0x00FF
[R4++] = R3
R2 +=1
CMP R2,128
JB ?_Lcd_reverse_b0
R2 = 0
R4 = DIS_BUF
CALL SET_P_C
?_Lcd_reverse_b1:
R3 = [R4++]
R3 |= C_WriteData;
[P_Lcd501Ctrl] = R3
R2 +=1
CMP R2,128
JB ?_Lcd_reverse_b1
R2 = 0
R1 += 1
CMP R1,32
JB ?_Lcd_reverse_BLOOP
POP R1,R5 FROM [SP];
RETF
//read data reverse and write
F_Lcd_reverse:
PUSH R1,R5 TO [SP];
R1 = 0;
R2 = 0;
?_Lcd_reverse_LOOP:
CALL SET_P
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -