LED顯示屏驅(qū)動程序 幾年前本人得到一塊雙色LED顯示屏,因為沒有控制器,所以對顯示屏的工作原理進行了一番研究,利用手頭上的元件,搭了一塊電路板,編寫了一段程序就放置一邊了,這幾天有時間,把原來的89C51匯編程序改了一下,改為AT89C2051和STC11F04E單片機能用的程序,放到博客上希望有興趣的同行可以參考一下。下面是顯示效果圖:  下面是接口電路板圖:

下面是電路原理圖:

工作原理:這塊顯示屏是分為上下共32行LED點陣,水平有4塊16*16點陣,所以能顯示16*16點陣8個漢字。工作原理是用74ls138做為行掃描,列用74ls595控制,當(dāng)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腳
我現(xiàn)在用的是雙色板,JP1各端口含義如下:

ABCD是顯示屏電路板上的74LS138地址譯碼端, 單片機寄存器R3控制行掃描,當(dāng)R3從00000000到00010000增加時ABCD的變化給138譯碼,當(dāng)R3=0FH時正好掃描16行,當(dāng)進位到10時掃描結(jié)束,OE是138的片選使能端,低電平有效。G1,G2是給595送綠色數(shù)據(jù),R1R2是給595送紅色數(shù)據(jù)的,ST是595數(shù)據(jù)鎖存脈沖,SC是595時鐘輸入端。所有11個接線端都要通過74HC244總線驅(qū)動器接入。正常工作時因為按行掃描,首先掃描第一行和第17行同時進行,依次掃描到第16行和32行結(jié)束,所以送數(shù)據(jù)時,要把“黑龍江省哈爾濱市”8個漢字分成上面4個和下面4個,首先取“黑”字的16*16點陣數(shù)據(jù)的第一行第一個字節(jié)(一個漢字32個字節(jié))存入單片機寄存器R6中,再取“哈” 字的16*16點陣數(shù)據(jù)的第一行第一個字節(jié)存入單片機寄存器R4中,調(diào)用送字節(jié)子程序送出到595中,接下來再取“黑”字的16*16點陣數(shù)據(jù)的第一行第二個字節(jié)存入單片機寄存器R6中,接著取“哈” 字的16*16點陣數(shù)據(jù)的第一行第二個字節(jié)存入單片機寄存器R4中,調(diào)用送字節(jié)子程序送出到595中,如此共取8次,用R2控制,這樣就掃描完了第一行和第17行,用R3控制ABCD共掃描16行(因為一次掃描2行)就完成一屏的數(shù)據(jù)顯示。為了配合這種掃描方式,8個漢字的點陣數(shù)據(jù)要進行重新排列才行,這在后續(xù)的程序中再說。 下面是51單片機匯編語言代碼,主要由顯示程序和送字節(jié)數(shù)據(jù)程序2段程序組成:
ORG 0000H
AJMPKS ;顯示綠色黑龍江省哈爾濱市,11.0592MHZ,STC11F04E單片機
ORG 0003H
RETI
ORG 000BH
; LJMP 0C00H RETI
ORG 001BH
RETI
ORG 0023H
;AJMPS ;接收數(shù)據(jù)轉(zhuǎn)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 ;數(shù)據(jù)輸出G1=B4
G2 EQU 0B7H ;數(shù)據(jù)輸出 G2=B5
STB EQU 0B2H ;595數(shù)據(jù)鎖存脈沖=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 ;設(shè)堆棧指針
MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發(fā)生器T1工作在模式2上
MOV TH1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值) 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 ;串口中斷優(yōu)先
SETBTR1 ;啟動定時器1
MOV WDT_CONTR ,#27H;;;;;;看門狗設(shè)置使能
Q: MOV A,#0;FFH
MOVR2,#64D ;清數(shù)據(jù)區(qū)
MOV R0,#20H
QING: MOV@R0,A ;清數(shù)據(jù)區(qū)
INC R0
DJNZ R2,QING
Q1: SETB G1
SETBG2 ;G1,G2送數(shù)顯示綠色
SETB R11
SETBR22 ;R11R22送數(shù)顯示紅色
T1: MOVR3,#00H ;行掃描 R3控制行數(shù)從00000000到00010000,ABCD的變化給138譯碼0F掃描16行,當(dāng)10時掃描結(jié)束
MOV DPTR , #0500H ;取數(shù)字
TZ: MOV R2, #8 ;送一行8個漢字
SETBEN ;138片選,行輸出使能
ZJ1: CLRA
MOVC A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(黑)
CPL A ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(哈)
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中寫一個字節(jié)數(shù)據(jù)
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
獲取漢字點陣數(shù)據(jù)的VB程序
新建一個vb工程,新建桌面如下圖:

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

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

