?? lcd.asm
字號:
// GOTO ?_Lcd_Line_End
//?_Lcd_Line44: //說明寫入頁數>1
// R1 = maskcode //寫入第一頁
// R1 += [k]
// R1 = [R1]
// [mask] = R1
// R1 = [y]
// R1 = R1 LSR 3
// R2 = [x]
// R3 = mask
// R4 = 1
// CALL __LcdPageWriteWord //調用頁寫入程序
// R1 = [ysize]
// R1 -= 8
// R1 += [k]
// [ysize] = R1
// R1 = [y]
// R1 += 8
// [y] = R1
//?_Lcd_Line43: //從頁起始開始
// R1 = [ysize]
// CMP R1,0x08
// JNB ?_Lcd_Line46
// GOTO ?_Lcd_Line47
//?_Lcd_Line46:
// R1 = 0xFF
// [mask] = R1
// R1 = [y]
// R1 = R1 LSR 3 //得到頁碼
// R2 = [x]
// R3 = mask
// R4 = 1
// CALL __LcdPageWriteWord //調用頁寫入程序
// R1 = [ysize]
// R1 -= 8
// [ysize] = R1
// R1 = [y]
// R1 += 8
// [y] = R1
// JMP ?_Lcd_Line43
//?_Lcd_Line47:
// R1 = [ysize]
// CMP R1,C_Null
// JNE ?_Lcd_Line48
// GOTO ?_Lcd_Line_End //行列值都不等,返回失敗
//?_Lcd_Line48: //寫入最后一頁
// R1 = maskcode
// R1 += [ysize]
// R1 = [R1]
// R1 = R1 XOR 0xFFFF
// R1 &= 0xFF //mask為低ysize位為1
// [mask] = R1
// R1 = [y]
// R1 = R1 LSR 3
// R2 =[x]
// R3 = mask
// R4 = 1
// CALL __LcdPageWriteWord //調用頁寫入程序
// GOTO ?_Lcd_Line_End
//?_Lcd_Line5: //判斷是否是畫橫線
// R1 = [y]
// CMP R1,[y1]
// JE ?_Lcd_Line51
// GOTO ?_Lcd_Line_End //行列值都不等,返回失敗
//?_Lcd_Line51:
// R1 &= 0x07 //畫水平線
// [k] = R1
// CMP R1,C_Null
// JNE ?_Lcd_Line53
// R3 = 0x01
// [mask] = R3
// JMP ?_Lcd_Line54
//?_Lcd_Line53:
// R3 = 0x01
// R5 = [k]
// CALL _LCDShiftL //0x01左移K位
// [mask] = R3 //得到屏蔽碼
//?_Lcd_Line54:
// R1 = [x]
// CMP R1,[x1]
// JNA ?_Lcd_Line52
// R2 = [x1] //令[x] <[x1]
// [x1] = R1
// [x] = R2
//?_Lcd_Line52:
// R1 = [y]
// R1 = R1 LSR 3 //得到頁值
// R2 = [x] //得到列值
// R3 = mask
// R4 = 1
// CALL __LcdPageWriteWord //調用頁寫入程序
// R2 =[x]
// R2 += 1
// [x] = R2
// CMP R2,[x1]
// JNE ?_Lcd_Line52
//?_Lcd_Line_End:
// POP R1,R5 FROM [SP]
// RETF
//----------------------------------------------------------//
//名稱:F_Lcd_Track
//功能:畫任意角度的線,包括橫線或豎線
//入口:模式R_LcdStatus,起始坐標R_LcdStartDot(x,y),終止坐標R_LcdEndDot(x,y)
//出口:無
//影響寄存器:無
//存在問題:沒有xy同時加1的情況,所以45度時會出現雙線
//----------------------------------------------------------//
.public F_Lcd_Track
F_Lcd_Track:
PUSH R1,R5 TO [SP]
R1 = [R_LcdStartDot]
CMP R1,[R_LcdEndDot]
JNE ?_Lcd_track_0
GOTO ?_Lcd_track_End
?_Lcd_track_0:
R1 = C_False
[chanxy] = R1 //xy坐標沒有與換
?_Lcd_track:
CALL _Cal_Dot_Correct //用到R1 R2寄存器
R2 = [chanxy]
CMP R2,C_True
JE ?_Lcd_track1
CMP R1,C_False
JNE ?_Lcd_track1
GOTO ?_Lcd_track_End //坐標不符合要求則退出
?_Lcd_track1:
R1 = 1
[stepx] = R1
[stepy] = R1
R1 = [x1]
R1 -= [x] //dx
[dx] = R1
CMP R1,0x8000
JNA ?_Lcd_track2
R1 = [x] //x1 < x
R1 -= [x1] //得到dx的絕對值
[dx] = R1
R2 = -1
[stepx] = R2 //
?_Lcd_track2:
R2 = [y1]
R2 -= [y] //dy
[dy] = R2
CMP R2,0x8000
JNA ?_Lcd_track3
R2 = [y]
R2 -= [y1]
[dy] = R2
R3 = -1
[stepy] = R3 //得到stepy
?_Lcd_track3:
CMP R1,R2 //R1==dx; R2 ==dy
JNB ?_Lcd_track4
R1 = [R_LcdStartDot] //xy互換
R2 = R1 LSR 4
R2 = R2 LSR 4
R1 = R1 LSL 4
R1 = R1 LSL 4
R1 |= R2 //高低字節互換
[R_LcdStartDot] = R1
R1 = [R_LcdEndDot] //xy互換
R2 = R1 LSR 4
R2 = R2 LSR 4
R1 = R1 LSL 4
R1 = R1 LSL 4
R1 |= R2 //高低字節互換
[R_LcdEndDot] = R1
R1 = C_True
[chanxy] = R1 //xy坐標與換過
GOTO ?_Lcd_track
?_Lcd_track4: //dx>dy
R1 = [stepx]
CMP R1,0x8000
JNA ?_Lcd_track5
R4 = [R_LcdStartDot]
R4 += 1 //起點包括終點不包括
R5 = [R_LcdEndDot]
R5 += 1 //
[R_LcdStartDot] = R5 //起點與終點與換
[R_LcdEndDot] = R4
GOTO ?_Lcd_track
?_Lcd_track5: //畫線
R1 = -[dx]
[e] = R1 //得到判斷標志
R1 = [dy]
R1 = R1 LSL 1 //得到2dy
[dy] = R1
R1 = [dx]
R1 = R1 LSL 1 //得到2dx
[dx] = R1
?_Lcd_track7: //畫線開始
R1 = [x]
R2 = [y] //保護xy值
R3 = [chanxy]
CMP R3,C_True
JNE ?_Lcd_track6
[y] = R1
[x] = R2 //xy坐標互換
?_Lcd_track6:
CALL _Lcd_PutPixul
R1 += 1
[x] = R1 //得到原x坐標,并加1
[y] = R2 //重新得到原xy值
R1 = [e]
R1 += [dy]
[e] = R1 //e = e+ 2 * dy
CMP R1,0x8000
JA ?_Lcd_track8
R1 = [y] //e>=0 ,y同時變化
R1 += [stepy]
[y] = R1
R1 = [e]
R1 -= [dx]
[e] = R1
?_Lcd_track8:
R1 = [x]
CMP R1,[x1]
JE ?_Lcd_track_End
GOTO ?_Lcd_track7
?_Lcd_track_End:
POP R1,R5 FROM [SP] //結束
RETF
//----------------------------------------------------------//
//名稱:F_Lcd_Rectangle
//功能:畫矩形
//入口:模式R_LcdStatus,起始坐標R_LcdStartDot(x,y),終止坐標R_LcdEndDot(x,y)
//出口:無
//影響寄存器:無
//--------------------------------------------------------//
.public F_Lcd_Rectangle
F_Lcd_Rectangle:
PUSH R1,R5 TO [SP]
R1 = [R_LcdStartDot]
R2 = R1 LSR 4
R2 = R2 LSR 4
R2 &= 0xFF
[y0] = R2
R1 &= 0xFF
[x0] = R1
R1 = [R_LcdEndDot]
R2 = R1 LSR 4
R2 = R2 LSR 4
R2 &= 0xFF
[y2] = R2
R1 &= 0xFF
[x2] = R1 //得到x0 y0 x2 y2
R2 = [y0]
R2 = R2 LSL 4
R2 = R2 LSL 4
R2 |= R1 //R2= [y0 x2]
[R_LcdEndDot] = R2
CALL F_Lcd_Track //畫(y0 x0)--(y0 x2 )的水平線
R1 = [x0]
R2 = [y2]
R2 = R2 LSL 4
R2 = R2 LSL 4
R2 |= R1
[R_LcdEndDot] = R2
CALL F_Lcd_Track //畫(y0 x0)--(y2 x0 )的豎線
R2 = [R_LcdEndDot]
R2 -= 0x100
[R_LcdEndDot] = R2 //不包括Y2和X2兩邊的直線
R1 = [x2]
R2 = [y2]
R2 -= 1
R2 = R2 LSL 4
R2 = R2 Lsl 4
R2 |= R1
[R_LcdStartDot] = R2
CALL F_Lcd_Track //畫(y2 x0)--(y2 x2 )的豎線
R1 = [R_LcdStartDot]
R1 -= 1
[R_LcdStartDot] = R1
R1 = [x2]
R1 -= 1
R2 = [y0]
R2 = R2 LSL 4
R2 = R2 Lsl 4
R2 |= R1
[R_LcdEndDot] = R2
CALL F_Lcd_Track //畫(y2 x2)--(y0 x2 )的豎線
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------//
//名稱:F_Lcd_Block
//功能:塊操作,對某一區塊進行清除、覆蓋、或、異或操作
//入口:模式R_LcdStatus,起始坐標R_LcdStartDot(x,y),終止坐標R_LcdEndDot(x,y)
// 灰度R_LcdGray(只對模式1有效)
//出口:無
//影響寄存器:無
//--------------------------------------------------------//
.public F_Lcd_Block
F_Lcd_Block:
PUSH R1,R5 TO [SP]
CALL _Cal_Dot_Correct //判斷起終坐標是否符合要求
CMP R1,C_True
JE ?_Lcd_Block_0
GOTO ?_Lcd_Block_End
?_Lcd_Block_0:
R1 = [R_LcdStartDot] //判斷起始點與終止點
R2 = [R_LcdEndDot] //起點必須小于終點
CMP R1,R2
JB ?_Lcd_Block_1
GOTO ?_Lcd_Block_End
?_Lcd_Block_1:
R1 =[y] //判斷行值是否相同
CMP R1,[y1]
JNE ?_Lcd_Block_2
CALL F_Lcd_Track //畫線
GOTO ?_Lcd_Block_End
?_Lcd_Block_2:
R1 = [x] //判斷列值是否相同
CMP R1,[x1]
JNE ?_Lcd_Block_3
CALL F_Lcd_Track //畫線
GOTO ?_Lcd_Block_End
?_Lcd_Block_3:
CMP R1,[x1] //比較起點與終點X坐標
JB ?_Lcd_Block_4
GOTO ?_Lcd_Block_End
?_Lcd_Block_4:
R4 = [y1]
R3 = [y]
CMP R4,R3 //比較起點與終點X坐標
JA ?_Lcd_Block_5
GOTO ?_Lcd_Block_End
?_Lcd_Block_5:
R4 -= R3
[ysize] = R4
CALL _CAL_maskcode //初始化maskcode值 8word
R3 = [y]
R3 &= 0x03 //取低三位
[k] = R3 //得到頁內偏移量
CMP R3,C_Null
JNE ?_Lcd_Block_Page
GOTO ?_Lcd_Block_WholePage
?_Lcd_Block_Page:
R4 = R4 + R3 //R4 = k = ysize
CMP R4,4 //看是否滿一頁
JA ?_Lcd_Block_FirstPage
GOTO ?_Lcd_Block_JustOnePage
?_Lcd_Block_FirstPage: //firstpage 高[8-k]位有效
R4 = maskcode //說明只需兩頁顯示
R4 += [k] //顯示第一頁
R4 =[R4] //讀取maskcode碼
r1 = r4
call F_LCDData_Change
r4 = r1
[mask] = R4 //保存屏蔽碼
?_Lcd_Block_FirstPage1:
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_FirstPage1
R3 = [y]
R3 &= 0xfc
R3 += 4 //[y]換到下一頁起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
R3 += [k]
[ysize] = R3 //計算還要寫的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指針
[x] = R3
?_Lcd_Block_MiddlePage:
R1 = 0xff
CALL F_LCDData_Change
R3 = R1
[mask] = R3 //
R3 = [ysize]
CMP R3 ,4 //看是否還要寫一滿頁?
JB ?_Lcd_Block_LastPage
?_Lcd_Block_MiddlePage1:
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到寫入頁值
R2 = [x] //得到寫入列值
R3 = LcdBuffer
R4 = 1 //寫入長度為1個字節
CALL __LcdPageWrite //調用頁寫入程序
R3 = [x] //向下移一個字
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -