人狗畜禽COMPANY LIMITED|全是肉的高H文〈男男〉|全篇肉高H秘书被C办公室四爱|全黄H全肉共妻|全黄H全肉短篇禁乱NP慕浅浅|全黄H全肉短篇N男男

技術(shù)熱線: 4007-888-234
設(shè)計(jì)開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動態(tài)

PIC單片機(jī)在ICD做lcd顯示時(shí)鐘演示程序

更新時(shí)間: 2019-03-21
閱讀量:557

;*************************************************
;* CLKTEST.ASM *
;*-----------------------------------------------*
;*-----------------------------------------------*
;*************************************************
;* ICDDEMO教學(xué)實(shí)驗(yàn)板 lcd顯示時(shí)鐘演示程序 *
;*************************************************
include

;*----
; 定義 LCD數(shù)據(jù)& 控制I/O口
LCD_DATA equ PORTB
LCD_CNTL1 equ PORTB
LCD_CNTL2 equ PORTA

; 定義 LCD控制相應(yīng)的I/O引腳
RS equ 1
E equ 5

; LCD 模塊命令
DISP_ON EQU 0x00C ; 開顯示
DISP_ON_C EQU 0x00E ; 開顯示, 開指針
DISP_ON_B EQU 0x00F ; 開顯示, 開指針,開閃爍
DISP_OFF EQU 0x008 ; 關(guān)顯示
CLR_DISP EQU 0x001 ; 清顯示的操作數(shù)
ENTRY_INC EQU 0x006 ; 操作數(shù)
ENTRY_INC_S EQU 0x007 ; 操作數(shù)
ENTRY_DEC EQU 0x004 ; 操作數(shù)
ENTRY_DEC_S EQU 0x005 ; 操作數(shù)
DD_RAM_ADDR EQU 0x080 ; 初始化第一行顯示的操作數(shù)
DD_RAM_UL EQU 0x0c0 ; 初始化第二行顯示的操作數(shù)

; 設(shè)置顯示相關(guān)寄存器
;*----

org 0
nop
goto start
org 4
goto ISR

org 10

CalTable
bcf STATUS,RP0
bcf PCLATH,0
movlw 0x66 ; 進(jìn)行校準(zhǔn)處理
subwf Temp,w ;
addwf PCL,f ; 將補(bǔ)償結(jié)果與 PCL相加
dt 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5
dt 6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb,0xb,0xc,0xc
dt 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10,0x10,0x10
dt 0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x14
dt 0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x18,0x18
dt 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1c
dt 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1f,0x20,0x20
dt 0x21,0x21,0x22,0x22,0x23,0x23,0x24,0x24,0x25,0x25
dt 0x26,0x26,0x27,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2b
dt 0x2c,0x2d,0x2e,0x2f,0x30,0x3

movwf Temp

call Bin2BCDT ; 進(jìn)行BCD碼調(diào)整
movlw 08ah ; 從第一行的第0A個位置開始
call SendCmd
movf TempH,W ; 顯示溫度
call putcLCD
movf TempL,W
call putcLCD
movlw 'C' ; 顯示“C”(表示攝氏度)
call putcLCD
movlw 20h
movwf BKM
return
;************************************************
;* Bin2BCDT - 將 Temp 寄存器內(nèi)的二進(jìn)制數(shù)轉(zhuǎn) *
;* 換為相應(yīng)的 ASCII 碼并存為 TempH:TempL 的形式 *
;************************************************
Bin2BCDT
bcf STATUS,RP0
clrf TempH ; Initialize variables
movf Temp,W
movwf TempL
Ttenth ; Subtract 10 from low variable
movlw .10 ; until result is < 0. On each
subwf TempL,W ; subtraction, increment the
btfss STATUS,C ; temperature high byte.
goto Over0
movwf TempL
incf TempH,F
goto Ttenth
Over0
movlw 0x30 ; Make decimal ASCII by adding
addwf TempH,F ; '0' to high and low byte
addwf TempL,F
return
;*************************************************
;* DisplayTime - 將顯示指針移至第一行,調(diào)用Bin2BCD*
;* 子程序?qū)ecs 和 Mins寄存器內(nèi)的數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的*
;* ASCII 碼, 然后送 LCD顯示. *
;*************************************************
DisplayTime
bcf STATUS,RP0
call Bin2BCD ; 調(diào)用二進(jìn)制與bcd碼轉(zhuǎn)換子程序
movf HourH,W ; 顯示小時(shí)高位
call putcLCD ;
movf HourL,W ; 顯示小時(shí)低位
call putcLCD ;
movlw ':'
call putcLCD ; 顯示 ':'
movf MinsH,W ; 顯示分鐘高位
call putcLCD ;
movf MinsL,W ; 顯示分鐘低位
call putcLCD ;
movlw ':' ; 顯示 ':'
call putcLCD
movf SecsH,W ; 顯示秒鐘高位
call putcLCD ;
movf SecsL,W ; 顯示秒鐘低位
call putcLCD ;
return
;************************************************
;* Bin2BCD - 將 Secs & Mins 寄存器內(nèi)的二進(jìn)制數(shù)轉(zhuǎn)*
;* 換為相應(yīng)的 ASCII 碼并存為 SecsH:SecsL 及 *
;* MinsH:MinsL,HourH:HourL的形式. *
;************************************************
Bin2BCD
bcf STATUS,RP0
clrf HourH ; 初始化變量
movf Hour,W ; 轉(zhuǎn)換&ldquo;時(shí)&rdquo;
movwf HourL
Hourth ; Loop to subtract 10
movlw .10 ; from low byte and
subwf HourL,W ; increment high byte
btfss STATUS,C ; while low byte is > 0
goto Next
movwf HourL
incf HourH,F
goto Hourth
Next
clrf MinsH ; 初始化變量
movf Mins,W ; 轉(zhuǎn)換&ldquo;分&rdquo;
movwf MinsL
Mtenth ; Loop to subtract 10
movlw .10 ; from low byte and
subwf MinsL,W ; increment high byte
btfss STATUS,C ; while low byte is > 0
goto Next1
movwf MinsL
incf MinsH,F
goto Mtenth
Next1
clrf SecsH ; 初始化變量
movf Secs,W ; 轉(zhuǎn)換&ldquo;秒&rdquo;
movwf SecsL
Stenth ; Loop to subtract 10
movlw .10 ; from low byte and
subwf SecsL,W ; increment high byte
btfss STATUS,C ; while low byte is > 0
goto Over
movwf SecsL
incf SecsH,F
goto Stenth
Over
movlw 0x30 ;
addwf HourH,F ;
addwf HourL,F ; Add 0x30 ('0') to all
addwf MinsH,F ; variables to convert
addwf MinsL,F ; a number 0 - 9 to an
addwf SecsH,F ; ASCII equivalent
addwf SecsL,F ; '0' to '9'
return
;*====
DispTime
bcf STATUS,RP0
movlw 0c7h
call SendCmd
call Bin2BCa ; 調(diào)用二進(jìn)制與bcd碼轉(zhuǎn)換子程序
movf HourH1,W ; 顯示小時(shí)高位
call putcLCD ;
movf HourL1,W ; 顯示小時(shí)低位
call putcLCD ;
movlw ':' ; 顯示 ':'
call putcLCD
movf MinsH1,W ; 顯示分鐘高位
call putcLCD ;
movf MinsL1,W ; 顯示分鐘低位
call putcLCD ;
return
;*----
Bin2BCa
bcf STATUS,RP0
clrf HourH1 ; 初始化變量
movf Hour1,W ; 轉(zhuǎn)換&ldquo;時(shí)&rdquo;
movwf HourL1
Hourth1 ; Loop to subtract 10
movlw .10 ; from low byte and
subwf HourL1,W ; increment high byte
btfss STATUS,C ; while low byte is > 0
goto Nexta
movwf HourL1
incf HourH1,F
goto Hourth1
Nexta
clrf MinsH1 ; 初始化變量
movf Mins1,W ; 轉(zhuǎn)換&ldquo;分&rdquo;
movwf MinsL1
Mtenth1 ; Loop to subtract 10
movlw .10 ; from low byte and
subwf MinsL1,W ; increment high byte
btfss STATUS,C ; while low byte is > 0
goto Over1
movwf MinsL1
incf MinsH1,F
goto Mtenth1
Over1
movlw 0x30 ;
addwf HourH1,F ;
addwf HourL1,F ; Add 0x30 ('0') to all
addwf MinsH1,F ; variables to convert
addwf MinsL1,F ; a number 0 - 9 to an
return ; ASCII equivalent
;*******************************************************************
;* LCD 模塊子程序 *
;*******************************************************************
;InitLCD&mdash;&mdash;初始化LCD模塊 *
;*******************************************************************
InitLCD
bcf STATUS,RP0 ; Bank 0
bcf STATUS,RP1
clrf LCD_DATA ; 清 LCD 數(shù)據(jù) & 控制位
bsf STATUS,RP0 ; Bank 1
movlw 0xc1 ; 設(shè)置RB1~RB5為輸出
movwf LCD_DATA
bcf TRISA,5

bcf STATUS,RP0 ;
movlw 0x00 ;
movwf LCD_DATA
bsf LCD_CNTL2, E
bcf LCD_CNTL2, E

movlw 0x08 ;
movwf LCD_DATA
bsf LCD_CNTL2, E
bcf LCD_CNTL2, E
call LongDelay
call LongDelay

movlw b'00101000'
call SendCmd
movlw DISP_ON ; 開顯示
call SendCmd
movlw ENTRY_INC ; 設(shè)置指針移動方式
call SendCmd
movlw DD_RAM_ADDR ; 設(shè)置起始地址
call SendCmd

InitLCDEnd ;
bcf STATUS,RP0 ;
movlw CLR_DISP ;
call SendCmd
return

;*******************************************************************
;*putcLCD&mdash;&mdash; 將字符數(shù)據(jù)送入 LCD *
;* 本程序?qū)⒆址麛?shù)據(jù)分成了高半字節(jié)和低半字節(jié)分別輸入 *
;* 先送入的是高半字節(jié) *
;*******************************************************************
putcLCD
bcf STATUS,RP0
movwf Byte ; 存 WREG 到 Byte 寄存器
swapf Byte,W ; 寫入高半字節(jié)
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bsf LCD_CNTL1, RS ; 設(shè)置為送數(shù)據(jù)模式
bsf LCD_CNTL2, E ; 發(fā)送數(shù)據(jù)信號
bcf LCD_CNTL2, E

movf Byte,W ; 接著送低半字節(jié)
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bsf LCD_CNTL1, RS ; 設(shè)置為送數(shù)據(jù)模式
bsf LCD_CNTL2, E ; 發(fā)送數(shù)據(jù)信號
bcf LCD_CNTL2, E
call Delay
return

;*******************************************************************
;* SendCmd - 送命令到 LCD *
;* 本程序?qū)⒚顢?shù)據(jù)分成了高半字節(jié)和低半字節(jié)分別輸入 *
;* 先送入的是高半字節(jié) *
;*******************************************************************
SendCmd
bcf STATUS,RP0
movwf Byte ; 存 WREG 到 Byte 寄存器
swapf Byte,W ; 送入命令的高字節(jié)
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bcf LCD_CNTL1,RS ; 設(shè)置為送命令模式
bsf LCD_CNTL2,E ; 發(fā)送數(shù)據(jù)信號
bcf LCD_CNTL2,E
movf Byte,W ; 接著送命令的低字節(jié)

movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bcf LCD_CNTL1,RS ; 設(shè)置為送命令模式
bsf LCD_CNTL2,E ; 發(fā)送數(shù)據(jù)信號
bcf LCD_CNTL2,E
call Delay
return
;*******************************************************************
;* Delay - 延時(shí)子程序 *
;*******************************************************************
Delay ; call指令占用2個指令周期
bcf STATUS,RP0
clrf Count ; 清 Count占用1個指令周期
Dloop
decfsz Count,f ; 這兩行指令將延時(shí)
goto Dloop ; (256 * 3) -1 個指令周期
return ; return占用2個指令周期

;*******************************************************************
;* LongDelay - 長延時(shí)子程序 *
;*******************************************************************
LongDelay
bcf STATUS,RP0
clrf Count
clrf Count1
movlw 0x03
movwf Count2
LDloop
decfsz Count,f
goto LDloop
decfsz Count1,f
goto LDloop
decfsz Count2,f
goto LDloop
return
;*------
END


萨嘎县| 綦江县| 苗栗市| 龙口市| 申扎县| 饶河县| 夏邑县| 定日县| 澜沧| 太湖县| 湛江市| 桃江县| 镇远县| 若尔盖县| 宝鸡市| 崇礼县| 京山县| 甘肃省| 十堰市| 沂南县| 酒泉市| 通江县| 肇庆市| 乌拉特前旗| 繁峙县| 积石山| 米易县| 舞阳县| 乡宁县| 通江县| 轮台县| 沙坪坝区| 科尔| 微博| 光山县| 凉山| 潜山县| 施秉县| 镇宁| 淮北市| 夹江县|