?? lcd.asm
字號:
//**********************************************************//
//* Project Name: OC6678
//* Program Name: lcd.ASM
//* Applied Body: SPT6608A + splc501c + 132*65pixel lcd
//* Description: LCD control + display
//* Compile: Sunplus u'nSP IDE v1.13.3
//* programmer: lzb/cher
//* Current Version: 1.00
//* Write Date: 2005/5/9
//**********************************************************//
.include SPT6608.inc
.include lcd.h
.include SPT6608.h
.const NEWLCD = 1
.external F_Delay96ms,F_Delay1s,F_Delay10ms
.external F_Div//,F_Delay_BitMap
.external LcdBuffer,T_GuageIcon
.external R_LcdGray
//緩沖區(qū)名 大小 已使用 起始地址
//LcdBuffer 62 62 BihuaArea+137
.define R_TempBuffer LcdBuffer+16 //定義一個長度為16的中間緩沖區(qū)
.define mask LcdBuffer+32 //定義一個屏蔽碼變量(模塊內(nèi)有效)
.define x LcdBuffer+33 //定義為列值
.define y LcdBuffer+34 //定義為行值
.define Length LcdBuffer+35 //寫入漢字個數(shù)變量
.define k LcdBuffer+36 //定義為行內(nèi)有效位偏移量
.define x1 LcdBuffer+37 //坐標(biāo)點的列向最大值
.define y1 LcdBuffer+38 //位圖的行向最大值
.define xsize LcdBuffer+39 //位圖的列向?qū)挾?.define ysize LcdBuffer+40 //位圖的行向?qū)挾?.define Bitaddr LcdBuffer+41 //位圖的地址
.define x2 LcdBuffer+42 //矩形終止坐標(biāo)
.define y2 LcdBuffer+43 //矩形終止坐標(biāo)
.define x0 LcdBuffer+44 //矩形起始坐標(biāo)
.define y0 LcdBuffer+45 //矩形起始坐標(biāo)
.define dx LcdBuffer+46 //畫軌跡 dx = ABS(x1-x)
.define dy LcdBuffer+47 //畫軌跡 dy = ABs(y1-y)
.define stepx LcdBuffer+48 //畫軌跡x方向步進(jìn)
.define stepy LcdBuffer+49 //畫軌跡y方向步進(jìn)
.define chanxy LcdBuffer+50 //畫軌跡 xy是否與換標(biāo)志 1==與換
.define e LcdBuffer+51 //畫軌跡時的判斷標(biāo)志字
.define R1save LcdBuffer+52 //位圖初始地址寄存器
.define maskcode LcdBuffer+53 //定義為maskcode碼 (占用9個字地址)
.code
//----------------------------------------------------------//
//顯示進(jìn)度條
//R1-焦點;R2-總條數(shù)
//總共有98個點,每項的長度是98/R2;起始顯示位置是
//----------------------------------------------------------//
.public F_ShowGuageIcon
F_ShowGuageIcon:
// CMP R2,C_Menu_PageItem
// JB ?_ShowGuageIcon_End //一屏能顯示下不處理
PUSH R1,R2 TO [SP]
R1 = LCD_DRAW_NORMAL
[R_LcdStatus] = R1
R1 = 0x009A
[R_LcdStartDot] = R1
R1 = 0x68A0
[R_LcdEndDot] = R1
R1 = T_GuageIcon
R2 = 0
CALL F_Lcd_BitMap
POP R1,R2 FROM [SP]
PUSH R1,R4 TO [SP]
R3 = R1
R4 = R2
R1 = 98
CALL F_Div //R1-每項的寬度
R1 = R1 LSL 4
R1 = R1 LSL 4
[R_LcdEndDot] = R1
R2= R4
R4 = 98
MR = R4*R3
R1 = R3
CALL F_Div
R1 += 3
R1 = R1 LSL 4
R1 = R1 LSL 4
R1 += 0x9C
[R_LcdStartDot] = R1
R1 += 0x03
R2 = [R_LcdEndDot]
R1 += R2
[R_LcdEndDot] = R1 //R2-起始顯示位置
CALL F_Lcd_Block
POP R1,R4 FROM [SP]
?_ShowGuageIcon_End:
RETF
//----------------------------------------------------------//
//* 功能 : 打開顯示屏
//* 入口 : 無
//* 出口 : 無
//* 影響寄存器:r1
//* 說明 : 開機(jī)LOGO顯示函數(shù)調(diào)用,在初始化時關(guān)閉顯示屏,開始LOGO時打開顯示,以避免開始亂點顯示
//----------------------------------------------------------//
.public F_Lcd_On
F_Lcd_On:
R1 = LCD_DISPLAY_ENABLE|0x01
CALL __LcdCmdWrite //寫入顯示打開命令
RETF
//----------------------------------------------------------//
//* 功能 : 清屏并清顯示緩沖區(qū)
//* 入口 : 無
//* 出口 : 無
//* 影響寄存器:無
//----------------------------------------------------------//
.public F_Lcd_Clear
F_Lcd_Clear:
CALL F_Lcd_ClrScreen //清屏,寫全0至LCD。
CALL F_Lcd_ClrBuffer //清緩沖區(qū)
RETF
//----------------------------------------//
//F_ShowStatusIcon專用函數(shù):移位寫入一個字節(jié)
//----------------------------------------//
F_LcdDataWrite:
R2 = R2 LSR 1 //0x8000
R1 = 0
R1 = R1 ROL 1
R1 | = LCD_WR_DATA //寫入數(shù)據(jù)與寫入命令或
[P_Lcd501Ctrl] = R1 //顯示數(shù)據(jù)寫入命令
RETF
//----------------------------------------//
//|Filename : F_Set_LCD_Column_Addr
//|Function : Set the LCD column address
//|Input : Page No. R1
//|Output : None
//|Destroy : R1,R2
//----------------------------------------//
F_SetColumnAddr:
PUSH R1 TO [sp] //暫存列值
R1 = R1 LSR 4 //取列值的高4位
R1 |= LCD_COLUMN_MSB
CALL __LcdCmdWrite //寫入列值高4位
POP R1 FROM [sp] //取列值
R1 &= 0x0F //取列值低4位
R1 |= LCD_COLUMN_LSB
CALL __LcdCmdWrite //寫入列值低4位
RETF
//----------------------------------------------------------//
//* 功能 : LCD亮度調(diào)節(jié)
//* 入口 : R1-級別: 0-40(不可大于40)
//* 出口 : 無
//* 影響寄存器 : 無
//* 緩沖區(qū)使用 : 顯示緩沖區(qū)
//----------------------------------------------------------//
.public F_Lcd_Light
F_Lcd_Light:
PUSH R1,R2 to [SP]
R2 = R1 //首先保存亮度值
R1 = LCD_VBIAS_PTR //設(shè)置模式
CALL __LcdCmdWrite
R1 = R2 & 0x3F //亮度級別只有低4位有效
R1 = R1 LSL 2
R1 = 111 //add for test 2007.8.24
R1 |= LCD_VBIAS_DATA //設(shè)置亮度調(diào)節(jié)寄存器
CALL __LcdCmdWrite
CALL F_Delay10ms
POP R1,R2 FROM [SP]
RETF
//----------------------------------------------------------//
//名稱:F_Lcd_Init
//功能:LCD初始化,打開LCD,設(shè)置操作模式、初始緩存清零
//入口:無
//出口:R1 1:成功 -1:失敗
//影響寄存器:R1
//----------------------------------------------------------//
.public F_Lcd_Init
F_Lcd_Init:
PUSH R2 TO [SP]
//定義接口類型并且復(fù)位LCD
R1 =LCD_MCU
[P_Lcd501BdySel] = R1 //定義MCU類型8080
R1 = LCD_RESET //lcd reset
CALL __LcdCmdWrite
CALL F_Delay96ms
//顯示系統(tǒng)初始化
R1 = LCD_BIAS_Rat|0x02 //設(shè)置BIAS Ratio bit1,bit0: 5-12
CALL __LcdCmdWrite
R1 = LCD_SCROLL_LSB|0x0 //設(shè)置滾動行數(shù)低位bit3-bit0
CALL __LcdCmdWrite
R1 = LCD_SCROLL_MSB|0x0 //設(shè)置滾動行數(shù)高位bit2-bit0
CALL __LcdCmdWrite
R1 = LCD_PART_DISPLAY|0x0 //設(shè)置局部顯示控制bit1-bit0 //00 禁止、10方式一、11方式二
CALL __LcdCmdWrite
R1 = LCD_LINE_RATE|0x03 //設(shè)置行頻比例bit1-bit0. 00-11 :12.1-16.6 KIps
CALL __LcdCmdWrite
R1 = LCD_INVERSE_DISPLAY|0x01 //設(shè)置反顯bit0。 0:off 1:on
CALL __LcdCmdWrite
R1 = LCD_MAP_CTRL|0x06 //設(shè)置鏡像控制bit2-bit0
//bit0 控制局部顯示時,(0~2*FL)區(qū)域是否顯示。 1,顯示。
//bit1 列鏡像。重寫RAM后才會生效。 1,鏡像。
//bit2 行鏡像。 送入命令立即生效。 1,鏡像。
CALL __LcdCmdWrite
R1 = LCD_COM_END //設(shè)置掃描行邊界。雙字節(jié)命令
CALL __LcdCmdWrite
R1 = LCD_COM_END_DATA|0x7F //送入掃描行邊界值bit7-bit0( 7FH : 127 )
CALL __LcdCmdWrite
R1 = LCD_START_COM //設(shè)置顯示起始行。雙字節(jié)命令
CALL __LcdCmdWrite
R1 = LCD_START_COM_DATA|0x00 //送入顯示起始行值bit7-bit0
CALL __LcdCmdWrite
R1 = LCD_DISPLAY_END //設(shè)置顯示行邊界。雙字節(jié)命令
CALL __LcdCmdWrite
R1 = LCD_DISPLAY_END_DATA|0x69 //送入顯示行邊界數(shù)據(jù)bit7-bit0( 69H : 105 )
CALL __LcdCmdWrite
R1 = LCD_WINDOW_ENABLE|0x0 //設(shè)置窗口顯示使能bit0。 0:off 1:on
CALL __LcdCmdWrite
//電源初始化
R1 = LCD_TC_SET|0x02 //設(shè)置溫度補(bǔ)償系數(shù) bit1-bit0 //-0.05%~-0.2%
CALL __LcdCmdWrite
R1 = LCD_PUMP_CTRL|0x03 //設(shè)置升壓控制bit1-bit0 //00 EXTERNAL VLCD
//01-11 Internal 6-8VLCD
CALL __LcdCmdWrite
CALL F_Delay10ms
R1 = LCD_LOAD_CAP|0x02 //設(shè)置LCD負(fù)載電容 bit1-bit0 //0~38nF 設(shè)置01
CALL __LcdCmdWrite
CALL F_Delay10ms
R1 = LCD_VBIAS_PTR //設(shè)置偏壓分壓器,雙字節(jié)指令 // 調(diào)節(jié)亮度
CALL __LcdCmdWrite
R1 = LCD_VBIAS_DATA|0x75 //分壓器數(shù)據(jù)bit7-bit0 :0~255
CALL __LcdCmdWrite
CALL F_Delay10ms
//顯示模式初始化
R1 = LCD_COLUMN_LSB|0x0 //設(shè)置列值低位bit3-bit0
CALL __LcdCmdWrite
R1 = LCD_COLUMN_MSB|0x00 //設(shè)置列值高位bit7-bit4
CALL __LcdCmdWrite
R1 = LCD_PAGE_ADDR|0x0 //設(shè)置頁地址
CALL __LcdCmdWrite
R1 = LCD_RAM_CTRL|0x01 //設(shè)置RAM控制。
//bit2 page address auto inc direction 0/1 : +/-1
//bit1 0,列值自增,直到列值增到邊界,頁值加1
// 1,頁值自增,直到頁值增到邊界,列值加1
//bit0 0,列值或者頁值自增到邊界時,停止
// 1,列值或者頁值自增到邊界時,自動進(jìn)入下一行或列
CALL __LcdCmdWrite
R1 = LCD_GRAY_SHADE|0x01 //設(shè)置01和10間灰度差bit1-bit0。 00-11 : 24%-40%
CALL __LcdCmdWrite
R1 = LCD_UPDATE_WRITE|0x01 //設(shè)置讀修改寫bit0。 0,結(jié)束。 1,開啟
CALL __LcdCmdWrite
R1 = 0xFFFF
[R_LcdGray] = R1
R2 = 1000
?_Lcd_WaitInit:
R2 -= 1
CMP R2,C_Null
JE ?_Lcd_Init_Fail
CALL __LcdStatus
CMP R1,0x20
JNE ?_Lcd_WaitInit
R1 = C_True //返回成功
JMP ?_Lcd_Init_End
?_Lcd_Init_Fail:
R1 =C_False //返回失敗
?_Lcd_Init_End:
R1 = LCD_DISPLAY_ENABLE|0x01 //設(shè)置使能顯示bit0。 0:off 1:on
CALL __LcdCmdWrite //寫入顯示打開命令
CALL F_Delay96ms
POP R2 FROM [SP]
RETF
//===========================================================//
//.public F_Lcd_Init
//F_Lcd_Init:
// PUSH R2 TO [SP]
// R1 =LCD_MCU
// [P_Lcd501BdySel] = R1 //定義MCU類型
// R1 = LCD_RESET //lcd reset
// CALL __LcdCmdWrite
//.if (NEWLCD)
// R1 = LCD_BIAS_7 //1/9 bias
//.else
// R1 = LCD_BIAS_9 //1/9 bias
//.endif
// CALL __LcdCmdWrite
// R1 = LCD_ADC_NOR //seg 正常輸出
// CALL __LcdCmdWrite
// R1 = LCD_COM_REV //COM反轉(zhuǎn)輸出
// CALL __LcdCmdWrite
// R1 = LCD_VOL_REG | 5 //設(shè)置內(nèi)部電阻率D[0:2]
// CALL __LcdCmdWrite
// R1 = LCD_EV_SET //設(shè)置電子音量
// CALL __LcdCmdWrite
//.if (NEWLCD)
// R1 = LCD_EV_DATA | 50
// CALL __LcdCmdWrite
// R1 =LCD_BOTR_SET //設(shè)置調(diào)壓器比率
// CALL __LcdCmdWrite
// R1 =LCD_BOTR_DATA | 3
// CALL __LcdCmdWrite
//.else
// R1 = LCD_EV_DATA | 4
// CALL __LcdCmdWrite
//.endif
// R1 = LCD_POWER_CTRL | 4 //內(nèi)部電源電路全部打開
// CALL __LcdCmdWrite
// CALL F_Delay96ms
// R1 = LCD_POWER_CTRL | 6
// CALL __LcdCmdWrite
// CALL F_Delay96ms
// R1 = LCD_POWER_CTRL | 7
// CALL __LcdCmdWrite
// CALL F_Delay96ms
// R1 = LCD_DISP_OFF //關(guān)LCD
// CALL __LcdCmdWrite
// R1 = LCD_ALL_OFF //禁止全部點亮
// CALL __LcdCmdWrite
// R1 = LCD_DRIVE_MOD //設(shè)置驅(qū)動能力次高
// CALL __LcdCmdWrite
// R1 = LCD_DRIVE_DATA
// CALL __LcdCmdWrite
// R1 = LCD_STATIC_OFF //禁止閃爍
// CALL __LcdCmdWrite
// R1 = LCD_DISP_NOR //正常顯示
// CALL __LcdCmdWrite
// R1 = LCD_PAGE_BLINK //所有頁不閃爍
// CALL __LcdCmdWrite
// R1 = LCD_PAGE_DATA
// CALL __LcdCmdWrite
// R1 = LCD_LINE_SET | 32 //顯示起始線為0
// CALL __LcdCmdWrite
// R1 = LCD_PAGE_SET //頁地址為0
// CALL __LcdCmdWrite
// R1 = LCD_COLUMN_UP //線地址為0
// CALL __LcdCmdWrite
// R1 = LCD_COLUMN_LOW
// CALL __LcdCmdWrite
// R1 = LCD_RMW_OFF //取消"讀改寫"模式
// CALL __LcdCmdWrite
// R2 = 1000
//?_Lcd_WaitInit:
// R2 -= 1
// CMP R2,C_Null
// JE ?_Lcd_Init_Fail
// CALL __LcdStatus
// CMP R1,0x60
// JNE ?_Lcd_WaitInit
// R1 = C_True //返回成功
// JMP ?_Lcd_Init_End
//?_Lcd_Init_Fail:
// R1 =C_False //返回失敗
//?_Lcd_Init_End:
// R1 = LCD_DISP_ON
// CALL __LcdCmdWrite //寫入顯示打開命令
// POP R2 FROM [SP]
// RETF
//----------------------------------------------------------//
//名稱:F_LCD_TEST
//功能:做液晶測試
//入口:無
//出口:無
//影響寄存器:無
//----------------------------------------------------------//
//.public F_Lcd_Test
//F_Lcd_Test:
//// PUSH R1,R3 TO [SP]
// //LCD全部點亮
// R2 = 0 //page code
//?_Lcd_Test_FullSreen2:
// R3 = 0 //column code
// R1 = R2 | LCD_PAGE_SET
// CALL __LcdCmdWrite
// R1 = LCD_COLUMN_UP
// CALL __LcdCmdWrite
// R1 = LCD_COLUMN_LOW
// CALL __LcdCmdWrite
//?_Lcd_Test_FullSreen1:
// R1 = 0xFF //寫入顯示數(shù)據(jù)0xff,全屏點亮
// CALL __LcdDataWrite
// R3 + = 1
// CMP R3,C_LCD_COLUMN //判斷一頁是否寫完
// JB ?_Lcd_Test_FullSreen1
// R2 + = 1
// CMP R2,C_LCD_PAGE+1 //判斷是否寫完8頁
// JB ?_Lcd_Test_FullSreen2
// CALL F_Delay1s //延時1S
// CALL F_Lcd_ClrScreen //液晶擦除
////做線垂直移動測試
// R1 = 0x0001
// R2 = 0x4001
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -