?? lcd.asm
字號:
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_MiddlePage1
R3 = [y]
R3 += 4 //[y]換到下一頁起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
[ysize] = R3 //計算還要寫的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指針
[x] = R3
GOTO ?_Lcd_Block_MiddlePage
?_Lcd_Block_LastPage: //說明是最后一頁
R3 = [ysize]
CMP R3,0
JNE ?_Lcd_Block_LastPage0
GOTO ?_Lcd_Block_End
?_Lcd_Block_LastPage0:
R4 = maskcode //說明是最后一頁
R4 += [ysize] //低ysize位為1
R4 =[R4] //讀取maskcode碼
R4 = R4 XOR 0xFFFF //取反
R4 &= 0x00ff //取低8位有效
R1 = r4
call F_LCDData_Change
r4 = r1
[mask] = R4 //保存屏蔽碼
?_Lcd_Block_LastPage1:
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為1個字節
CALL __LcdPageWrite //調用頁寫入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_LastPage1
GOTO ?_Lcd_Block_End
?_Lcd_Block_JustOnePage:
R3 = 0x01
R5 = [k]
CALL _LCDShiftL //R3 = R3左移K位
R5 = R3
R4 = [ysize]
?_Lcd_Block_CalMask:
R4 -= 1
CMP R4,C_Null
JE ?_Lcd_Block_JustOnePage1
R3 = R3 LSL 1
R5 |= R3 //R5的[ysize+k --K位為1]
JMP ?_Lcd_Block_CalMask
?_Lcd_Block_JustOnePage1:
R1 = r5
call F_LCDData_Change
r5 = r1
[mask] = R5 //得到mask值
?_Lcd_Block_JustOnePage2:
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為1個字節
CALL __LcdPageWrite //調用頁寫入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_JustOnePage2
GOTO ?_Lcd_Block_End
?_Lcd_Block_WholePage:
R3 = 0xff
[mask] = R3 //
R3 = [ysize]
CMP R3 ,4 //看是否還要寫一滿頁?
JB ?_Lcd_Block_WPage1
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為1個字節
CALL __LcdPageWrite //調用頁寫入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_WholePage
R3 = [y]
R3 += 4 //[y]換到下一頁起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
[ysize] = R3 //計算還要寫的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指針
[x] = R3
GOTO ?_Lcd_Block_WholePage
?_Lcd_Block_WPage1:
R3 = [ysize]
CMP R3 ,C_Null
JNE ?_Lcd_Block_WPage2
GOTO ?_Lcd_Block_End
?_Lcd_Block_WPage2:
R4 = maskcode //說明是最后一頁
R4 += [ysize] //低ysize位為1
R4 =[R4] //讀取maskcode碼
R4 = R4 XOR 0xFFFF //取反
R4 &= 0x00ff //取低8位有效
[mask] = R4 //保存屏蔽碼
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為1個字節
CALL __LcdPageWrite //調用頁寫入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_WPage2
?_Lcd_Block_End:
R1 = 0xffff
[R_LcdGray] = r1
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------//
//功能:位圖操作,顯示位圖
//入口:起始坐標R_LcdStartDot(x,y),終止坐標R_LcdEndDot(x,y),
// R1-位圖地址(ROM地址),模式控制 R_LcdStatus,位圖所在BANK固定為0
//出口:無
// x:顯示列值
// y:顯示行值,這兩個用于確認顯示地址
// K:寫入字符的首頁的頁內偏移量,用于確認字符的起始行
// mask:屏蔽碼,用于標識寫入字節的有效位
// maskcode:對應不同的屏蔽碼,根據K值得到相應的屏蔽碼
// LcdBuffer:用于存儲從字庫中讀取到的數據
// R_TempBuffer:顯示數據轉換后得到的顯示緩沖區,用于一頁內的連續顯示
// R1save:保存位圖地址起始值
// xsize:用于保存位圖列向長度
// ysize:用于保存位圖行向長度
// xword:用于保存位圖列向所占的字地址長度
//影響寄存器:無
//----------------------------------------------------------//
.public F_Lcd_BitMap
F_Lcd_BitMap:
PUSH R1,R5 TO [SP]
[R_LcdStringPtr] = R2 //暫存
[R1save] = R1 //保存位圖初始值
PUSH R1 TO [SP] //保存位圖地址
CALL _Cal_Dot_Correct //判斷起終坐標是否符合要求
CMP R1,C_False
JNE ?_Lcd_BitMap11
POP R1 FROM [SP]
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap11:
POP R1 FROM [SP]
R4 = [x1] //如果x0>x1則結束
R3 = [x]
CMP R3,R4
JB ?_Lcd_BitMap21
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap21:
R4 -= R3
R4 = R4 LSR 1
[xsize] = R4 //得到xsize
R4 = [y1]
R3 = [y] //如果y0>y1則結束
CMP R3,R4
JB ?_Lcd_BitMap22
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap22:
R4 -= R3
[ysize] = R4 //得到ysize
CALL _CAL_maskcode //初始化maskcode值 8word
R3 = [y]
R3 &= 0x03 //取低三位
[k] = R3 //得到頁內偏移量
CMP R3,C_Null
JNE ?_Lcd_BitMap_Page
GOTO ?_Lcd_BitMap_WholePage
?_Lcd_BitMap_Page:
R4 = R4 + R3 //R4 = k + ysize
CMP R4,8 //看是否滿一頁
JA ?_Lcd_BitMap_FirstPage
GOTO ?_Lcd_BitMap_JustOnePage
?_Lcd_BitMap_FirstPage: //firstpage 高[8-k]位有效
R4 = maskcode //說明只需兩頁顯示
R4 += [k] //顯示第一頁
R4 =[R4] //讀取maskcode碼
[mask] = R4 //保存屏蔽碼
?_Lcd_BitMap_FirstPage1:
CALL F_Lcd_BitMap_Data //取要顯示的字
R1 += 1
[LcdBuffer] = R3
R5 = [k]
CALL _LCDShiftL //要顯示的字左移K位==>R3
[LcdBuffer] = R3
PUSH R1 TO [SP]
R1 = [y]
R1 = R1 LSR 3 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為2個字節
CALL __LcdPageWrite //調用頁寫入程序
POP R1 FROM [SP]
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_FirstPage1
R3 = [y]
R3 &= 0xf8
R3 += 8 //[y]換到下一頁起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -8
R3 += [k]
[ysize] = R3 //計算還要寫的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指針
[x] = R3
R1 = [R1save]
?_Lcd_BitMap_MiddlePage:
R3 = 0xff
[mask] = R3 //
R3 = [ysize]
CMP R3 ,8 //看是否還要寫一滿頁?
JB ?_Lcd_BitMap_LastPage
?_Lcd_BitMap_MiddlePage1:
CALL F_Lcd_BitMap_Data //取要顯示的字
R5 = -[k] //R1指針數據右移(8-k)位
R5 += 8
CALL _LCDShiftR //入口:R5 R3
R4 = R3 //R4暫存第一個數據
PUSH R1,R2 TO [SP]
R1 += [xsize] //得到要累加數據指針
CALL F_Lcd_BitMap_Data //取要顯示的字
R5 = [k]
CALL _LCDShiftL //(R1+R2)指針數據左移K位
R3 += R4 //兩次轉換結果相加
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 3 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為2個字節
CALL __LcdPageWrite //調用頁寫入程序
POP R1,R2 FROM [SP]
R1 += 1
R3 = [x] //向下移一個字
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_MiddlePage1
R3 = [y]
R3 += 8 //[y]換到下一頁起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -8
[ysize] = R3 //計算還要寫的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指針
[x] = R3
GOTO ?_Lcd_BitMap_MiddlePage
?_Lcd_BitMap_LastPage: //說明是最后一頁
R3 = [ysize]
CMP R3,0
JNE ?_Lcd_BitMap_LastPage0
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap_LastPage0:
R4 = maskcode //說明是最后一頁
R4 += [ysize] //低ysize位為1
R4 =[R4] //讀取maskcode碼
R4 = R4 XOR 0xFFFF //取反
R4 &= 0x00ff //取低8位有效
[mask] = R4 //保存屏蔽碼
?_Lcd_BitMap_LastPage1:
CALL F_Lcd_BitMap_Data //取要顯示的字
R5 = -[k]
R5 += 8
CALL _LCDShiftR //要顯示的字右移8-K位==>R3
R4 = R3
[LcdBuffer] = R3
PUSH R1 TO [SP]
R3 = [ysize]
CMP R3,[k]
JNA ?_Lcd_BitMap_LastPage2
R1 += [xsize] //得到要累加數據指針
R3 = [R1]
R5 = [k]
CALL _LCDShiftL //(R1+R2)指針數據左移K位
R3 += R4 //得到兩次轉換值的和
[LcdBuffer] = R3
?_Lcd_BitMap_LastPage2:
R1 = [y]
R1 = R1 LSR 3 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 2 //寫入長度為2個字節
CALL __LcdPageWrite //調用頁寫入程序
POP R1 FROM [SP]
R1 += 1 //取下一個顯示字
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_LastPage1
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap_JustOnePage:
R3 = 0x01
R5 = [k]
CALL _LCDShiftL //R3 = R3左移K位
R5 = R3
R4 = [ysize]
?_Lcd_BitMap_CalMask:
R4 -= 1
CMP R4,C_Null
JE ?_Lcd_BitMap_JustOnePage1
R3 = R3 LSL 1
R5 |= R3 //R5的[ysize+k --K位為1]
JMP ?_Lcd_BitMap_CalMask
?_Lcd_BitMap_JustOnePage1:
[mask] = R5 //得到mask值
?_Lcd_BitMap_JustOnePage2:
CALL F_Lcd_BitMap_Data //取要顯示的字
[LcdBuffer] = R3
R1 += 1 //取下一個顯示字
R5 = [k]
CALL _LCDShiftL //要顯示的字左移K位==>R3
PUSH R1 TO [SP]
R1 = [y]
R1 = R1 LSR 3 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 2 //寫入長度為2個字節
CALL __LcdPageWrite //調用頁寫入程序
POP R1 FROM [SP]
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_JustOnePage2
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap_WholePage:
R3 = 0xff
[mask] = R3 //
R3 = [ysize]
CMP R3 ,4 //看是否還要寫一滿頁?
JB ?_Lcd_BitMap_WPage1
CALL F_Lcd_BitMap_Data //取要顯示的字
[LcdBuffer] = R3
PUSH R1 TO [SP]
R1 = [y]
R1 = R1 LSR 2 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 2 //寫入長度為2個字節
CALL __LcdPageWrite //test for new lcd //CALL F_LcdPageWrite_New// //調用頁寫入程序
POP R1 FROM [SP]
R1 += 1 //向下移一個字
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_WholePage
//---------
// CALL F_Delay_BitMap
//-------------
R3 = [y]
R3 += 4 //[y]換到下一頁起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
[ysize] = R3 //計算還要寫的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指針
[x] = R3
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -