欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24239|回復: 2
打印 上一主題 下一主題
收起左側

LED點陣顯示屏工作原理及驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:105323 發表于 2016-3-4 14:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LED顯示屏驅動程序
幾年前本人得到一塊雙色LED顯示屏,因為沒有控制器,所以對顯示屏的工作原理進行了一番研究,利用手頭上的元件,搭了一塊電路板,編寫了一段程序就放置一邊了,這幾天有時間,把原來的89C51匯編程序改了一下,改為AT89C2051和STC11F04E單片機能用的程序,放到博客上希望有興趣的同行可以參考一下。下面是顯示效果圖:
下面是接口電路板圖:

下面是電路原理圖:


工作原理:這塊顯示屏是分為上下共32行LED點陣,水平有4塊16*16點陣,所以能顯示16*16點陣8個漢字。工作原理是用74ls138做為行掃描,列用74ls595控制,當138掃描到某一行時,595決定哪一列該亮,就這樣快速掃描,就形成了圖像了。參見下圖:

以單色單元板為例走線方式如下圖:


各信號走向如下:
l        JP1排針16腳信號A->74HC245的第2腳(信號放大)->74HC245的第18腳->74HC138的第1腳->JP2排針16腳
l        JP1排針15腳信號B->74HC245的第3腳(信號放大)->74HC245的第17腳->74HC138的第2腳->JP2排針15腳
l        JP1排針1腳信號OE->74HC245的第4腳(信號放大)->74HC245的第16腳->74HC04D的第1腳->74HC04D的2腳->①74HC138的第5腳->②74HC04D的3腳->74HC04D的4腳->JP2排針1腳
l        JP1排針11腳信號R->74HC245的第9腳(信號放大)->74HC245的第11腳->最左上角74HC595-1的第14腳->74HC595-1的9腳->74HC595-2的14腳->74HC595-2的9腳->最右下角74HC595-16的14腳->74HC595-16的9腳->JP2排針11腳

我現在用的是雙色板,JP1各端口含義如下:

ABCD是顯示屏電路板上的74LS138地址譯碼端, 單片機寄存器R3控制行掃描,當R3從00000000到00010000增加時ABCD的變化給138譯碼,當R3=0FH時正好掃描16行,當進位到10時掃描結束,OE是138的片選使能端,低電平有效。G1,G2是給595送綠色數據,R1R2是給595送紅色數據的,ST是595數據鎖存脈沖,SC是595時鐘輸入端。所有11個接線端都要通過74HC244總線驅動器接入。正常工作時因為按行掃描,首先掃描第一行和第17行同時進行,依次掃描到第16行和32行結束,所以送數據時,要把“黑龍江省哈爾濱市”8個漢字分成上面4個和下面4個,首先取“黑”字的16*16點陣數據的第一行第一個字節(一個漢字32個字節)存入單片機寄存器R6中,再取“哈” 字的16*16點陣數據的第一行第一個字節存入單片機寄存器R4中,調用送字節子程序送出到595中,接下來再取“黑”字的16*16點陣數據的第一行第二個字節存入單片機寄存器R6中,接著取“哈” 字的16*16點陣數據的第一行第二個字節存入單片機寄存器R4中,調用送字節子程序送出到595中,如此共取8次,用R2控制,這樣就掃描完了第一行和第17行,用R3控制ABCD共掃描16行(因為一次掃描2行)就完成一屏的數據顯示。為了配合這種掃描方式,8個漢字的點陣數據要進行重新排列才行,這在后續的程序中再說。
下面是51單片機匯編語言代碼,主要由顯示程序和送字節數據程序2段程序組成:
    ORG 0000H
       AJMPKS        ;顯示綠色黑龍江省哈爾濱市,11.0592MHZSTC11F04E單片機
       ORG 0003H
       RETI
       ORG 000BH
; LJMP 0C00H
    RETI
       ORG 001BH
       RETI
       ORG 0023H
    ;AJMPS             ;接收數據轉S
       A1   EQU P1.0   ;P1.0=A         2
       B1   EQU P1.1   ;P1.1=B         4
       C1   EQU P1.2   ;P1.2=C         6
       D1   EQU P1.3  ;P1.3=D         8
       G1   EQU 0B3H    ;數據輸出G1=B4
       G2   EQU 0B7H   ;數據輸出 G2=B5
       STB  EQU 0B2H    ;595數據鎖存脈沖=L 12
       SCK EQU 0B4H    ;595時鐘輸入=S   11
       R11  EQU 0B0H   ;改為81,R22改為80,上下顯示顛倒
       R22  EQU  0B1H
       EN   EQU 0B5H    ;138片選,行輸出使NENG
       DELBUF EQU 7FH
       WDT_CONTR   EQU 0C1H
       AUX EQU   0A2H            ;

  KS:   MOVSP,#65H    ;設堆棧指針
        MOV SCon,#50h; 方式1,REN=1.SM0SM1,SM2,REN,TB8,RB8,TI,RI
        MOV TMOD,#21H;波特率發生器T1工作在模式2
        MOV TH1,#0FDH;預置初值(按照波特率9600BPS預置初值) 11.0592=9600=FD
        MOV TL1,#0FDH;
        MOV  TH0,#88H     ;8800=12t,7000=stc1t
         MOV  TL0, #00H
        ORL IE, #92H  ;EA=1,ES=1;ET0=1
        SETBPS       ;串口中斷優先
        SETBTR1      ;啟動定時器1
        MOV WDT_CONTR ,#27H;;;;;;看門狗設置使能

Q:        MOV A,#0;FFH
            MOVR2,#64D    ;清數據區
            MOV R0,#20H
QING:  MOV@R0,A      ;清數據區
          INC R0
           DJNZ R2,QING

Q1:     SETB G1
         SETBG2         ;G1,G2送數顯示綠色
         SETB R11
         SETBR22        ;R11R22送數顯示紅色
T1:     MOVR3,#00H     ;行掃描 R3控制行數從0000000000010000,ABCD的變化給138譯碼0F掃描16行,當10時掃描結束
         MOV   DPTR , #0500H    ;取數字
TZ:     MOV  R2,  #8   ;送一行8個漢字
         SETBEN         ;138片選,行輸出使能
  ZJ1:    CLRA
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(黑)
          CPL A              ;再跳過8個字節(4個漢字)取第二行1個字節數據(哈)
          MOV R6,A
          INC DPTR
          CLR A
          MOVC  A, @A+DPTR
          CPL A
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          INC DPTR
          DJNZ R2,ZJ1
          SETB   STB
          CALL SDELAY
          CLR    STB

          MOVA,R3                 ;138地址ABCD
          MOVP1,A                 ;P2.0-P2.3=ABCD
          INC R3
          MOV A,R3
          XRLA,#10H           ;00-08是前8行,08-10H是后8;
          JNZTZ              ;送前16
          MOV WDT_CONTR ,#17H;喂狗CLREN
          AJMP T1

BIN:   MOV  R5, #08H  ;G1G2,或R11R22中寫一個字節數據
BIN1:  RLC  A
      ; MOV  R11, C  ;寫上半屏紅色
       MOV  G1,C    ;寫上半屏紅色
       MOV R4,A
       MOV A,R6
       RLC A
      ; MOV R22,C   ;下半屏紅色
       MOV G2,C    ;下半屏綠色
       MOV R6,A
       MOV A,R4
       SETB  SCK
       CALL SDELAY
       CLR SCK
       DJNZ  R5,  BIN1
       RET

SDELAY:      MOV      DELBUF,    #8D
SDEL1:       NOP
             NOP
             DJNZ     DELBUF,    SDEL1
             RET
      ORG0500h      ;黑龍江省哈爾濱市
DB00H,00H,08H,40H,02H,08H,00H,00H,40H,00H,00H,80H,01H,02H,00H,00H
DB3FH,00H,0FCH,40H,02H,0CH,40H,00H,30H,40H,08H,40H,09H,01H,20H,00H
DB21H,08H,08H,0A0H,02H,08H,20H,08H,17H,2FH,0FCH,0FEH,09H,00H,10H,04H
DB31H,7CH,28H,0A0H,02H,1FH,04H,0FCH,00H,28H,40H,02H,11H,0FFH,0CH,0FEH
DB2DH,49H,38H,10H,0FFH,20H,0FEH,08H,80H,10H,40H,64H,11H,01H,24H,00H,25H
DB49H,48H,08H,02H,41H,80H,10H,60H,83H,40H,80H,20H,01H,0C0H,08H,21H,4AH
DB08H,0EH,02H,81H,88H,00H,20H,52H,40H,10H,03H,3FH,00H,0FCH,3FH,4DH,0F8H
DB0F4H,04H,01H,88H,00H,08H,13H,40H,0F8H,0CH,21H,08H,08H,01H,48H,00H,00H
DB04H,09H,90H,40H,10H,12H,40H,20H,3FH,21H,0FCH,08H,7FH,48H,0FCH,08H,04H
DB09H,0A0H,20H,20H,22H,40H,20H,0C8H,21H,08H,08H,01H,4BH,00H,0FCH,08H,11H
DB0C0H,10H,0E0H,0E2H,40H,24H,0FH,21H,0F8H,08H,0FFH,7AH,0FEH,08H,08H,11H,82H
DB18H,20H,3FH,40H,0FEH,08H,21H,08H,08H,00H,4AH,00H,08H,11H,21H,82H,08H,20H
DB20H,44H,00H,0FH,21H,0F8H,28H,28H,02H,90H,08H,16H,01H,82H,00H,2FH,23H,0FEH
DB20H,08H,21H,08H,10H,24H,03H,4CH,0F8H,20H,05H,7EH,00H,20H,22H,00H,18H,0FH
DB01H,0F8H,00H,44H,02H,44H,08H,40H,02H,00H,00H,20H,24H,00H,08H,08H,01H,08H,00H

END




獲取漢字點陣數據的VB程序
新建一個vb工程,新建桌面如下圖:



Form1上放置4個文本框,6個命令按鈕,5個標簽Label,一個下拉框ComboBox,分別把命令按鈕的caption改成“獲取漢字點陣信息”,“清空EEPROM”,“發送數據”,“讀EEPROM”,“讀時鐘”,”修改時鐘“。把4TextboxText清空。在“工程”菜單下,選部件,如下圖:


引入串口通信控件,如下圖:

然后把拉到桌面上,就可以應用vb自帶的串口通信部件了。
下面把代碼復制到工程代碼區中:
Private Sub Combo1_Click()
On Error Resume Next
Label4.Caption = 8 ' Combo1.Text
MSComm1.CommPort = Right(Combo1.Text,1)
MSComm1.Settings = "9600,n,8,1"
If MSComm1.PortOpen = False Then MSComm1.PortOpen= True
MSComm1.InputLen = 0
MSComm1.RThreshold = 1
MSComm1.SThreshold = 0
MSComm1.InputMode = comInputModeBinary 'comInputModeText
MSComm1.InBufferSize = 2048
MSComm1.OutBufferSize = 2048
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
Label4.Caption = "串口號:" &MSComm1.CommPort
End Sub


Private Sub Command1_Click()
Dim zf$, q$, w$, X, zf1, p, o,l, cc, B, s, Y
Dim m, k, j, i, c1, c2, c3, c4,c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16
Dim S11, s12, s13, s14, s15,s16, SS
Dim C(32), a(32) AsString
Dim a1 As Byte
On Error Resume Next
zf$ = Text1.Text
X = Len(zf$)
For j = 1 To X
zf1 = Hex(Asc(Mid$(zf$, j, 1)))
If zf1 <"A0" Then
q$ = "&H" & Left(zf1, 1)
w$ = "&H" & Right(zf1, 1)
q = Val(q$)
w = Val(w$)
m = (q * 16 + w) * 16
k = 16
           Open "G:\單片機\LED顯示屏\漢字點陣\asc16" ForBinary As #1
Else
q$ = "&H" & Left(zf1, 2)
w$ = "&h" & Right(zf1, 2)
q = Val(q$) - 160
w = Val(w$) - 160
m = ((q - 1) * 94 + w - 1) * 32
k = 32
           Open "G:\單片機\LED顯示屏\漢字點陣\hzk16" ForBinary As #1
End If

or i = 1 To k
m = m + 1
Seek #1, m
Get #1, m, a1
B = a1
  For l = 1 To 8'把一個字節的十六進制數轉換二進制數
    cc =B / 2 '被2除,余數為1
    If B/ 2 = Int(B / 2) Then
    s =0 & s
   Else
    s =1 & s
    EndIf
    B =Int(cc)
  Next l
C(i) = s
'Text2.Text = Text2.Text + C(i)
If k = 32 Then
c1 = C(1) + C(2): c2 = C(3) + C(4)'16*16點陣,每個字每行2個字節相加。
c3 = C(5) + C(6): c4 = C(7) + C(8)
c5 = C(9) + C(10): c6 = C(11) + C(12)
c7 = C(13) + C(14): c8 = C(15) + C(16)
c9 = C(17) + C(18): c10 = C(19) + C(20)
c11 = C(21) + C(22): c12 = C(23) +C(24)
c13 = C(25) + C(26): c14 = C(27) +C(28)
c15 = C(29) + C(30): c16 = C(31) +C(32)
a(1) = C(1)
a(2) = C(2)
a(3) = C(3)
a(4) = C(4)
a(5) = C(5)
a(6) = C(6)
a(7) = C(7)
a(8) = C(8)
a(9) = C(9)
a(10) = C(10)
a(11) = C(11)
a(12) = C(12)
a(13) = C(13)
a(14) = C(14)
a(15) = C(15)
a(16) = C(16)
a(17) = C(17)
a(18) = C(18)
a(19) = C(19)
a(20) = C(20)
a(21) = C(21)
a(22) = C(22)
a(23) = C(23)
a(24) = C(24)
a(25) = C(25)
a(26) = C(26)
a(27) = C(27)
a(28) = C(28)
a(29) = C(29)
a(30) = C(30)
a(31) = C(31)
a(32) = C(32)
Else
c1 = C(1): c2 = C(2)
c3 = C(3): c4 = C(4)
c5 = C(5): c6 = C(6)
c7 = C(7): c8 = C(8)
c9 = C(9): c10 = C(10)
c11 = C(11): c12 = C(12)
c13 = C(13): c14 = C(14)
c15 = C(15): c16 = C(16)
'源碼,沒經過處理
a(1) = C(1)
a(2) = C(2)
a(3) = C(3)
a(4) = C(4)
a(5) = C(5)
a(6) = C(6)
a(7) = C(7)
a(8) = C(8)
a(9) = C(9)
a(10) = C(10)
a(11) = C(11)
a(12) = C(12)
a(13) = C(13)
a(14) = C(14)
a(15) = C(15)
a(16) = C(16)
End If
s = ""
Next i
Close
l = 0: o = 0
    Forl = 1 To k '32
       p = a(l)
           For o = 1 To 8
               Y = Mid(p, o, 1)
               Y = "&H" & Y
               Y = Val(Y) * 2 ^ (8 - o)
               cc = cc + Y
           Next o
        a(l) = Hex(cc)
          If Len(a(l)) = 1 Then a(l) = "0" & a(l)
   ' s = s +a(l) & "H,"
    s =s + a(l) & ","
           cc = 0
    Nextl   
s15 = s15 + s
'Text1.Text = Text1.Text + s15
'Exit Sub
o = 0: cc = 0: p = 0: l = 0: Y = 0: s =0
Next j
k = Len(s15)
Text2.Text = s15 + "字符數=" & k& Chr(13) + Chr(10)
'下面對多字節(8)個點陣漢字進行處理,行掃描
Dim Bq() As String
Bq = Split(s15, ",") '分割為數組
l = X * 32 / 2
s1 = ""
For i = 0 To 15 ' Step 4
c1 = "H,"
For j = 0 To l - 1 Step 32
s1 = Bq(2 * i + j) + c1 + Bq(2 * i + l + j) + c1 +Bq(2 * i + j + 1) + c1 + Bq(2 * i + l + j + 1) + c1
Text3.Text = Text3.Text + s1 '加 l = X * 32 /2是把8個漢字分成一半,同時顯示上面4個漢字和下面4個漢字,先取上面一個字節,再取下面一個字節,加32是取第二個漢字,加64是取地個漢字,加96是取第4個漢字,一次取完一行
Next j
For j = 0 To l - 1 Step 32
s2 = Bq(2 * i + j) + Bq(2 * i + l + j) + Bq(2 * i+ j + 1) + Bq(2 * i + l + j + 1)
Text4.Text = Text4.Text + s2
Next j
Next i
End Sub
Private Sub Command2_Click()

If MSComm1.PortOpen = False Then MSComm1.PortOpen= True

MSComm1.Output = "66"
Text3.Text = "66OK"

MSComm1.PortOpen = False
End Sub
Private Sub Command3_Click()
Dim s1, s2, s3 As String
If MSComm1.PortOpen = False Then MSComm1.PortOpen= True
zf$ = Text1.Text
X = Len(zf$)
If X = 16 Then X = "10"
If X = 24 Then X = "18"
s1 = Text4.Text
If X < 10 Then X = "0" & X
s2 = Mid$(s1, 1, 512)
MSComm1.Output = X & s2
s3 = Mid$(s1, 513, 512)
MSComm1.Output = s3
S4 = Mid$(s1, 1025, 512)
MSComm1.Output = S4
Text3.Text = X & s2 & s3 &S4
MSComm1.PortOpen = False
End Sub
Private Sub Command4_Click()
If MSComm1.PortOpen = False Then MSComm1.PortOpen= True
MSComm1.Output = "77"
End Sub
Private Sub Command5_Click()
MSComm1.Output = "99"
End Sub
Private Sub Command6_Click()
sj = Format(Now, "yyyy年mm月dd日hh時mm分ss秒")
w = Weekday(Date) - 1
xq = "0" & w
sj1 = Mid(sj, 3, 2) + Mid(sj, 6, 2) + Mid(sj, 9,2) & xq
sj2 = Mid(sj, 12, 2) + Mid(sj, 15, 2) + Mid(sj,18, 2)
Text3.Text = "88" + sj1 + sj2
MSComm1.Output = "88" + sj1 + sj2
End Sub
Private Sub Form_Load()
Text1.Text = "黑龍江省哈爾濱市"'黑龍江省哈爾濱市道里區紅軍街一號
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
MSComm1.InBufferSize = 2048
MSComm1.OutBufferSize = 2048
MSComm1.RThreshold = 1 '
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
Dim strBuff As String
Dim str() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputLen = 0
strBuff = MSComm1.Input
str() = strBuff
'接收數據處理為16進制
For i = 0 To UBound(str)
If Len(Hex(str(i))) = 1 Then
strData = strData & "0" &Hex(str(i))
Else
strData = strData & Hex(str(i))
End If
Next
Text3.Text = Text3.Text + strData
End Select
End Sub
點擊工具欄上的啟動按鈕,如下圖,看是否出錯,能正常運行就大功告成。如果出錯


可能是缺少HZK16,ASC16兩個文件,或文件路徑不正確,需要改動路徑。文件目錄如下圖:可到我的網盤下載。(連接在我的前面文章中)

本程序有4個功能,在最上面的文本框中輸入要獲取的點陣漢字,可以是8個,16個(與顯示屏對應),點擊“獲取漢字點陣信息”按鈕,獲得的數據如下圖:



Text2中顯示的是單個漢字的點陣信息,每32個字節是一個漢字,如00,08,3F,FC,21,08,31,28,2D,38,25,48,21,08,3F,F8,01,00,7F,FC,01,00,FF,FE,00,00,28,90,24,4C,44,44是“黑”字的點陣,接下來的是“龍”字的點陣02,00,02,40,02,20,02,04,FF,FE,02,80,02,88,04,88,04,90,04,A0,08,C0,08,82,11,82,16,82,20,7E,40,00,以此類推。
Text3中顯示的是按漢字字符串“黑龍江省哈爾濱市”的1/2,相隔4個漢字分離出來的點陣信息,因為我用的顯示屏每塊是32*128的點陣,所以上下可以顯示216*16的點陣,每行可以顯示416*16的漢字,單片機程序是上下2行漢字同時掃描,所以要進行1/2漢字點陣分離。如果要擴充到2塊顯示屏,就可以顯示16個漢字,如顯示“黑龍江省哈爾濱市道里區紅軍街一號”,就需要從19個漢字同時掃描,相應的點陣信息要從第9個開始分離,再重新組合。為了便于貼到單片機程序中,加上了“,”號和“H”符號。
Text4中顯示的與TEXT3中的內容一致,只不過去掉了“,”號和“H”符號,便于和單片機通信。
點擊“清空EEPROM”按鈕,功能是清空單片機STC11F04EEEPROM的數據,刷新數據之前必須先清空。STC11F04E1K字節的EEPROM,有2個扇區,每隔扇區512字節,地址是“0000—01FF”是第一扇區,“0200—03FF”是第二扇區。
點擊“發送數據”按鈕,是把Text4中的點陣數據通過串口發送到單片機STC11F04E中到EEPROM中,串口波特率是9600,應用時注意你自己微機的串口號,默認是“com8”。在串口發送數據時,會把漢字字符串的長度信息發送到EEPROM的“0000”單元中,便于單片機自動改變掃描長度。
點擊“讀EEPROM”按鈕是讀出單片機STC11F04E中的EEPROM數據。
點擊“讀時鐘”可以讀出時鐘模塊的日期和時間,如”16011801143533”asii碼“31363031313830313134353333”表示16年、118日、星期一、143533秒。
點擊“修改時鐘”,會把微機系統的時鐘寫入時鐘模塊。


STC11F04E單片機程序

;可顯示綠色8個、16個、24個漢字,11.0592MHZ,9600波特率,STC11F04E單片機,可串口接收8、16、24個漢字并顯示,2016-01-12通過

          ORG0000H
          AJMPKS        
          ORG 0003H
          RETI
          ORG 000BH
;       LJMP CT
        RETI
          ORG 001BH
         RETI
       ORG 0023H
       AJMPS        ;接收數據轉S
       A1   EQU P1.0   ;P1.0=A         2
       B1   EQU P1.1   ;P1.1=B         4
       C1   EQU P1.2   ;P1.2=C         6
       D1   EQU P1.3   ;P1.3=D         8
       G1   EQU 0B3H    ;數據輸出G1=B4
       G2   EQU 0B7H   ;數據輸出  G2=B5
       STB  EQU 0B2H    ;595數據鎖存脈沖=L 12
       SCK  EQU 0B4H    ;595時鐘輸入=S   11
       R11  EQU 0B0H   ;改為81,R22改為80,上下顯示顛倒
       R22  EQU  0B1H
       EN   EQU 0B5H    ;138片選,行輸出使NENG
       DELBUF EQU 7FH
       DBUF EQU 60H
       ZS EQU 61H
       HM      EQU   1EH            ;定時器毫秒存儲
       WDT_CONTR   EQU 0C1H
       FLAG_1 EQU    20H.1          ;

       ;聲明與IAP/ISP/EEPROM有關的特殊功能寄存器的地址
       IAP_DATA       EQU   0C2H
       IAP_ADDRH      EQU   0C3H
       IAP_ADDRL      EQU   0C4H
       IAP_CMD        EQU   0C5H
       IAP_TRIG       EQU   0C6H
       IAP_CONTR      EQU   0C7H
       ;定義ISP/IAP命令
       ISP_IAP_BYTE_READ  EQU  1H   ;字節讀
       ISP_IAP_BYTE_PROGRAM  EQU   2H ;字節編程,可以將1寫成0,要將1變成0,必須執行字節編程
       ISP_IAP_SECTOR_ERASE    EQU 3H ;扇區擦除,可以將0擦成1,要將0變成1,必須擦除整個扇區
       ;定義Flash 操作等待時間及允許IAP/ISP/EEPROM操作的常數
       ENABLE_IAP     EQU  84H    ;系統工作時鐘<6MHz時,對IAP_CONTR寄存器設置此值
   KS:  MOVSP,#65H    ;設堆棧指針
        MOV SCon,#50h; 方式1,REN=1.SM0,SM1SM2,REN,TB8,RB8TI,RI
        MOV TMOD,#21H;波特率發生器T1工作在模式2
        MOV TH1,#0FDH;預置初值(按照波特率9600BPS預置初值)  11.0592=9600=FD 14400=FE 7200=FC
        MOV TL1,#0FDH;預置初值(按照波特率9600BPS預置初值) 11.0592=4800=FA 2400=F4 1200=E8
        MOV  TH0,#88H     ;8800=12t,7000=stc1t
      MOV  TL0, #00H
        ORL IE, #92H  ;EA=1,ES=1;ET0=1
        SETBPS       ;串口中斷優先
        SETBTR1      ;啟動定時器1
       MOV WDT_CONTR ,#27H;;;;;;看門狗設置使能
Q:        MOV A,#0;FFH
       MOVR2,#64D    ;清數據區
       MOV R0,#20H
QING:  MOV@R0,A     ;清數據區
       INC R0
       DJNZ R2,QING

Q1:     SETB G1
         SETBG2         ;G1,G2送數顯示綠色
         SETB R11
         SETBR22        ;R11R22送數顯示紅色
         MOV   DPTR , #0000H    ;取漢字長度
         LCALL  Byte_Read;
         MOV   ZS, A; #8   ;送一行8個漢字
T1:     MOVR3,#00H     ;行掃描R3控制行數從0000000000010000,ABCD的變化給138譯碼0F掃描16行,當10時掃描結束
         MOV   DPTR , #0001H    ;取數字
TZ:     MOV A,ZS
         MOV   R2, A; #8   ;送一行8個漢字
         SETBEN         ;138片選,行輸出使能
  ZJ1:   LCALL Byte_Read;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(黑)        
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(哈)
          MOV R6,A
          INC DPTR
          LCALL  Byte_Read;
          CPL A
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          INCDPTR
          DJNZ R2,ZJ1
          SETB   STB
          NOP;
          CLR    STB
          MOVA,R3                 ;138地址ABCD
          MOVP1,A                 ;P2.0-P2.3=ABCD
          INC R3
          MOV A,R3
          XRLA,#10H           ;00-08是前8行,08-10H是后8;
          JNZTZ              ;送前16
          MOV WDT_CONTR ,#17H;喂狗CLR EN
          JNB FLAG_1,T1
          CALL FS1
          AJMP T1

BIN:   MOV  R5, #08H  ;G1G2,或R11R22中寫一個字節數據
BIN1:  RLC  A
      ; MOV  R11, C  ;寫上半屏紅色
       MOV  G1,C    ;寫上半屏綠色
       MOV R4,A
       MOV A,R6
       RLC A
      ; MOV R22,C   ;下半屏紅色
       MOV G2,C    ;下半屏綠色
       MOV R6,A
       MOV A,R4
       SETB  SCK
       NOP;
       NOP
       NOP
       CLR SCK
       DJNZ  R5,  BIN1
       RET

;------------------------------------------------
;讀一字節,調用前需打開IAP 功能,入口:DPTR= 字節地址,返回:A= 讀出字節
Byte_Read:
   MOV    IAP_CONTR, #ENABLE_IAP    ;打開 IAP功能,設置Flash 操作等待時間
   MOV    IAP_CMD,   #ISP_IAP_BYTE_READ  ;設置為IAP/ISP/EEPROM字節讀模式命令
   MOV    IAP_ADDRH, DPH            ;設置目標單元地址的高8位地址
   MOV    IAP_ADDRL, DPL            ;設置目標單元地址的低8位地址
   CLR    EA
   MOV    IAP_TRIG,  #5AH      ;先送5Ah,再送A5hISP/IAP觸發寄存器,每次都需如此
   MOV    IAP_TRIG,  #0A5H     ;送完A5h后,ISP/IAP命令立即被觸發起動
   NOP
   MOV    A,  IAP_DATA         ;讀出的數據在IAP_DATA單元中,送入累加器A
   SETB   EA
   ACALL IAP_Disable ;關閉 IAP功能,清相關的特殊功能寄存器,使CPU處于安全狀態,
                     ;一次連續的IAP操作完成之后建議關閉IAP功能,不需要每次都關
   RET
;------------------------------------------------
;字節編程,調用前需打開IAP 功能,入口:DPTR= 字節地址,A=須編程字節的數據
Byte_Program:
   MOV   IAP_CONTR,#ENABLE_IAP   ;打開 IAP功能,設置Flash 操作等待時間
   MOV   IAP_CMD,#ISP_IAP_BYTE_PROGRAM  ;設置為IAP/ISP/EEPROM字節編程模式命令
   MOV   IAP_ADDRH,DPH           ;設置目標單元地址的高8位地址
   MOV   IAP_ADDRL,DPL           ;設置目標單元地址的低8位地址
   MOV   IAP_DATA,A              ;要編程的數據先送進ISP_DATA寄存器
   CLR   EA
   MOV   IAP_TRIG,#5AH           ;先送5Ah,再送A5hISP/IAP觸發寄存器,每次都需如此
   MOV   IAP_TRIG,#0A5H         ;送完A5h后,ISP/IAP命令立即被觸發起動
   NOP
   SETB  EA
    ACALL IAP_Disable ;關閉 IAP功能,清相關的特殊功能寄存器,使CPU處于安全狀態,
                      ;一次連續的IAP操作完成之后建議關閉IAP功能,不需要每次都關
   RET
;------------------------------------------------
;擦除扇區,入口:DPTR= 扇區地址
Sector_Erase:
   MOV   IAP_CONTR,#ENABLE_IAP   ;打開 IAP功能,設置Flash 操作等待時間
   MOV   IAP_CMD,#03H            ;設置為IAP/ISP/EEPROM扇區擦除模式命令
   MOV   IAP_ADDRH,DPH           ;設置目標單元地址的高8位地址
   MOV   IAP_ADDRL,DPL           ;設置目標單元地址的低8位地址
   CLR   EA
   MOV   IAP_TRIG,#5AH           ;先送5Ah,再送A5hISP/IAP觸發寄存器,每次都需如此
   MOV   IAP_TRIG,#0A5H         ;送完A5h后,ISP/IAP命令立即被觸發起動
   NOP
   SETB  EA
    ACALL IAP_Disable ;關閉 IAP功能,清相關的特殊功能寄存器,使CPU處于安全狀態,
                      ;一次連續的IAP操作完成之后建議關閉IAP功能,不需要每次都關
   RET
;------------------------------------------------
IAP_Disable:
;關閉 IAP功能,清相關的特殊功能寄存器,使CPU處于安全狀態,
;一次連續的IAP操作完成之后建議關閉IAP功能,不需要每次都關
   MOV   IAP_CONTR,#0            ;關閉 IAP功能
   MOV   IAP_CMD, #0             ;清命令寄存器,使命令寄存器無命令,此句可不用
   MOV   IAP_TRIG,#0             ;清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
   MOV   IAP_ADDRH,#0FFH  ;送地址高字節單元為00,指向非EEPROM
   MOV   IAP_ADDRL,#0FFH  ;送地址低字節單元為00,防止誤操作
   RET

S:    PUSH ACC
      PUSH PSW
      PUSH DPH
      PUSH DPL
JS0:   CLR ES
       CLR EA
       SETB  REN  ;允許接收
       LCALLPDRI     ;等待串口數據
       MOV  A,  SBUF   ;讀輸入緩沖區
       CLR RI
       MOV B,A
       XRLA,#66H         ;擦除EEPROM
       JNZ JS
       AJMP JS3
JS:    MOV A,B
       XRLA,#77H       ;EEPROM發送到PC
       JZ FS6
       MOV A,B
       SUBBA,#28H     ;30H="0" ,如果第一個字節是“01”表示16進制發送,如果是“30H”表示ASC碼接收
       JC  JS1        ;8asc碼是38h-28h,c=0。(01h,10h先發送2個小于28的命令字符)-28h,c=1.Js1十六進制接收,(36,37,38)-28h,c=0,ascii接收
       LCALL PDRI;等待下一個串口數據
       MOV  A,  SBUF   ;讀輸入緩沖區
       MOV R2,A
       CLR RI
       XRLA,#36H       ;ASC碼接收時命令改成66,77  ;擦除EEPROM
       JNZ JSI
       AJMP JS3
FS6:   AJMP FS0
JSI:    MOV A,B
       XRLA,#37H       ;EEPROM發送到PC
       JNZ JSA
       AJMP FS0
JSA:   MOVA,B          ;分離出漢字長度81624EEPROM0000單元
       ANL A,#0FH
       SWAP A
       MOV B,A
       MOV A,R2
       ANL A,#0FH
       ORL A,B
       MOV    DPTR,#0000H
       LCALL  Byte_Program
JSI1:   MOVR2,#00h      ;ascii碼接收
       MOV R5,#04H;02h
       MOV    DPTR,#0001H
SI8:     SETBREN         ;接收第一個字節時沒有清除RI,所以還得從2CH開始接收
       MOV R2,#00h
SI9: MOV R0,#2CH
       LCALL PDRI  ;PC發來的是ASCII,要讀入2ASC碼才能合成一個字節數據
     MOVA,   SBUF ;讀輸入緩沖區
       CLR RI;軟件清除串口中斷標記
         MOV   @R0,A   ;數據送RAM
      INC  R0            ;數據地址加1
SI10:   LCALLPDRI
     MOVA,   SBUF ;讀輸入緩沖區
       CLR RI;軟件清除串口中斷標記
         MOV   @R0,A   ;數據送RAM
      DEC  R0           ;數據地址減1,回到第一個字節
LASC: LCALL  ASC
       SWAP   A
       MOV  DBUF,  A
       INC   R0              ;數據地址加1
       LCALL  ASC
       ORL DBUF,A
       MOVA,DBUF             ;
       LCALL Byte_Program          ;字節編程寫入A
       CLR RI;軟件清除串口中斷標記
       INC DPTR
      DJNZ R2,SI9
       DJNZ R5,SI8
       AJMP SEND1

JS1:   MOV    DPTR,#0000H
       MOV A,B
       LCALL  Byte_Program;MOV R2,#00H
JS2:   MOV    DPTR,#0001H
    SETB  REN ;允許接收
S2:    LCALL PDRI;等待下一個串口數據
       MOV  A,  SBUF   ;讀輸入緩沖區
       LCALL Byte_Program          ;字節編程寫入A
       CLR RI;軟件清除串口中斷標記
       INC DPTR
       MOV A,DPH
       CJNE A,#04H ,S2
       AJMP SEND
FS0:   ;MOV R2,#00H
       MOV    DPTR,#0000H  ;EEPROM測試起始地址送DPTR數據指針
FS:   LCALL Byte_Read   ;MOVX A,@DPTR;讀芯片內部擴展的EXTRAM
       MOV    SBUF,   A
       JNB    TI,    $
       CLR    TI
       INC DPTR
       MOV A,DPH
       CJNE A,#04H ,FS;DJNZ R2,FS
       AJMP SEND
JS3:   MOV    DPTR,#0000H  ;EEPROM測試起始地址送DPTR數據指針
       LCALL  Sector_Erase ;擦除整個扇區
       MOV    DPTR,#0200H  ;EEPROM測試起始地址送DPTR數據指針
       LCALL  Sector_Erase ;擦除整個扇區
       AJMP SEND
SEND1:  SETBFLAG_1
SEND:   POP DPL
      POP DPH
      POP PSW
      POP ACC
       SETB ES
       SETB EA
SD:  RETI


FS1:   PUSH ACC
      PUSH PSW
      PUSH DPH
      PUSH DPL
       MOV R5,#04H;02H
       MOV    DPTR,#0000H  ;EEPROM測試起始地址送DPTR數據指針
       CLR    ES
       MOV R0,#2CH
FS2:   MOV R2,#00H
FS3:   LCALL Byte_Read   ;
       MOV @R0,A
       CALL FSD
       INC DPTR
       DJNZ R2,FS3
       DJNZ R5,FS2
       CLR  FLAG_1
       SETB   ES
       POP DPL
      POP DPH
      POP PSW
      POP ACC
       RET


ASC:   MOV   A,   @R0
       CLR   C
       SUBB   A,   #30H
       MOV   R6,   A
       SUBB  A,   #0AH    ;0-9的數字不夠減 30-39=0-9
       JC    ASCEND
       XCH   A,   R6
       SUBB  A,  #07H     ;A-F的數字再減,比如A=41H-30H-7=A, 41-47=A-F
       MOV   R6,  A
ASCEND:MOV   A,   R6
       RET
FSD:      MOV DPTR,#0FD0H
       MOV    A,   @R0
FSD1:  ANL    A,     #0F0H
       SWAP   A
       MOVC A,@A+DPTR
       MOV    SBUF,   A
       JNB    TI,    $
       CLR    TI
       MOV    A,   @R0
       ANL    A,     #0FH
       MOVCA,@A+DPTR
       MOV    SBUF,   A
       JNB    TI,    $
       CLR    TI
       ;INC    R0
       RET

PDRI:          SETB REN;占用R4/R5/R1
              MOV R1,#100;20;300毫秒超時退出!
PBZ:          MOV R4,#25;50;100;67
DY2:          MOV R5,#2;4;8
DY1:          JB RI,KKQ;檢測到RI1就退出
              DJNZ R5,DY1;25微秒檢測一次
              JB RI,KKQ;檢測到RI1就退出
              SETB C;程序正常時C=1
              DJNZ R4,DY2;內循環50毫秒
              DJNZ R1,PBZ;超時退出
              CLR C;對串口接收超時退出C=0
              CLRRI;清除有串口數據標志
KKQ:          RET

END




LED顯示屏顯示時鐘

首先在原電路基礎上添加一個時鐘模塊DS20001,如下圖:


然后把單片機顯示程序改變如下:
T1:     MOVR3,#00H     ;行掃描 R3控制行數從0000000000010000,ABCD的變化給138譯碼0F掃描16行,當10時掃描結束
         MOV   DPTR , #TABSZ   ;取數字
         MOV R2,#160
         SETBEN         ;138片選,行輸出使能

  ZJ1:   ACALLMON          ;取月數據首址
         ACALL HOU          ;取時數據首址 調顯示

         MOVA,MONTH        ;取月數據首址+1,第二位
         ANL A,#0FH
         ACALL MON1

          MOVA,HOUR        ;取時數據首址
          ANL A,#0FH
          ACALLHOU1        ;2         調顯示

          MOV A,R2;#160
          ACALLYUE        ;取“月”字數據首址

          MOVA,R2       ;"-"字數據首址
          ADD A,#64
          ACALLSHI        ;3            調顯示

          MOVA,R2       ;取“月”字數據首址+1
          ADD A,#01H
          ACALL YUE

          MOVA,MINUTE     ;取分數據首址
          LCALLHOU0       ;4           調顯示

          MOVA,DAY        ;取日數據首址
          ACALLMON0       ;5

          MOVA,MINUTE     ;""數據首址+1
          ANL A,#0FH
          ACALLHOU1       ;6           調顯示

          MOVA,DAY        ;取日數據首址+1
          ANL A,#0FH
          ACALL MON1

          MOVA,R2       ;"-"字數據首址
          ADD A,#64
          ACALLSHI        ;7          調顯示

          MOVA,#32       ;取日字的漢字點陣首址
          ADD A,R2
          ACALLYUE

          MOVA,SECOND       ;取秒數據首址
          ACALLHOU0         ; 調顯示

          MOVA,#33      ;取日字的漢字點陣首址+1
          ADD A,R2
          ACALL YUE

          MOVA,SECOND       ;取秒數據首址+1
          ANL A,#0FH
          ACALLHOU1       ;8      調顯示

          INC R2
          ;DEC DPH
          INC DPTR

          SETB   STB
          NOP
          CLR    STB

          MOVA,R3                 ;138地址ABCD
          MOVP1,A                 ;P2.0-P2.3=ABCD
          INC R3
          MOV A,R3
          XRLA,#10H           ;00-08是前8行,08-10H是后8;
          JNZZJ1             ;送前16
          MOV WDT_CONTR ,#17H;喂狗CLR EN
          JNB FLAG_1,TZ0
          CALLFS1
TZ0:      AJMP T1


MON:      MOV A,MONTH
MON0:     ANL A,#0F0H
          SWAP A
MON1:     MOV B,#10H
          MULAB       ;B放結果高8位,A放結果低8
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R6,A
          RET
HOU:      MOV A,HOUR
HOU0:     ANL A,#0F0H
          SWAP A
HOU1:     MOV B,#10H
          MUL AB
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          RET

YUE:      ;MOV A,R2
          MOVC  A, @A+DPTR ;
          CPL A
          MOV R6,A
          RET
SHI:      MOVC  A, @A+DPTR ;
          CPL A
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          RET
顯示效果如下圖:


顯示程序改變如下:
T1:     MOVR3,#00H     ;行掃描 R3控制行數從0000000000010000,ABCD的變化給138譯碼0F掃描16行,當10時掃描結束
         MOV   DPTR , #TABSZ   ;取數字
         MOV R2,#160
         SETBEN         ;138片選,行輸出使能

  ZJ1:   ACALL MON
         ACALLHOU         ;1

         MOV A,MONTH
         ANL A,#0FH
         ACALL MON1

          MOV A,HOUR
          ANL A,#0FH
          ACALLHOU1        ;2

          MOV A,R2;#160
          ACALLYUE        ;取“月”字數據首址

          MOVA,R2       ;""字數據首址
          ADD A,#64
          ACALLSHI        ;3

          MOVA,R2       ;取“月”字數據首址
          ADD A,#01H
          ACALL YUE

          MOVA,R2       ;""字數據首址
          ADD A,#65
          ACALL SHI        ;4

          MOV A,DAY
          ACALLMON0       ;5

          MOV A,MINUTE
          ACALL HOU0

          MOV A,DAY
          ANL A,#0FH
          ACALL MON1

          MOV A,MINUTE
          ANL A,#0FH
          ACALLHOU1       ;6

          MOVA,#32       ;取日字的漢字點陣首址
          ADD A,R2
          ACALL YUE

          MOVA,R2     ;""字數據首址
          ADD A,#96
          INC DPH
          ACALL SHI

          DECDPH        ;7
          MOVA,#33      ;取日字的漢字點陣首址+1
          ADDA,R2
          ACALL YUE

          INC DPH
          MOVA,R2       ;""字數據首址+1
          ADD A,#97
          ACALLSHI        ;8

          INC R2
          DEC DPH
          INC DPTR

          SETB   STB
          NOP
          CLR    STB

          MOVA,R3                 ;138地址ABCD
          MOVP1,A                 ;P2.0-P2.3=ABCD
          INC R3
          MOV A,R3
          XRLA,#10H           ;00-08是前8行,08-10H是后8;
          JNZZJ1             ;送前16
          MOV WDT_CONTR ,#17H;喂狗CLR EN
          JNB FLAG_1,TZ0
          CALL FS1
TZ0:      AJMP T1


MON:      MOV A,MONTH
MON0:     ANL A,#0F0H
          SWAP A
MON1:     MOV B,#10H
          MULAB       ;B放結果高8位,A放結果低8
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R6,A
          RET
HOU:      MOV A,HOUR
HOU0:     ANL A,#0F0H
          SWAP A
HOU1:     MOV B,#10H
          MUL AB
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          RET

YUE:      ;MOV A,R2
          MOVC  A, @A+DPTR ;
          CPL A
          MOV R6,A
          RET
SHI:      MOVC  A, @A+DPTR ;
          CPL A
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          RET

顯示效果如下圖:


通過串口發送命令:“8816011801123045”可修改時間和日期,含義是16年一月18日星期一123045秒。
還可以通過串口發送命令“99”,讀取時鐘模塊的日期和時間。

完整程序請在我的網盤下載。


采用STC12C5A60S2單片機的LED顯示屏驅動程序
一、原理圖如下,由于LED顯示屏上的驅動集成電路使用了74HC245集成電路(前面的例子是使用74HC244),使能端并取消了74LS04,所以驅動電路有所變化,相應的程序也有所改變。原來74LS138使能端經74LS04反相是低電平,現在取消了74LS04就變為高電平了 。

二、顯示效果如下:2個畫面交替顯示。
三、STC12C5A60S2單片機簡介
STC12C5A60S2是STC生產的單時鐘/機器周期(1T)的單片機,是高速、低功耗、超強抗干擾的新一代8051單片機,指令代碼完全兼容傳統8051,但速度快8-12倍。內部集成MAX810專用復位電路,2路PWM,8路高速10位A/D轉換,針對電機控制,強干擾場合。
1、增強型8051CPU,單時鐘/機器周期,stc12c5a60s2的運行速度比at89s52要快12
2、工作電壓 5.5-3.5V
3、60K字節ROM1280字節數據RAM
4、通用I/O口,復位后為:準雙向口/弱上拉
可設置成四種模式:準雙向口/弱上拉,強推挽/強上拉,僅為輸入/高阻,開漏
每個I/O口驅動能力均可達到20mA,但整個芯片最大不要超過120mA
5、有1K字節的EEPROM,擦寫次數在10萬次以上
6、看門狗
7、內部集成MAX810專用復位電路
8、外部掉電檢測電路
9、時鐘源:外部高精度晶體/時鐘,內部R/C振蕩器
常溫下內部R/C振蕩器頻率為:5.0V單片機為:11~17MHz,3.3V單片機為:8~12MHz
10、416位定時器,兩個與傳統8051兼容的定時器/計數器,16位定時器T0T1
11、3個時鐘輸出口,可由T0的溢出在P3.4/T0輸出時鐘,可由T1的溢出在P3.5/T1輸出時鐘,獨立波特率發生器可以在P1.0口輸出時鐘
12、外部中斷I/O7路,傳統的下降沿中斷或電平觸發中斷,并新增支持上升沿中斷的PCA模塊,PowerDown模式可由外部中斷喚醒,INT0/P3.2INT1/P3.3,T0/P3.4,T1/P3.5RxD/P3.0,CCP0/P1.3,CCP0/P1.3
13、2PWM
14、A/D轉換,10位精度ADC,共8路,轉換速度可達250K/S
15、通用全雙工異步串行口(UART)
16、雙串口,RxD2/P1.2TxD2/P1.3
17、工作范圍:-40~85
18、封裝:LQFP-48,LQFP-44PDIP-40,PLCC
四、溫度測量原理:采用NTC熱敏電阻器與一個固定電阻分壓,如下圖隨著溫度的變化,分壓值也會變化,用STC12C5A60S2單片機的A/D轉換器采集這個分壓值,在單片機中設置一個電壓與溫度的對應表(這個表通過實驗獲得),根據采集的電壓值獲取對應的溫度值,顯示出來并保存在單片機內存中。


五、顯示程序
          ORG 0000H
       AJMPKS        ;顯示xxxx 室溫xx度,11.0592MHZSTC12C5A60S2單片機 ,帶時鐘,可交替顯示溫度。88命令修改時間日期,99命令查詢日期時間2016-01-27 通過
      ORG0003H       ;XXXXXXXX-X
      RETI
       ORG 000BH
        LJMP CT
        RETI
       ORG 001BH
       RETI

       ORG 0023H
       AJMPS        ;接收數據轉S
       A1  EQU P0.0   ;P1.0=A         2
       B1   EQU P0.1   ;P1.1=B         4
       C1   EQU P0.2   ;P1.2=C         6
       D1   EQU P0.3   ;P1.3=D         8
       G1   EQU P2.6   ;數據輸出G1=B4
       G2   EQU P2.7  ;數據輸出  G2=B5
       STB  EQU P2.5    ;595數據鎖存脈沖=L12
       SCK  EQU P2.4    ;595時鐘輸入=S   11
       R11  EQU P2.3   ;改為81,R22改為80,上下顯示顛倒
       R22  EQU  P2.2
       EN   EQU P2.1    ;138片選,行輸出使NENG
       ADC_Channel_1_Result EQU 2FH
       DBUF EQU 60H
       ZS EQU 61H
       HM      EQU   1EH            ;定時器毫秒存儲
       WDT_CONTR   EQU 0C1H
       AUX1     EQU   0A2H           ;AUXR1寄存器的ADRJ位是A/D轉換結果寄存器(ADC_RES,ADC_RESL)的數據格式調整控制位.
;ADRJ=0時,..............................................10A/D轉換結果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中.
       ;AUR EQU 8EH; Internal/External RAM access 內部/外部RAM存取= 0:內部擴展的EXT_RAM可以存取.
       FLAG_1 EQU    20H.1          ;
       FLAG_2 EQU    20H.1          ;
       FLAG_3 EQU    20H.1          ;
       YEAR   EQU    28H            ;
       MONTH  EQU    29H            ;
       DAY    EQU    2AH            ;
       WEEK   EQU    2BH            ;星期
       HOUR   EQU    2CH            ;小時
       MINUTE EQU    2DH            ;分鐘
       SECOND EQU    2EH            ;
       FLAG   EQU    27H            ;通用標志寄存器
                                       ;BIT0=1, ACK ERR
                                       ;BIT0=0,ACK OK
                                       ;BIT1=1,TEST MODE
                                       ;BIT1=0,NORMAL MODE
       P1M0 DATA 92H
       P1M1 DATA 91H
       P0M0 DATA 94H
       P0M1 DATA 93H
       P2M0 DATA 96H
       P2M1 DATA 95H
       TIMETEMP       EQU    27H    ;時間數據緩存器
       TIMETX         EQU    59H    ;時間數據發送寄存器
       TIMERX         EQU    5AH    ;時間數據接收寄存器
       SDA            EQU    0b5h   ;IICSDA口線 15
       SCL            EQU    0b7h   ;IICSCL口線 13
       LED            EQU    0B6H
       ;聲明與IAP/ISP/EEPROM有關的特殊功能寄存器的地址
       IAP_DATA       EQU   0C2H
       IAP_ADDRH      EQU   0C3H
       IAP_ADDRL      EQU   0C4H
       IAP_CMD        EQU   0C5H
       IAP_TRIG       EQU   0C6H
       IAP_CONTR      EQU   0C7H
       ;定義ISP/IAP命令
       ISP_IAP_BYTE_READ  EQU  1H   ;字節讀
       ISP_IAP_BYTE_PROGRAM  EQU   2H ;字節編程,可以將1寫成0,要將1變成0,必須執行字節編程
       ISP_IAP_SECTOR_ERASE    EQU 3H ;扇區擦除,可以將0擦成1,要將0變成1,必須擦除整個扇區
       ;定義Flash 操作等待時間及允許IAP/ISP/EEPROM操作的常數
       ENABLE_IAP     EQU  84H    ;系統工作時鐘<6MHz時,對IAP_CONTR寄存器設置此值
       ;AD轉換設置
       ADC_CONTR EQU 0BCH ;ADC control register
      ; SFR name Address bit B7  B6     B5    B4      B3      B2  B1   B0
   ;ADC_CONTR BCH name ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2CHS1 CHS0
       ADC_RES EQU 0BDH ;ADC high 8-bit result register
       ADC_LOW2 EQU 0BEH ;ADC low 8-bit result register
       P1ASF EQU 09DH ;P1 secondary function control register
       ADC_FLAG EQU 10H ;ADC complete flag
       ADC_Power_On_Speed_Channel_1EQU 11100000B   ;;B7=power,B6B5=speed,B4=flag,B3=start;B2B1B0=ch0-ch7001P1.1作為A/D輸入,000P1.0輸入

  KS:   MOVSP,#65H   ;設堆棧指針
        MOV SCon,#50h; 方式1,REN=1.SM0SM1,SM2,REN,TB8,RB8,TI,RI
        MOV TMOD,#21H;波特率發生器T1工作在模式2
MOVTH1,#0FDH;預置初值(按照波特率9600BPS預置初值)11.0592=9600=FD         MOV TL1,#0FDH;
        MOV  TH0,#0DCH;88H     ;8800=12t,7000=stc1t
      MOV  TL0, #00H
        ORL IE, #92H  ;EA=1,ES=1;ET0=1
        SETBPS       ;串口中斷優先
        SETBTR1      ;啟動定時器1
        SETB EN
        MOVP0M0,#00000000b     ; P1M0=0 P1M1=0雙向口   P1M0=1 P1M1=0輸入口   P1M0=0 P1M1=1推挽輸出20ma
        MOV P0M1,#00000000b
        MOVP2M0,#00000000b     ; P1M0=0 P1M1=0雙向口   P1M0=1 P1M1=0輸入口   P1M0=0 P1M1=1推挽輸出20ma
        MOVP2M1,#00000000b
        MOV   ADC_CONTR,#ADC_Power_On_Speed_Channel_1;AD轉換設置
        ;ANL AUX1,#11111011B   ;ADRJ =0
        LCALL INIT_ADC
        MOV WDT_CONTR ,#27H;;;;;;看門狗設置使能
Q:      MOV A,#0;FFH
       MOVR2,#64D    ;清數據區
       MOV R0,#20H
  QING:  MOV@R0,A     ;清數據區
       INC R0
       DJNZ R2,QING
        LCALL  TIMESTATUS_INT12       ;24小時制
        LCALL READ_TIME   ;
        MOV WDT_CONTR ,#17H;喂狗CLR EN
         SETBTR0          ;啟動定時器0
Q1:     SETB G1
         SETBG2         ;G1,G2送數顯示綠色
         SETBR11
         SETBR22        ;R11R22送數顯示紅色
         CLR LED
T1:     MOVR3,#00H     ;行掃描R3控制行數從0000000000010000,ABCD的變化給138譯碼0F掃描16行,當10時掃描結束
         MOV   DPTR , #TABSZ   ;取數字
         MOV R2,#160
         CLREN               ;138片選,行輸出使能
         MOV A,SECOND;根據秒數據交替顯示
         ANL A,#0FH
         SUBB A,#5
         JNC ZJ1
         AJMP ZJ2
  ZJ1:    MOVA,R2       ;取“溫“字數據首址+1
          ADD A,#96
          INC DPH
          ACALL YUE
          DEC DPH
          ACALLHOU          ;取時數據首址 1調顯示

          MOVA,R2       ;取“溫“字數據首址+1
          ADD A,#97
          INC DPH
          ACALL YUE
          DEC DPH

          MOVA,HOUR        ;取時數據首址低字節
          ANL A,#0FH
          ACALLHOU1        ;2         調顯示

          MOVA,R2       ;""字數據首址
          ADD A,#128
          INC DPH
          ACALL YUE
          DEC DPH

          MOVA,MINUTE     ;取分數據首址
          ACALLHOU2        ;3調顯示

          MOVA,R2       ;""字數據首址+1
          ADD A,#129
          INC DPH
          ACALL YUE
          DEC DPH
          MOVA,MINUTE     ;""數據首址+1
          ANL A,#0FH
          ACALLHOU3      ;4調顯示

          MOV A,ADC_Channel_1_Result
          MOVR5,A         ;A/D結果送R5
          LCALL HEX2BCD  ;影響單元:R0,R1,R6 ,R1A/D結果轉換成BCD的十位和個位
          ACALL MON0

          MOVA,SECOND       ;取秒數據首址
          ACALLHOU0         ; 5調顯示

          MOV A,ADC_Channel_1_Result
          MOVR5,A         ;A/D結果送R5
          LCALL HEX2BCD  ;影響單元:R0,R1,R6 ,R1A/D結果轉換成BCD的十位和個位
          ANL A,#0FH
          ACALLMON1       ;

          MOVA,SECOND       ;取秒數據首址+1
          ANL A,#0FH
          ACALLHOU1       ;6      調顯示

          MOVA,R2       ;""字數據首址+1
          ADD A,#128
          INC DPH
          ACALL YUE
          DEC DPH

          MOVA,R2       ;"-"字數據首址
          ADD A,#64
          ACALLSHI        ;7          調顯示

          MOVA,R2       ;""字數據首址+1
          ADD A,#129
          INC DPH
          ACALL YUE
          DEC DPH

          MOVA,WEEK      ;取星期數據首址+1
          ANL A,#0FH
          ACALLHOU3      ;8      調顯示

          INC R2
          INC DPTR

          SETB   STB
          NOP
          CLR    STB

          MOV A,R3                 ;138地址ABCD
          MOVP0,A                 ;P2.0-P2.3=ABCD
          INC R3
          MOV A,R3
          XRLA,#10H           ;00-08是前8行,08-10H是后8;
          JNZZJ1             ;送前16
          MOV WDT_CONTR ,#17H;喂狗CLR EN
          JNB FLAG_1,TZ0
          CALL FS1
TZ0:      AJMP T1

  ZJ2:   ACALLMON          ;取月數據首址
         ACALLHOU          ;取時數據首址 調顯示

         MOVA,MONTH        ;取月數據首址+1,第二位
         ANL A,#0FH
         ACALL MON1

          MOV A,HOUR        ;取時數據首址+1
          ANL A,#0FH
          ACALLHOU1        ;2         調顯示

          MOV A,R2;#160
          ACALLYUE        ;取“月”字數據首址

          MOVA,MINUTE     ;取分數據首址
          ACALLHOU2;0        ;調顯示

          MOVA,R2       ;取“月”字數據首址+1
          ADD A,#01H
          ACALL YUE

          MOVA,MINUTE     ;""數據首址+1
          ANL A,#0FH
          ACALLHOU3;1       ;6           調顯示

          MOVA,DAY        ;取日數據首址
          ACALLMON0       ;5

          MOVA,SECOND       ;取秒數據首址
          ACALLHOU0         ; 調顯示

          MOVA,DAY        ;取日數據首址+1
          ANL A,#0FH
          ACALL MON1

          MOVA,SECOND       ;取秒數據首址+1
          ANL A,#0FH
          ACALLHOU1       ;8      調顯示

          MOVA,#32       ;取日字的漢字點陣首址
          ADD A,R2
          ACALL YUE

         ; MOVA,WEEK       ;取星期數據首址
          ;ACALLHOU2;0        ; 調顯示
          MOVA,R2       ;"-"字數據首址
          ADD A,#64
          ACALLSHI        ;7          調顯示

          MOVA,#33      ;取日字的漢字點陣首址+1
          ADD A,R2
          ACALL YUE

          MOVA,WEEK      ;取星期數據首址+1
          ANL A,#0FH
          ACALL HOU3;1      ;8      調顯示

          INC R2
          ;DEC DPH
          INC DPTR

          SETB   STB
          NOP
          CLR    STB

          MOVA,R3                 ;138地址ABCD
          MOVP0,A                 ;P2.0-P2.3=ABCD
          INC R3
          MOV A,R3
          XRLA,#10H           ;00-08是前8行,08-10H是后8;
          JNZZJ2             ;送前16
          MOV WDT_CONTR ,#17H;喂狗CLR EN
          JNB FLAG_1,TZ3
          CALL FS1

TZ3:      AJMP T1
MON:      MOV A,MONTH
MON0:     ANL A,#0F0H
          SWAP A
MON1:     MOV B,#10H
          MULAB       ;B放結果高8位,A放結果低8
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R6,A
          RET
HOU:      MOV A,HOUR
HOU0:     ANL A,#0F0H
          SWAP A
HOU1:     MOV B,#10H
          MUL AB
          MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R4,A
          ACALLBIN       ;BIN2顯示綠色
          RET

HOU2:     ANL A,#0F0H
          SWAP A
HOU3:     MOV B,#10H
          MUL AB
SHI:      MOVC  A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節,顯示半個漢字(牡)
          CPLA                     ;再跳過8個字節(4個漢字)取第二行1個字節數據(校)
          MOV R4,A
          ACALLBIN2       ;BIN2顯示綠色
          RET
YUE:      ;MOV A,R2
          MOVC  A, @A+DPTR ;
          CPL A
          MOV R6,A
          RET

BIN:   MOV  R5, #08H  ;G1G2,或R11R22中寫一個字節數據
BIN1:  RLC  A
      ; MOV  R11, C  ;寫上半屏紅色
       MOV  G1,C    ;寫上半屏紅色
       MOV R4,A
       MOV A,R6
       RLC A
      ; MOV R22,C   ;下半屏紅色
       MOV R22,C    ;下半屏綠色
       MOV R6,A
       MOV A,R4
       SETB  SCK
       NOP;CALL SDELAY
       NOP
       NOP
       CLR SCK
       DJNZ  R5,  BIN1
       RET
BIN2:  MOV  R5, #08H  ;G1G2,或R11R22中寫一個字節數據
BIN3:  RLC  A
       MOV  G1,C     ;G1
       MOV R4,A
       MOV A,R6
       RLC A
       MOV R22,C   ;下半屏紅色G1 R22 紅色的日
       MOV R6,A
       MOV A,R4
       SETB  SCK
       NOP
       NOP
       CLR SCK
       DJNZ  R5,  BIN3

       RET



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:83069 發表于 2018-4-17 11:51 | 只看該作者
好文章,就是匯編不懂,能發個c的不?
回復

使用道具 舉報

無效樓層,該帖已經被刪除
地板
ID:279667 發表于 2018-5-31 08:58 | 只看該作者
不懂匯編...看著挺費勁的...有C版本的么?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表