然后把 拉到桌面上,就可以應(yīng)用vb自帶的串口通信部件了。
下面把代碼復(fù)制到工程代碼區(qū)中:
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'把一個字節(jié)的十六進制數(shù)轉(zhuǎn)換二進制數(shù)
cc =B / 2 '被2除,余數(shù)為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個字節(jié)相加。
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)
'源碼,沒經(jīng)過處理
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 + "字符數(shù)=" & k& Chr(13) + Chr(10)
'下面對多字節(jié)(8)個點陣漢字進行處理,行掃描
Dim Bq() As String
Bq = Split(s15, ",") '分割為數(shù)組
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個漢字,先取上面一個字節(jié),再取下面一個字節(jié),加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 = "黑龍江省哈爾濱市"'黑龍江省哈爾濱市道里區(qū)紅軍街一號
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
'接收數(shù)據(jù)處理為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兩個文件,或文件路徑不正確,需要改動路徑。文件目錄如下圖:可到我的網(wǎng)盤下載。(連接在我的前面文章中)

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

Text2中顯示的是單個漢字的點陣信息,每32個字節(jié)是一個漢字,如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的點陣,所以上下可以顯示2行16*16的點陣,每行可以顯示4個16*16的漢字,單片機程序是上下2行漢字同時掃描,所以要進行1/2漢字點陣分離。如果要擴充到2塊顯示屏,就可以顯示16個漢字,如顯示“黑龍江省哈爾濱市道里區(qū)紅軍街一號”,就需要從1和9個漢字同時掃描,相應(yīng)的點陣信息要從第9個開始分離,再重新組合。為了便于貼到單片機程序中,加上了“,”號和“H”符號。
Text4中顯示的與TEXT3中的內(nèi)容一致,只不過去掉了“,”號和“H”符號,便于和單片機通信。
點擊“清空EEPROM”按鈕,功能是清空單片機STC11F04E中EEPROM的數(shù)據(jù),刷新數(shù)據(jù)之前必須先清空。STC11F04E有1K字節(jié)的EEPROM,有2個扇區(qū),每隔扇區(qū)512字節(jié),地址是“0000—01FF”是第一扇區(qū),“0200—03FF”是第二扇區(qū)。
點擊“發(fā)送數(shù)據(jù)”按鈕,是把Text4中的點陣數(shù)據(jù)通過串口發(fā)送到單片機STC11F04E中到EEPROM中,串口波特率是9600,應(yīng)用時注意你自己微機的串口號,默認是“com8”。在串口發(fā)送數(shù)據(jù)時,會把漢字字符串的長度信息發(fā)送到EEPROM的“0000”單元中,便于單片機自動改變掃描長度。
點擊“讀EEPROM”按鈕是讀出單片機STC11F04E中的EEPROM數(shù)據(jù)。
點擊“讀時鐘”可以讀出時鐘模塊的日期和時間,如”16011801143533”的asii碼“31363031313830313134353333”表示16年、1月18日、星期一、14點35分33秒。
點擊“修改時鐘”,會把微機系統(tǒng)的時鐘寫入時鐘模塊。
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 ;接收數(shù)據(jù)轉(zhuǎn)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 ;數(shù)據(jù)輸出G1=B4
G2 EQU 0B7H ;數(shù)據(jù)輸出 G2=B5
STB EQU 0B2H ;595數(shù)據(jù)鎖存脈沖=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有關(guān)的特殊功能寄存器的地址
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 ;字節(jié)讀
ISP_IAP_BYTE_PROGRAM EQU 2H ;字節(jié)編程,可以將1寫成0,要將1變成0,必須執(zhí)行字節(jié)編程
ISP_IAP_SECTOR_ERASE EQU 3H ;扇區(qū)擦除,可以將0擦成1,要將0變成1,必須擦除整個扇區(qū)
;定義Flash 操作等待時間及允許IAP/ISP/EEPROM操作的常數(shù)
ENABLE_IAP EQU 84H ;系統(tǒng)工作時鐘<6MHz時,對IAP_CONTR寄存器設(shè)置此值
KS: MOVSP,#65H ;設(shè)堆棧指針
MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發(fā)生器T1工作在模式2上
MOV TH1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值) 11.0592=9600=FD 14400=FE 7200=FC
MOV TL1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值) 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 ;串口中斷優(yōu)先
SETBTR1 ;啟動定時器1
MOV WDT_CONTR ,#27H;;;;;;看門狗設(shè)置使能
Q: MOV A,#0;FFH
MOVR2,#64D ;清數(shù)據(jù)區(qū)
MOV R0,#20H
QING: MOV@R0,A ;清數(shù)據(jù)區(qū)
INC R0
DJNZ R2,QING
Q1: SETB G1
SETBG2 ;G1,G2送數(shù)顯示綠色
SETB R11
SETBR22 ;R11R22送數(shù)顯示紅色
MOV DPTR , #0000H ;取漢字長度
LCALL Byte_Read;
MOV ZS, A; #8 ;送一行8個漢字
T1: MOVR3,#00H ;行掃描R3控制行數(shù)從00000000到00010000,ABCD的變化給138譯碼0F掃描16行,當(dāng)10時掃描結(jié)束
MOV DPTR , #0001H ;取數(shù)字
TZ: MOV A,ZS
MOV R2, A; #8 ;送一行8個漢字
SETBEN ;138片選,行輸出使能
ZJ1: LCALL Byte_Read;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(黑)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(哈)
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中寫一個字節(jié)數(shù)據(jù)
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
;------------------------------------------------
;讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR= 字節(jié)地址,返回:A= 讀出字節(jié)
Byte_Read:
MOV IAP_CONTR, #ENABLE_IAP ;打開 IAP功能,設(shè)置Flash 操作等待時間
MOV IAP_CMD, #ISP_IAP_BYTE_READ ;設(shè)置為IAP/ISP/EEPROM字節(jié)讀模式命令
MOV IAP_ADDRH, DPH ;設(shè)置目標單元地址的高8位地址
MOV IAP_ADDRL, DPL ;設(shè)置目標單元地址的低8位地址
CLR EA
MOV IAP_TRIG, #5AH ;先送5Ah,再送A5h到ISP/IAP觸發(fā)寄存器,每次都需如此
MOV IAP_TRIG, #0A5H ;送完A5h后,ISP/IAP命令立即被觸發(fā)起動
NOP
MOV A, IAP_DATA ;讀出的數(shù)據(jù)在IAP_DATA單元中,送入累加器A
SETB EA
ACALL IAP_Disable ;關(guān)閉 IAP功能,清相關(guān)的特殊功能寄存器,使CPU處于安全狀態(tài),
;一次連續(xù)的IAP操作完成之后建議關(guān)閉IAP功能,不需要每次都關(guān)
RET
;------------------------------------------------
;字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR= 字節(jié)地址,A=須編程字節(jié)的數(shù)據(jù)
Byte_Program:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP功能,設(shè)置Flash 操作等待時間
MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM ;設(shè)置為IAP/ISP/EEPROM字節(jié)編程模式命令
MOV IAP_ADDRH,DPH ;設(shè)置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設(shè)置目標單元地址的低8位地址
MOV IAP_DATA,A ;要編程的數(shù)據(jù)先送進ISP_DATA寄存器
CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發(fā)寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被觸發(fā)起動
NOP
SETB EA
ACALL IAP_Disable ;關(guān)閉 IAP功能,清相關(guān)的特殊功能寄存器,使CPU處于安全狀態(tài),
;一次連續(xù)的IAP操作完成之后建議關(guān)閉IAP功能,不需要每次都關(guān)
RET
;------------------------------------------------
;擦除扇區(qū),入口:DPTR= 扇區(qū)地址
Sector_Erase:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP功能,設(shè)置Flash 操作等待時間
MOV IAP_CMD,#03H ;設(shè)置為IAP/ISP/EEPROM扇區(qū)擦除模式命令
MOV IAP_ADDRH,DPH ;設(shè)置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設(shè)置目標單元地址的低8位地址
CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發(fā)寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被觸發(fā)起動
NOP
SETB EA
ACALL IAP_Disable ;關(guān)閉 IAP功能,清相關(guān)的特殊功能寄存器,使CPU處于安全狀態(tài),
;一次連續(xù)的IAP操作完成之后建議關(guān)閉IAP功能,不需要每次都關(guān)
RET
;------------------------------------------------
IAP_Disable:
;關(guān)閉 IAP功能,清相關(guān)的特殊功能寄存器,使CPU處于安全狀態(tài),
;一次連續(xù)的IAP操作完成之后建議關(guān)閉IAP功能,不需要每次都關(guān)
MOV IAP_CONTR,#0 ;關(guān)閉 IAP功能
MOV IAP_CMD, #0 ;清命令寄存器,使命令寄存器無命令,此句可不用
MOV IAP_TRIG,#0 ;清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
MOV IAP_ADDRH,#0FFH ;送地址高字節(jié)單元為00,指向非EEPROM區(qū)
MOV IAP_ADDRL,#0FFH ;送地址低字節(jié)單元為00,防止誤操作
RET
S: PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
JS0: CLR ES
CLR EA
SETB REN ;允許接收
LCALLPDRI ;等待串口數(shù)據(jù)
MOV A, SBUF ;讀輸入緩沖區(qū)
CLR RI
MOV B,A
XRLA,#66H ;擦除EEPROM
JNZ JS
AJMP JS3
JS: MOV A,B
XRLA,#77H ;讀EEPROM發(fā)送到PC
JZ FS6
MOV A,B
SUBBA,#28H ;30H="0" ,如果第一個字節(jié)是“01”表示16進制發(fā)送,如果是“30H”表示ASC碼接收
JC JS1 ;8的asc碼是38h-28h,c=0。(01h,10h先發(fā)送2個小于28的命令字符)-28h,c=1.轉(zhuǎn)Js1十六進制接收,(36,37,38)-28h,c=0,ascii接收
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A, SBUF ;讀輸入緩沖區(qū)
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發(fā)送到PC
JNZ JSA
AJMP FS0
JSA: MOVA,B ;分離出漢字長度8或16或24存EEPROM的0000單元
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 ;接收第一個字節(jié)時沒有清除RI,所以還得從2CH開始接收
MOV R2,#00h
SI9: MOV R0,#2CH
LCALL PDRI ;PC發(fā)來的是ASCII碼,要讀入2個ASC碼才能合成一個字節(jié)數(shù)據(jù)
MOVA, SBUF ;讀輸入緩沖區(qū)
CLR RI;軟件清除串口中斷標記
MOV @R0,A ;數(shù)據(jù)送RAM
INC R0 ;數(shù)據(jù)地址加1
SI10: LCALLPDRI
MOVA, SBUF ;讀輸入緩沖區(qū)
CLR RI;軟件清除串口中斷標記
MOV @R0,A ;數(shù)據(jù)送RAM
DEC R0 ;數(shù)據(jù)地址減1,回到第一個字節(jié)
LASC: LCALL ASC
SWAP A
MOV DBUF, A
INC R0 ;數(shù)據(jù)地址加1
LCALL ASC
ORL DBUF,A
MOVA,DBUF ;
LCALL Byte_Program ;字節(jié)編程寫入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;等待下一個串口數(shù)據(jù)
MOV A, SBUF ;讀輸入緩沖區(qū)
LCALL Byte_Program ;字節(jié)編程寫入A
CLR RI;軟件清除串口中斷標記
INC DPTR
MOV A,DPH
CJNE A,#04H ,S2
AJMP SEND
FS0: ;MOV R2,#00H
MOV DPTR,#0000H ;將EEPROM測試起始地址送DPTR數(shù)據(jù)指針
FS: LCALL Byte_Read ;MOVX A,@DPTR;讀芯片內(nèi)部擴展的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數(shù)據(jù)指針
LCALL Sector_Erase ;擦除整個扇區(qū)
MOV DPTR,#0200H ;將EEPROM測試起始地址送DPTR數(shù)據(jù)指針
LCALL Sector_Erase ;擦除整個扇區(qū)
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數(shù)據(jù)指針
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的數(shù)字不夠減 30-39=0-9
JC ASCEND
XCH A, R6
SUBB A, #07H ;是A-F的數(shù)字再減,比如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;檢測到RI變1就退出
DJNZ R5,DY1;25微秒檢測一次
JB RI,KKQ;檢測到RI變1就退出
SETB C;程序正常時C=1
DJNZ R4,DY2;內(nèi)循環(huán)50毫秒
DJNZ R1,PBZ;超時退出
CLR C;對串口接收超時退出C=0
CLRRI;清除有串口數(shù)據(jù)標志
KKQ: RET
END
LED顯示屏顯示時鐘
首先在原電路基礎(chǔ)上添加一個時鐘模塊DS20001,如下圖:

然后把單片機顯示程序改變?nèi)缦拢?/font>
T1: MOVR3,#00H ;行掃描 R3控制行數(shù)從00000000到00010000,ABCD的變化給138譯碼0F掃描16行,當(dāng)10時掃描結(jié)束
MOV DPTR , #TABSZ ;取數(shù)字
MOV R2,#160
SETBEN ;138片選,行輸出使能
ZJ1: ACALLMON ;取月數(shù)據(jù)首址
ACALL HOU ;取時數(shù)據(jù)首址 調(diào)顯示
MOVA,MONTH ;取月數(shù)據(jù)首址+1,第二位
ANL A,#0FH
ACALL MON1
MOVA,HOUR ;取時數(shù)據(jù)首址
ANL A,#0FH
ACALLHOU1 ;2 調(diào)顯示
MOV A,R2;#160
ACALLYUE ;取“月”字數(shù)據(jù)首址
MOVA,R2 ;取"-"字數(shù)據(jù)首址
ADD A,#64
ACALLSHI ;3 調(diào)顯示
MOVA,R2 ;取“月”字數(shù)據(jù)首址+1
ADD A,#01H
ACALL YUE
MOVA,MINUTE ;取分數(shù)據(jù)首址
LCALLHOU0 ;4 調(diào)顯示
MOVA,DAY ;取日數(shù)據(jù)首址
ACALLMON0 ;5
MOVA,MINUTE ;取"分"數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU1 ;6 調(diào)顯示
MOVA,DAY ;取日數(shù)據(jù)首址+1
ANL A,#0FH
ACALL MON1
MOVA,R2 ;取"-"字數(shù)據(jù)首址
ADD A,#64
ACALLSHI ;7 調(diào)顯示
MOVA,#32 ;取日字的漢字點陣首址
ADD A,R2
ACALLYUE
MOVA,SECOND ;取秒數(shù)據(jù)首址
ACALLHOU0 ; 調(diào)顯示
MOVA,#33 ;取日字的漢字點陣首址+1
ADD A,R2
ACALL YUE
MOVA,SECOND ;取秒數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU1 ;8 調(diào)顯示
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放結(jié)果高8位,A放結(jié)果低8位
MOVC A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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
顯示效果如下圖:

顯示程序改變?nèi)缦拢?/font>
T1: MOVR3,#00H ;行掃描 R3控制行數(shù)從00000000到00010000,ABCD的變化給138譯碼0F掃描16行,當(dāng)10時掃描結(jié)束
MOV DPTR , #TABSZ ;取數(shù)字
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 ;取“月”字數(shù)據(jù)首址
MOVA,R2 ;取"時"字數(shù)據(jù)首址
ADD A,#64
ACALLSHI ;3
MOVA,R2 ;取“月”字數(shù)據(jù)首址
ADD A,#01H
ACALL YUE
MOVA,R2 ;取"時"字數(shù)據(jù)首址
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 ;取"分"字數(shù)據(jù)首址
ADD A,#96
INC DPH
ACALL SHI
DECDPH ;7
MOVA,#33 ;取日字的漢字點陣首址+1
ADDA,R2
ACALL YUE
INC DPH
MOVA,R2 ;取"分"字數(shù)據(jù)首址+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放結(jié)果高8位,A放結(jié)果低8位
MOVC A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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
顯示效果如下圖:

通過串口發(fā)送命令:“8816011801123045”可修改時間和日期,含義是16年一月18日星期一12點30分45秒。
還可以通過串口發(fā)送命令“99”,讀取時鐘模塊的日期和時間。
完整程序請在我的網(wǎng)盤下載。
采用STC12C5A60S2單片機的LED顯示屏驅(qū)動程序
一、原理圖如下,由于LED顯示屏上的驅(qū)動集成電路使用了74HC245集成電路(前面的例子是使用74HC244),使能端并取消了74LS04,所以驅(qū)動電路有所變化,相應(yīng)的程序也有所改變。原來74LS138使能端經(jīng)74LS04反相是低電平,現(xiàn)在取消了74LS04就變?yōu)楦唠娖搅?/font> 。 二、顯示效果如下:2個畫面交替顯示。 三、STC12C5A60S2單片機簡介
STC12C5A60S2是STC生產(chǎn)的單時鐘/機器周期(1T)的單片機,是高速、低功耗、超強抗干擾的新一代8051單片機,指令代碼完全兼容傳統(tǒng)8051,但速度快8-12倍。內(nèi)部集成MAX810專用復(fù)位電路,2路PWM,8路高速10位A/D轉(zhuǎn)換,針對電機控制,強干擾場合。 1、增強型8051CPU,單時鐘/機器周期,stc12c5a60s2的運行速度比at89s52要快12倍
2、工作電壓 5.5-3.5V
3、60K字節(jié)ROM,1280字節(jié)數(shù)據(jù)RAM
4、通用I/O口,復(fù)位后為:準雙向口/弱上拉
可設(shè)置成四種模式:準雙向口/弱上拉,強推挽/強上拉,僅為輸入/高阻,開漏
每個I/O口驅(qū)動能力均可達到20mA,但整個芯片最大不要超過120mA
5、有1K字節(jié)的EEPROM,擦寫次數(shù)在10萬次以上
6、看門狗
7、內(nèi)部集成MAX810專用復(fù)位電路
8、外部掉電檢測電路
9、時鐘源:外部高精度晶體/時鐘,內(nèi)部R/C振蕩器
常溫下內(nèi)部R/C振蕩器頻率為:5.0V單片機為:11~17MHz,3.3V單片機為:8~12MHz
10、4個16位定時器,兩個與傳統(tǒng)8051兼容的定時器/計數(shù)器,16位定時器T0和T1
11、3個時鐘輸出口,可由T0的溢出在P3.4/T0輸出時鐘,可由T1的溢出在P3.5/T1輸出時鐘,獨立波特率發(fā)生器可以在P1.0口輸出時鐘
12、外部中斷I/O口7路,傳統(tǒng)的下降沿中斷或電平觸發(fā)中斷,并新增支持上升沿中斷的PCA模塊,PowerDown模式可由外部中斷喚醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3,CCP0/P1.3
13、2路PWM
14、A/D轉(zhuǎn)換,10位精度ADC,共8路,轉(zhuǎn)換速度可達250K/S
15、通用全雙工異步串行口(UART)
16、雙串口,RxD2/P1.2,TxD2/P1.3
17、工作范圍:-40~85
18、封裝:LQFP-48,LQFP-44,PDIP-40,PLCC
四、溫度測量原理:采用NTC熱敏電阻器與一個固定電阻分壓,如下圖隨著溫度的變化,分壓值也會變化,用STC12C5A60S2單片機的A/D轉(zhuǎn)換器采集這個分壓值,在單片機中設(shè)置一個電壓與溫度的對應(yīng)表(這個表通過實驗獲得),根據(jù)采集的電壓值獲取對應(yīng)的溫度值,顯示出來并保存在單片機內(nèi)存中。

五、顯示程序
ORG 0000H
AJMPKS ;顯示xx月xx日 室溫xx度,11.0592MHZ,STC12C5A60S2單片機 ,帶時鐘,可交替顯示溫度。88命令修改時間日期,99命令查詢?nèi)掌跁r間2016-01-27 通過
ORG0003H ;XXXXXXXX-X
RETI
ORG 000BH
LJMP CT
RETI
ORG 001BH
RETI
ORG 0023H
AJMPS ;接收數(shù)據(jù)轉(zhuǎn)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 ;數(shù)據(jù)輸出G1=B4
G2 EQU P2.7 ;數(shù)據(jù)輸出 G2=B5
STB EQU P2.5 ;595數(shù)據(jù)鎖存脈沖=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轉(zhuǎn)換結(jié)果寄存器(ADC_RES,ADC_RESL)的數(shù)據(jù)格式調(diào)整控制位.
;當(dāng)ADRJ=0時,..............................................10位A/D轉(zhuǎn)換結(jié)果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中.
;AUR EQU 8EH; Internal/External RAM access 內(nèi)部/外部RAM存取= 0:內(nèi)部擴展的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 ;時間數(shù)據(jù)緩存器
TIMETX EQU 59H ;時間數(shù)據(jù)發(fā)送寄存器
TIMERX EQU 5AH ;時間數(shù)據(jù)接收寄存器
SDA EQU 0b5h ;IIC的SDA口線 15腳
SCL EQU 0b7h ;IIC的SCL口線 13腳
LED EQU 0B6H
;聲明與IAP/ISP/EEPROM有關(guān)的特殊功能寄存器的地址
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 ;字節(jié)讀
ISP_IAP_BYTE_PROGRAM EQU 2H ;字節(jié)編程,可以將1寫成0,要將1變成0,必須執(zhí)行字節(jié)編程
ISP_IAP_SECTOR_ERASE EQU 3H ;扇區(qū)擦除,可以將0擦成1,要將0變成1,必須擦除整個扇區(qū)
;定義Flash 操作等待時間及允許IAP/ISP/EEPROM操作的常數(shù)
ENABLE_IAP EQU 84H ;系統(tǒng)工作時鐘<6MHz時,對IAP_CONTR寄存器設(shè)置此值
;AD轉(zhuǎn)換設(shè)置
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-ch7,001是P1.1作為A/D輸入,000是P1.0輸入
KS: MOVSP,#65H ;設(shè)堆棧指針
MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發(fā)生器T1工作在模式2上
MOVTH1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值)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 ;串口中斷優(yōu)先
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轉(zhuǎn)換設(shè)置
;ANL AUX1,#11111011B ;ADRJ =0
LCALL INIT_ADC
MOV WDT_CONTR ,#27H;;;;;;看門狗設(shè)置使能
Q: MOV A,#0;FFH
MOVR2,#64D ;清數(shù)據(jù)區(qū)
MOV R0,#20H
QING: MOV@R0,A ;清數(shù)據(jù)區(qū)
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送數(shù)顯示綠色
SETBR11
SETBR22 ;R11R22送數(shù)顯示紅色
CLR LED
T1: MOVR3,#00H ;行掃描R3控制行數(shù)從00000000到00010000,ABCD的變化給138譯碼0F掃描16行,當(dāng)10時掃描結(jié)束
MOV DPTR , #TABSZ ;取數(shù)字
MOV R2,#160
CLREN ;138片選,行輸出使能
MOV A,SECOND;根據(jù)秒數(shù)據(jù)交替顯示
ANL A,#0FH
SUBB A,#5
JNC ZJ1
AJMP ZJ2
ZJ1: MOVA,R2 ;取“溫“字數(shù)據(jù)首址+1
ADD A,#96
INC DPH
ACALL YUE
DEC DPH
ACALLHOU ;取時數(shù)據(jù)首址 1調(diào)顯示
MOVA,R2 ;取“溫“字數(shù)據(jù)首址+1
ADD A,#97
INC DPH
ACALL YUE
DEC DPH
MOVA,HOUR ;取時數(shù)據(jù)首址低字節(jié)
ANL A,#0FH
ACALLHOU1 ;2 調(diào)顯示
MOVA,R2 ;取"度"字數(shù)據(jù)首址
ADD A,#128
INC DPH
ACALL YUE
DEC DPH
MOVA,MINUTE ;取分數(shù)據(jù)首址
ACALLHOU2 ;3調(diào)顯示
MOVA,R2 ;取"度"字數(shù)據(jù)首址+1
ADD A,#129
INC DPH
ACALL YUE
DEC DPH
MOVA,MINUTE ;取"分"數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU3 ;4調(diào)顯示
MOV A,ADC_Channel_1_Result
MOVR5,A ;取A/D結(jié)果送R5
LCALL HEX2BCD ;影響單元:R0,R1,R6 ,R1存A/D結(jié)果轉(zhuǎn)換成BCD的十位和個位
ACALL MON0
MOVA,SECOND ;取秒數(shù)據(jù)首址
ACALLHOU0 ; 5調(diào)顯示
MOV A,ADC_Channel_1_Result
MOVR5,A ;取A/D結(jié)果送R5
LCALL HEX2BCD ;影響單元:R0,R1,R6 ,R1存A/D結(jié)果轉(zhuǎn)換成BCD的十位和個位
ANL A,#0FH
ACALLMON1 ;
MOVA,SECOND ;取秒數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU1 ;6 調(diào)顯示
MOVA,R2 ;取"度"字數(shù)據(jù)首址+1
ADD A,#128
INC DPH
ACALL YUE
DEC DPH
MOVA,R2 ;取"-"字數(shù)據(jù)首址
ADD A,#64
ACALLSHI ;7 調(diào)顯示
MOVA,R2 ;取"度"字數(shù)據(jù)首址+1
ADD A,#129
INC DPH
ACALL YUE
DEC DPH
MOVA,WEEK ;取星期數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU3 ;8 調(diào)顯示
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 ;取月數(shù)據(jù)首址
ACALLHOU ;取時數(shù)據(jù)首址 調(diào)顯示
MOVA,MONTH ;取月數(shù)據(jù)首址+1,第二位
ANL A,#0FH
ACALL MON1
MOV A,HOUR ;取時數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU1 ;2 調(diào)顯示
MOV A,R2;#160
ACALLYUE ;取“月”字數(shù)據(jù)首址
MOVA,MINUTE ;取分數(shù)據(jù)首址
ACALLHOU2;0 ;調(diào)顯示
MOVA,R2 ;取“月”字數(shù)據(jù)首址+1
ADD A,#01H
ACALL YUE
MOVA,MINUTE ;取"分"數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU3;1 ;6 調(diào)顯示
MOVA,DAY ;取日數(shù)據(jù)首址
ACALLMON0 ;5
MOVA,SECOND ;取秒數(shù)據(jù)首址
ACALLHOU0 ; 調(diào)顯示
MOVA,DAY ;取日數(shù)據(jù)首址+1
ANL A,#0FH
ACALL MON1
MOVA,SECOND ;取秒數(shù)據(jù)首址+1
ANL A,#0FH
ACALLHOU1 ;8 調(diào)顯示
MOVA,#32 ;取日字的漢字點陣首址
ADD A,R2
ACALL YUE
; MOVA,WEEK ;取星期數(shù)據(jù)首址
;ACALLHOU2;0 ; 調(diào)顯示
MOVA,R2 ;取"-"字數(shù)據(jù)首址
ADD A,#64
ACALLSHI ;7 調(diào)顯示
MOVA,#33 ;取日字的漢字點陣首址+1
ADD A,R2
ACALL YUE
MOVA,WEEK ;取星期數(shù)據(jù)首址+1
ANL A,#0FH
ACALL HOU3;1 ;8 調(diào)顯示
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放結(jié)果高8位,A放結(jié)果低8位
MOVC A, @A+DPTR ;16*16點陣,每行顯示4個漢字,32條水平線,(1個漢字占16條水平線)2行顯示8個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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個漢字,所以先取第一行的一個字節(jié),顯示半個漢字(牡)
CPLA ;再跳過8個字節(jié)(4個漢字)取第二行1個字節(jié)數(shù)據(jù)(校)
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中寫一個字節(jié)數(shù)據(jù)
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中寫一個字節(jié)數(shù)據(jù)
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
|