Zclub討論區 Z板

 找回密码
 註冊
搜索
查看: 4076|回复: 0

[教學] 自製LCD 16x2文字型液晶顯示轉速表

[复制链接]
发表于 2013-12-3 08:58:49 | 显示全部楼层 |阅读模式
昨天把LCD 16x2文字型液晶顯示的電路圖畫完了所以趕快分享,讓想試看看的車友試試,基本上我比較建議用LCD液晶,因為太陽照下來也會看得比LED數字清楚,LCD 16x2就是下面那個圖片有16隻腳,不要買到串列式的,而且最好買背光的,晚上才看得到,GOOGLE一下可發現多種顏色,一樣想做卻有任何問題的請直接PM

勿做商業用途
lcd162b-yhy.jpg


電路圖
R3.jpg

8051組合語言程式,程式有點不對齊自己喬一下,燒錄問題一樣自己處理不幫忙,謝謝

;轉速表(60s/幾s動一次=幾轉),兩個波形顯示一次,但只取一個計算
;訊號線對的話不分單雙缸或四缸都不用修改就可以用
;最高轉速只顯示240秒
RS      REG     P1.5             ;RS=P1.5
RW      REG     P1.6             ;RW=P1.6
E       REG     P1.7             ;E =P1.7
        ORG        00H
        JMP        Init_LCG
        ORG     0BH
        JMP     TIMERINT
Init_LCG:
        MOV     P0,#00H
        MOV     P2,#00000001B        ;設輸入腳
        MOV     20H,#0
        MOV     21H,#0
        MOV     30H,#0
        MOV     31H,#0
        MOV     2CH,#0                ;顯示速轉
        MOV     2DH,#0                ;顯示最高速轉
        MOV        36H,#0                ;舊的轉時十位
        MOV        37H,#0                ;舊的轉時百位
        MOV        38H,#0                ;舊的轉時千位
        MOV        39H,#0                ;舊的轉速萬位
        MOV        3AH,#0                ;轉速比較
        MOV        3BH,#0                ;顯示暫存
        MOV        3CH,#0                ;轉速餘數暫存
        MOV        3DH,#0                ;0.5秒
        MOV        3EH,#0                ;秒
        MOV        3FH,#0                ;分
        MOV        40H,#0                ;時
        MOV        41H,#1                ;1表示秒要顯示時間
        MOV        42H,#1                ;1表示分要顯示時間
        MOV        43H,#1                ;1表示時要顯示時間
        MOV        44H,#255        ;240秒最高轉速歸0
        MOV        SP,#50H                ;50H開始堆疊
        MOV        TMOD,#00000001B
        MOV        TH0,#>(65536-50000)
        MOV        TL0,#<(65536-50000)
        MOV        IE,#10000010B
DELAY1:        MOV        R7,#5                ;延遲0.5秒
DEL11:        MOV        R6,#249
DEL12:        MOV        R5,#200
DEL13:        DJNZ        R5,DEL13
        DJNZ        R6,DEL12
        DJNZ        R7,DEL11
        MOV        A,#38H
        CALL        LCG_CMD                ;設定8位元資料傳送,顯示2行,字形是5x7
        MOV        A,#0CH
        CALL        LCG_CMD                ;游標所在處不閃爍也不顯示游標
        MOV        A,#06H
        CALL        LCG_CMD                ;寫入資料後游標自動跳到下一個位置
        MOV        A,#01H
        CALL        LCG_CMD                ;清除顯示RAM
        MOV        A,#85H
        CALL        LCG_CMD                ;第1行第5個位置
        MOV        A,#30H
        CALL        LCG_DATA        ;顯示0
        MOV        A,#87H                ;第1行第7個位置
        CALL        LCG_CMD
        MOV        A,#72H
        CALL        LCG_DATA        ;顯示r
        MOV        A,#70H
        CALL        LCG_DATA        ;顯示p
        MOV        A,#6DH
        CALL        LCG_DATA        ;顯示m
        MOV        A,#2FH
        CALL        LCG_DATA        ;顯示/
        MOV        A,#6DH
        CALL        LCG_DATA        ;顯示m
        MOV        A,#69H
        CALL        LCG_DATA        ;顯示i
        MOV        A,#6EH
        CALL        LCG_DATA        ;顯示n
        MOV        A,#C5H
        CALL        LCG_CMD                ;第2行第5個位置
        MOV        A,#30H
        CALL        LCG_DATA        ;顯示0
        MOV        A,#CAH
        CALL        LCG_CMD                ;第1行第10個位置
        MOV        A,#3AH
        CALL        LCG_DATA        ;顯示:
        MOV        A,#CDH
        CALL        LCG_CMD                ;第1行第13個位置
        MOV        A,#3AH
        CALL        LCG_DATA        ;顯示:
        SETB        TR0
START0:
        MOV        A,30H
        CLR        C
        ADD        A,#1                ;11us=+1次
        MOV        30H,A
        MOV        A,31H
        ADDC        A,#0
        MOV        31H,A
        CJNE        A,#016H,START1
        MOV        29H,#0
        JMP        SSU0
START1:
        JB        P2.0,START0        ;等待脈波=+v
START2:
        MOV        A,30H
        CLR        C
        ADD        A,#1                ;11us=+1次
        MOV        30H,A
        MOV        A,31H
        ADDC        A,#0
        MOV        31H,A
        CJNE        A,#016H,START3
        MOV        29H,#0
        JMP        SSU0
START3:
        JNB        P2.0,START2        ;等待脈波=-v
WAIT:
        MOV        A,20H
        CLR        C
        ADD        A,#1                ;11us=+1次
        MOV        20H,A
        MOV        A,21H
        ADDC        A,#0
        MOV        21H,A
        CJNE        A,#016H,WAIT1
        MOV        29H,#0                ;<1000轉
        JMP        SSU0
WAIT1:
        JB        P2.0,WAIT        ;等待脈波=+v
WAIT2:
        MOV        A,20H
        CLR        C
        ADD        A,#1                ;11us=+1次
        MOV        20H,A
        MOV        A,21H
        ADDC        A,#0
        MOV        21H,A
        CJNE        A,#016H,WAIT3
        MOV        29H,#0                ;<1000轉
        JMP        SSU0
WAIT3:
        JNB     P2.0,WAIT2        ;等待脈波=-v
        MOV     22H,#0
        MOV     23H,#023H        ;60s/11us/50轉+1
        MOV     24H,#0AAH
        MOV     25H,#01H        
        MOV     26H,#0                ;餘數
        MOV     27H,#0               
        MOV     28H,#0
        MOV        29H,#0                ;商=幾十轉
        MOV     2AH,#0
        MOV        2BH,#0
        MOV        R7,#18H
        CLR        A
LOOP:
        MOV        R0,#23H
        XCH        A,@R0
        RLC        A
        XCH        A,@R0
        INC        R0
        XCH        A,@R0
        RLC        A
        XCH        A,@R0
        INC        R0
        XCH        A,@R0
        RLC        A
        XCH        A,@R0
        MOV        R0,#26H
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        INC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        INC        R0
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        MOV        R3,26H
        MOV        R4,27H
        MOV        R5,28H
        MOV        R2,#03H
        CLR        C
        MOV        R1,#20H
        MOV        R0,#26H
SUB3:
        MOV        A,@R0
        SUBB        A,@R1
        MOV        @R0,A
        INC        R0
        INC        R1
        DJNZ        R2,SUB3
        JNC        SKIP
        MOV        26H,R3
        MOV        27H,R4
        MOV        28H,R5
SKIP:
        CPL        C
        MOV        R1,#29H
        XCH        A,@R1
        RLC        A
        XCH        A,@R1
        INC        R1
        XCH        A,@R1
        RLC        A
        XCH        A,@R1
        INC        R1
        XCH        A,@R1
        RLC        A
        XCH        A,@R1
        DJNZ        R7,LOOP
SSU0:
        MOV        A,29H
        INC        3AH
        CJNE        A,#29,RPM00        ;1400轉以下直接顯示
RPM00:
        JC        RPM05
        MOV        A,29H
        CLR        C
        SUBB        A,2CH
        JNZ        RPM01
        JMP        RPME                ;新.顯示相同
RPM01:
        JNC        RPM002
        CPL        A
        INC        A
        CJNE        A,#4,RPM001
RPM001:
        JNC        RPM04                ;>=250 加快顯示
        INC        3AH
        JMP        RPM02
RPM002:
        CJNE        A,#5,RPM003        ;>=250 加快顯示
RPM003:
        JNC        RPM04
RPM02:
        MOV        A,3AH
        CJNE        A,#6,RPM03        ;6次顯示一次
RPM03:
        JNC        RPM04
        JMP        RPME
RPM04:
        MOV        3AH,#0
RPM05:
        MOV        A,29H
        CLR        C
        SUBB        A,2CH
        JNZ        RPM1
        JMP        RPME                ;新.顯示相同
RPM1:
        JNC        RPM2
        CPL        A
        INC        A
        DEC        2CH
        CJNE        A,#19,RPM11
RPM11:
        JC        RPM3
        DEC        2CH
        DEC        2CH                ;差>=1000轉減150轉
        CJNE        A,#29,RPM12
RPM12:
        JC        RPM3
        DEC        2CH
        DEC        2CH
        DEC        2CH
        DEC        2CH                ;差>=1500轉減350轉
        JMP        RPM3
RPM2:
        INC        2CH
        CJNE        A,#20,RPM21
RPM21:
        JC        RPM3
        INC        2CH
        INC        2CH                ;差>=1000轉加150轉
        CJNE        A,#30,RPM22
RPM22:
        JC        RPM3
        INC        2CH
        INC        2CH
        INC        2CH
        INC        2CH                ;差>=1500轉加350轉
RPM3:
        MOV        A,2CH
        MOV        B,#2
        DIV        AB
        MOV        3CH,B
        MOV        R4,A
        CALL        XXX
        MOV        A,R5
        CJNE        A,39H,RPM31
        JMP        RPM4
RPM31:
        MOV        39H,A
        CJNE        A,#10,RPM32
        MOV        3BH,#20H        ;清除萬位
        JMP        RPM33
RPM32:
        ADD        A,#30H                ;數字=萬位
        MOV        3BH,A                        
RPM33:
        MOV        A,#81H                ;萬位顯示 第1行第1個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示萬位
RPM4:
        MOV        A,R6
        CJNE        A,38H,RPM41
        JMP        RPM5
RPM41:
        MOV        38H,A
        CJNE        A,#10,RPM42
        MOV        3BH,#20H        ;清除千位
        JMP        RPM43
RPM42:
        ADD        A,#30H                ;數字=千位
        MOV        3BH,A
RPM43:
        MOV        A,#82H                ;千位顯示 第1行第2個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示千位        
RPM5:
        MOV        A,R4
        JNZ        RPM50
        MOV        A,#10
        JMP        RPM51
RPM50:
        MOV        A,R7
        CJNE        A,37H,RPM51
        JMP        RPM6
RPM51:
        MOV        37H,A
        CJNE        A,#10,RPM52
        MOV        3BH,#20H        ;清除百位
        JMP        RPM53
RPM52:
        ADD        A,#30H                ;數字=百位
        MOV        3BH,A               
RPM53:
        MOV        A,#83H                ;百位顯示 第1行第3個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示百位        
RPM6:
        MOV        A,3CH
        MOV        B,#5
        MUL        AB
        CJNE        A,36H,RPM61
        JMP        RPME
RPM61:
        MOV        36H,A
        MOV        A,2CH
        JNZ        RPM62
        MOV        3BH,#20H        ;清除十位
        MOV        36H,#10
        JMP        RPM63
RPM62:
        MOV        A,36H                ;數字=十位
        ADD        A,#30H               
        MOV        3BH,A
RPM63:
        MOV        A,#84H                ;十位顯示 第1行第4個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示十位
RPME:
        MOV        A,2CH
        CJNE        A,2DH,HIGH0
HIGH0:
        JNC        HIGH2
        MOV        A,44H
        CJNE        A,#15,HIGH1
        JMP        HIGH2
HIGH1:
        JMP        HIGHE
HIGH2:
        MOV        A,2CH
        MOV        2DH,A
        MOV        B,#2
        DIV        AB
        MOV        3CH,B
        MOV        R4,A
        CALL        XXX
        MOV        A,R5
        CJNE        A,#10,HIGH3
        MOV        3BH,#20H        ;清除萬位
        JMP        HIGH4
HIGH3:
        ADD        A,#30H                ;數字=萬位
        MOV        3BH,A                        
HIGH4:
        MOV        A,#C1H                ;最高轉萬位顯示 第2行第1個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示萬位
        MOV        A,R6
        CJNE        A,#10,HIGH5
        MOV        3BH,#20H        ;清除千位
        JMP        HIGH6
HIGH5:
        ADD        A,#30H                ;數字=千位
        MOV        3BH,A
HIGH6:
        MOV        A,#C2H                ;最高轉千位顯示 第2行第2個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示千位        
        MOV        A,R4
        JNZ        HIGH7
        MOV        3BH,#20H        ;清除百位
        JMP        HIGH10
HIGH7:
        MOV        A,R7
        ADD        A,#30H                ;數字=百位
        MOV        3BH,A               
HIGH10:
        MOV        A,#C3H                ;最高轉百位顯示 第2行第3個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示百位        
        MOV        A,3CH
        MOV        B,#5
        MUL        AB
        MOV        3BH,A
        MOV        A,2CH
        JNZ        HIGH11
        MOV        3BH,#20H        ;清除十位
        JMP        HIGH12
HIGH11:
        MOV        A,3BH                ;數字=十位
        ADD        A,#30H               
        MOV        3BH,A
HIGH12:
        MOV        A,#C4H                ;最高轉十位顯示 第2行第4個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示十位
        MOV        44H,#255
HIGHE:
        MOV        A,43H
        JNZ        TIME1
        JMP        TIME4
TIME1:
        MOV        43H,#0
        MOV        A,40H
        MOV        B,#10
        DIV        AB
        ADD        A,#30H
        MOV        3BH,A
        MOV        A,#C8H                ;時十位顯示 第2行第8個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示時十位
        MOV        A,B
        ADD        A,#30H
        MOV        3BH,A
        MOV        A,#C9H                ;時個位顯示 第2行第9個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示時個位
TIME2:
        MOV        42H,#0
        MOV        A,3FH
        MOV        B,#10
        DIV        AB
        ADD        A,#30H
        MOV        3BH,A
        MOV        A,#CBH                ;分十位顯示 第2行第11個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示分十位
        MOV        A,B
        ADD        A,#30H
        MOV        3BH,A
        MOV        A,#CCH                ;分個位顯示 第2行第12個位置
        CALL        LCG_CMD
        MOV        A,3BH
        CALL        LCG_DATA        ;顯示分個位
TIME3:
        MOV        41H,#0
        MOV        A,#CEH                ;秒十位顯示 第2行第14個位置
        CALL        LCG_CMD
        MOV        A,3EH
        MOV        B,#10
        DIV        AB
        ADD        A,#30H
        CALL        LCG_DATA        ;顯示秒十位
        MOV        A,#CFH                ;秒十個顯示 第2行第15個位置
        CALL        LCG_CMD
        MOV        A,B
        ADD        A,#30H
        CALL        LCG_DATA        ;顯示秒個位
        JMP        TIME0
TIME4:
        MOV        A,42H
        JNZ        TIME2
        MOV        A,41H
        JNZ        TIME3
TIME0:
        MOV     20H,#0
        MOV     21H,#0
        MOV     30H,#0
        MOV     31H,#0
        JMP        START0
;時間50000=50MS
TIMERINT:
        MOV        TH0,#>(65536-50000)
        MOV        TL0,#<(65536-50000)
        PUSH        A
        PUSH        B
        PUSH        PSW
        INC        3DH
        MOV        A,3DH
        CJNE        A,#20,TIMEE
        MOV        3DH,#0
        INC        3EH
        INC        41H
        DEC        44H
        MOV        A,44H
        CJNE        A,#14,TIMEE0
        INC        44H
        MOV        2DH,#0
TIMEE0:
        MOV        A,3EH
        CJNE        A,#60,TIMEE
        MOV        3EH,#0
        INC        3FH
        INC        42H
        MOV        A,3FH
        CJNE        A,#60,TIMEE
        MOV        3FH,#0
        INC        40H
        INC        43H
TIMEE:
        POP        PSW
        POP        B
        POP        A
        RETI
;抓取個十百位數字
XXX:
        MOV        B,#10
        DIV        AB
        MOV        R7,B                ;R7=個位
        CJNE        A,#10,XXX1
XXX1:
        JNC        XXX3
        MOV        R5,#10                ;R5=百位清除
        JNZ        XXX2                ;0~9
        MOV        R6,#10                ;R6=十位清除
        JMP        XXX4                                       
XXX2:                                ;10~99
        MOV        R6,A                ;R6=十位
        JMP        XXX4                                
XXX3:                                ;大於100
        MOV        B,#10
        DIV        AB
        MOV        R6,B                ;R6=十位
        MOV        R5,A                ;R5=百位
XXX4:
        RET
;寫入指令碼副程式
LCG_CMD:
        CLR     RW              ;RW=0,寫入
        CLR     RS              ;RS=0,指令
        SETB        E               ;E= 1,致能LCD
        MOV     P3,A            ;P3=A,送出命令值 (為一負緣動作)
        CLR     E               ;E= 0,除能LCD
        CALL    CHKBUSY         ;呼叫LCD忙碌檢查等待
        RET
;寫入圖形資料?{式
LCG_DATA:
        CLR     RW               ;RW=0,寫入
        SETB    RS                ;RS=1,資料
        SETB    E                 ;E= 1,致能LCD
        MOV     P3,A             ;P3=A,送出顯示值 (為一負緣動作)
        CLR     E                 ;E= 0,除能LCD
        CALL    CHKBUSY         ;呼叫LCD忙碌檢查等待
        RET
;忙碌狀態檢查副程式
CHKBUSY:
        MOV     P3,#0FFH              ;P3=0FFH,P3設定為輸入埠
        SETB    RW                    ;RW=1,讀取
        CLR     RS                     ;RS=0,指令
        SETB    E                      ;E= 1,致能LCD
        MOV     A,P3                   ;A=P3,獲得狀態??(為一高態動作)
        CLR     E                      ;E= 0,除能LCD
        ANL     A,#80H                ;A=A&80H,保留BF忙碌旗標
        JNZ     CHKBUSY                ;若DB7<>#0則跳至WAIT1
        RET
        END

LCD 16x2文字型液晶顯示大概說明,第一行顯示目前轉速,第二行顯示最高轉速和通電後騎乘多少時間(方便看熱車多久),最高轉速在240秒後會歸0重新抓取和顯示
12750 rpm/min
12750   00:00:00

轉速訊號線接線圖,我FZR是接W/R 白/紅線(W/L和W/Y應該也可以),其他車種請自己找,謝謝
R1.jpg

1.三相交流發電機
2.整流/調整器
8.C.D.I元件
9和10.點火線圈

功能說明
  • 化油器車應該都可以,噴射車不知道,這版本有在GOING 50上實測才交給機車行認識的學徒,是2010年設計的
  • 顯示是以50轉為單位加減,不是抓取多少就顯示多少,新舊差太多才會以150轉為單位加減,最高轉速可顯示12750 rpm/min,超過會顯示錯誤,除了少數像FZR 250四缸可達15000轉以上,其他大部份的車都不會超過,但是改一下程式達到2萬轉以上都沒問題
  • 改變顯示時間以反應時間而定,不過我有加入延遲,讓看起來不會改變很快,避免不容易看清楚,不習慣的可以自己修改程式
  • 反應時間最慢0.15秒(400轉),0.0047秒(12750轉)

無實際影片,要看的話請參加元旦南橫一日遊,我車上有裝另一種LCD繪圖型的如下圖
後續還有時速表會分享,再來是檔位表(原車無顯示檔位功能的車可裝)分享

fzr rider.mp4_snapshot_01.32_[2013.12.02_21.27.31].jpg

评分

9

查看全部评分

回复

使用道具 举报

Yahoo
您需要登录后才可以回帖 登录 | 註冊

本版积分规则

手機版|Archiver|Z板 Sitetag 訪客統計

GMT+8, 2024-12-23 15:18 , Processed in 0.082026 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表