
推荐
1.每次上电,必须把秒寄存器高位(第7位)设置为0,时钟才能走时。
2.如果需要写入数据和时钟日历信息,必须把“写保护”寄存器设置成为0
内存数据定义
BitCnt data 3Ch 数据位计数器
ByteCnt data 3Dh 数据字节计数器
Command data 3Eh 命令字节地址
RcvDat DATA 40H 接收数据缓冲区
XmtDat DATA 50H 发送数据缓冲区
端口位定义
IO_DATA bit P1.6 数据传送总线
SCLK bit P1.5时钟控制总线
RST bit P1.7 复位总线
RS BIT P3.5
RW BIT P3.6
EN BIT P3.7
ORG 0000H
ORG 0013H
LCALL JKS
AJMP KS
**************************** main program
ORG0030H
KS: CLR RST
MOV SP,#2AH
----LCD初始化----
CLR EN 使能端为0,液晶执行命令
INIT_LCD:
MOV A,#38H 双列显示,字形5*7点阵
ACALL WCOM
ACALL DELAY1
MOV A,#38H 双列显示,字形5*7点阵
ACALL WCOM
ACALL DELAY1
MOV A,#38H 双列显示,字形5*7点阵
ACALL WCOM
ACALL DELAY1
MOV A,#0CH 开显示,关光标
ACALL WCOM
ACALL DELAY1
MOV A,#01H 清除 LCD 显示屏
ACALL WCOM
ACALL DELAY1
MOV A,#06H 地址加1
ACALL WCOM
ACALL DELAY1
------------------------------------初始化1302-------------------------
SET1302:
LCALL Write_Enable写允许
LCALL Osc_Disable
LCALL Write_Multiplebyte初始化1302,将我们要设定的数据写入
LCALL Read_Multiplebyte将我们设定的数据读出来
LCALL Osc_Enable
START:
ACALL LCD
LCALL Read_Multiplebyte
AJMP START
---------------------LCD显示-------------------------
LCD:
MOV A,#11001000B
LCALL WCOM
MOV A,#0显示时间
MOV A,42H
LCALL SSH2
MOV A,#00111010B
LCALL WDATA
MOV A,41H
LCALL SSH2
MOV A,#00111010B
LCALL WDATA
MOV A,40H
LCALL SSH2
MOV A,#11000000B
LCALL WCOM
MOV A,#0显示日期字符
MOV A,46H
LCALL SSH2
MOV A,#00101101B
LCALL WDATA
MOV A,44H
LCALL SSH2
MOV A,#00101101B
LCALL WDATA
MOV A,43H
LCALL SSH2
RET
SSH2:
MOV B,#16
DIV AB
MOV 58H,B
MOV 59H,A
MOV A,59H
MOV DPTR,#TAB
MOVC A,@A+DPTR
ACALL WDATA
MOV A,58H
MOV DPTR,#TAB
MOVC A,@A+DPTR
ACALL WDATA
RET
-----------------------------------------------------
写指令、数据使能子程序
-----------------------------------------------------
WCOM: 写指令使能
ACALL DELAY0
MOV P0,A
CLR RS
CLR RW
CLR EN
CLR EN
CLR EN
SETB EN
RET
WDATA: 写数据使能
ACALL DELAY0
MOV P0,A
SETB RS RS=H,RW=L,D0-D7=数据,E=高脉冲
CLR RW
CLR EN
CLR EN
CLR EN
SETB EN
RET
****判忙音****
DELAY0:
MOV P0,#0FFH
CLR RS
SETB RW
CLR EN
NOP
SETB EN
JB P0.7,DELAY0
RET
TAB:DB 00110000B,00110001B,00110010B,00110011B
DB 00110100B,00110101B,00110110B,00110111B
DB 00111000B,00111001B
********************************************************************************************
发送数据程序
名称:Send_Byte
描述:发送ByteCnt 个字节给被控器DS1302
命令字节地址在Command 中
所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中
********************************************************************************************
Send_Byte:
CLR RST 复位引脚为低电平所有数据传送终止
NOP
CLR SCLK清时钟总线
NOP
SETB RST 复位引脚为高电平逻辑控制有效
NOP
MOV A,Command准备发送命令字节
MOV BitCnt,#08h 传送位数为8
S_Byte0:
RRC A 将最低位传送给进位位C
MOV IO_DATA,C 位传送至数据总线
NOP
SETB SCLK 时钟上升沿发送数据有效
NOP
CLR SCLK 清时钟总线
DJNZ BitCnt,S_Byte0 位传送未完毕则继续
NOP
S_Byte1: 准备发送数据
MOV A,@R0 传送数据过程与传送命令相同
MOV BitCnt,#08h
S_Byte2:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte2
INC R0 发送数据的内存地址加1
DJNZ ByteCnt,S_Byte1 字节传送未完毕则继续
NOP
CLR RST 逻辑 *** 作完毕清RST
RET
***************************************************************************************
接收数据程序
名称:Receive_Byte
描述:从被控器DS1302 接收ByteCnt 个字节数据
命令字节地址在Command 中
所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中
***********************************************************************************
Receive_Byte:
CLR RST 复位引脚为低电平所有数据传送终止
NOP
CLR SCLK 清时钟总线
NOP
SETB RST 复位引脚为高电平逻辑控制有效
MOV A,Command 准备发送命令字节
MOV BitCnt,#08h 传送位数为8
R_Byte0:
RRC A 将最低位传送给进位位C
MOV IO_DATA,C 位传送至数据总线
NOP
SETB SCLK 时钟上升沿发送数据有效
NOP
CLR SCLK 清时钟总线
DJNZ BitCnt,R_Byte0 位传送未完毕则继续
NOP
R_Byte1: 准备接收数据
CLR A 清类加器
CLR C 清进位位C
MOV BitCnt,#08h 接收位数为8
R_Byte2:
NOP
MOV C,IO_DATA 数据总线上的数据传送给C
RRC A 从最低位接收数据
SETB SCLK 时钟总线置高
NOP
CLR SCLK 时钟下降沿接收数据有效
DJNZ BitCnt,R_Byte2 位接收未完毕则继续
MOV @R1,A 接收到的完整数据字节放入接收内存缓冲区
INC R1 接收数据的内存地址加1
DJNZ ByteCnt,R_Byte1 字节接收未完毕则继续
NOP
CLR RST 逻辑 *** 作完毕清RST
RET
--写保护寄存器 *** 作------------------------------------------
Write_Enable:
MOV Command,#8Eh 命令字节为8E
MOV ByteCnt,#1 单字节传送模式
MOV R0,#XmtDat 数据地址覆给R0
MOV XmtDat,#00h 数据内容为0 写入允许
ACALL Send_Byte 调用写入数据子程序
RET
当写保护寄存器的最高位为1 时禁止数据写入寄存器---------------
Write_Disable:
MOV Command,#8Eh 命令字节为8E
MOV ByteCnt,#1 单字节传送模式
MOV R0,#XmtDat 数据地址覆给R0
MOV XmtDat,#80h 数据内容为80h 禁止写入
ACALL Send_Byte 调用写入数据子程序
RET 返回调用本子程序处
当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始---------
Osc_Enable:
MOV Command,#80h 命令字节为80
MOV ByteCnt,#1 单字节传送模式
MOV R0,#XmtDat 数据地址覆给R0
MOV XmtDat,#00h 数据内容为0 振荡器工作允许
ACALL Send_Byte 调用写入数据子程序
RET 返回调用本子程序处
当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式---------------
Osc_Disable:
MOV Command,#80h 命令字节为80
MOV ByteCnt,#1 单字节传送模式
MOV R0,#XmtDat 数据地址覆给R0
MOV XmtDat,#80h 数据内容为80h 振荡器停止
ACALL Send_Byte 调用写入数据子程序
RET 返回调用本子程序处
写入00 年6 月21 日星期三13 时59 分59---------------------
Write_Multiplebyte:
MOV Command,#0BEh 命令字节为BEh
MOV ByteCnt,#8 多字节写入模式此模块为8 个
MOV R0,#XmtDat 数据地址覆给R0
MOV XmtDat,#59h 秒单元内容为59h
MOV XmtDat+1,#59h 分单元内容为59h
MOV XmtDat+2,#13h 时单元内容为13h
MOV XmtDat+3,#21h 日期单元内容为21h
MOV XmtDat+4,#06h 月单元内容为06h
MOV XmtDat+5,#03h 星期单元内容为03h
MOV XmtDat+6,#0 年单元内容为00h
MOV XmtDat+7,#0 写保护单元内容为00h
ACALL Send_Byte 调用写入数据子程序
RET 返回调用本子程序处
读出寄存器0-7 的内容程序设置如下
Read_Multiplebyte:
MOV Command,#0BFh 命令字节为BFh
MOV ByteCnt,#8 多字节读出模式此模块为8 个
MOV R1,#RcvDat 数据地址覆给R1
ACALL Receive_Byte调用读出数据子程序
RET返回调用本子程序处
DELAY1: 延时10MS
MOV 21H,#75
D2:MOV 22H,#100
DJNZ 22H,$
DJNZ 21H,D2
RET
=============================================================================================
END
给你个时钟电路的汇编程序吧:muteM EQU 10h 静音键 闹铃开/关
timerT EQU 0Ch 菜单键 进入/退出设置状态
leftL EQU 46h 左移键
rightR EQU 47h 右移键
upU EQU 19h 增加键
downD EQU 1dh 减少键
d_off EQU 16H 显示键 LED数码管显示/关闭
recall EQU 44H 日历键 DS1302初始化 *** 作
K_on BIT P3.0 闹铃输出
LED1 BIT P3.3
LED2 BIT P3.4
LED3CLK BIT P3.5 DS1302
LED4IO BIT P3.7
RST BIT P3.1
SECOND EQU 60H
60H 秒
61h 分
62h 时
63h 日
64h 月 65h DAY
66h 年
6Ah 闹分 from 00(1302)
6BH 闹时 from 01(1302)
***************************
ORG 0000H
AJMP START
ORG 0003H
LJMP S_INT IRF
ORG 000BH 200Us
LJMP P_INT
ORG 001BH display LED
LJMP DISPLAY
**************************** main program
ORG 0030H
START: CLR RST
MOV SP,#2AH
SETB 05H
CLR 06H
SETB 07HCLR 07H
CLR 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
SETB 0DH
CLR 0EH
CLR 0FH
CLR 10H
CLR 11H
MOV R2,#00H
MOV R3,#00H
MOV TMOD,#12H
MOV TL1,#0e5H wait
MOV TH1,#0BeH
MOV TH0,#3FH 200uS 3f
MOV TL0,#3FH
SETB ET0
SETB ET1
setb pt0
SETB TR0
SETB TR1
SETB IT0
SETB EX0
CLR PX0 LCALL SET1302 初始化
MOV R1,#0C1H 取定时参数从1302中
acall T_6061
MOV 6AH,A M
MOV R1,#0C3H
ACALL T_6061
MOV 6BH,A H
MOV 61H,#0
MOV 62H,#0
SETB EA
sjmp $
********************************
DISPLAY: PUSH ACC
PUSH PSW
MOV TL1,#0e0H wait how long to display (20ms)
MOV TH1,#0b0H
MOV dptr,#tab1
JB 0EH,DIS2
JB 0FH,DIS3
JB 10H,DIS4
JB 11H,DIS5
JNB 0DH,D_OUT
JNB 08H,D_GO 定时到时,显示闪烁
JNB 07H,D_OUT
D_G MOV DPTR,#TAB1
MOV A,62H
ANL A,#0FH
MOV B,A
MOV A,62H
SWAP A
ANL A,#07H
MOVC A,@A+DPTR
MOV P1,A
CLR LED1
LCALL DL2M
SETB LED1
MOV A,B
MOVC A,@A+DPTR
MOV C,07H
MOV acc.7,C 秒灯闪烁
MOV P1,A
CLR LED2
LCALL DL2M
SETB LED2
MOV dptr,#tab2 倒装LED字段表
MOV A,61H
ANL A,#0FH
MOV B,A
MOV A,61H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV C,07H
MOV acc.6,C 秒灯闪烁
MOV P1,A
CLR LED3CLK
LCALL DL2M
SETB LED3CLK
MOV dptr,#tab1
MOV A,B
MOVC A,@A+DPTR
MOV C,06H
cpl c
MOV acc.7,C 闹铃指示灯
MOV P1,A
CLR LED4IO
LCALL DL2M
SETB LED4IO
D_OUT: SETB TR1
POP PSW
POP ACC
RETI
*********************
DIS2: AJMP DIS_2
DIS3: AJMP DIS_3
DIS4: AJMP DIS_4
DIS5: AJMP DIS_5
********************
DIS_2: MOV dptr,#tab1 显示设置小时
MOV 6FH,62H
ACALL BCD_HEX
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR LED1
LCALL DL2M
SETB LED1
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR LED2
LCALL DL2M
SETB LED2
SETB TR1
POP PSW
POP ACC
RETI
*****************
DIS_3: MOV DPTR,#TAB2 显示设置分
MOV 6FH,61H
ACALL BCD_HEX
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR LED3CLK
LCALL DL2M
SETB LED3CLK
MOV A,B
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P1,A
CLR LED4IO
LCALL DL2M
SETB LED4IO
SETB TR1
POP PSW
POP ACC
RETI
*****************
DIS_4: MOV dptr,#tab1 显示设置闹时
JNB 07H,D4_OUT 显示时闪烁
MOV A,6BH
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR LED1
LCALL DL2M
SETB LED1
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR LED2
LCALL DL2M
SETB LED2
D4_OUT: SETB TR1
POP PSW
POP ACC
RETI
***********************
DIS_5: MOV DPTR,#TAB2
JNB 07H,D5_OUT 显示时闪烁
MOV A,6AH 显示设置闹分
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR LED3CLK
LCALL DL2M
SETB LED3CLK
MOV DPTR,#TAB1
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR LED4IO
LCALL DL2M
SETB LED4IO
D5_OUT: SETB TR1
POP PSW
POP ACC
RETI
*****************************
DL2M: MOV 43H,#14H every LED(2ms)
DL2: MOV 44H,#14H
DL1: NOP
NOP
DJNZ 44H,DL1
DJNZ 43H,DL2
RET
************************定时读取1302时间及判断闹铃时间是否到*******
P_INT: PUSH ACC
PUSH PSW
INC R2
CJNE R2,#250D,P_OUT
MOV R2,#00H
INC R3
CJNE R3,#10D,P_OUT
MOV R3,#00H
CPL 07H
MOV P1,#0FFH
ACALL R_1302
OUT: JNB 06H,P_OUT
MOV A,6BH
MOV B,#10
DIV AB
SWAP A
ADD A,B
CJNE A,62H,PP_OUT
MOV A,6AH
MOV B,#10
DIV AB
SWAP A
ADD A,B
CJNE A,61H,PP_OUT
SETB 08H 定时到标志
MOV C,07H
cpl c
MOV K_ON,C
P_OUT: POP PSW
POP ACC
RETI
PP_OUT: SETB K_ON
CLR 08H
POP PSW
POP ACC
RETI
************************有接收到遥控器信号*******
S_INT:CLR EA
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
PUSH 02H
PUSH 03H
MOV R6,#10D
SB: ACALL YS1
JB P3.2,EXIT
DJNZ R6, SB
JNB P3.2, $
ACALL YS2
JB P3.2,EXIT
MOV R1,#1AH
MOV R2,#4D
PP: MOV R3,#8D
JJJJ: JNB P3.2,$
ACALL YS1
MOV C,P3.2
JNC UUU
JB P3.2,$
UUU: MOV A,@R1
RRC A
MOV @R1,A
DJNZ R3,JJJJ
INC R1
DJNZ R2,PP
-------------------------------------
MOV A,1AH
XRL A,#40h 判断1AH的值是否等于遥控器低8位地址(40h)
JNZ EXIT
MOV A,1bH
XRL A,#0bfh 再判断高8位地址是否正确(0bfh)
JNZ EXIT
MOV A,1CH
CPL A
XRL A,1DH 将1CH的值取反后和1DH比较 不同则无效丢弃(核对数据是否准确)
JNZ EXIT
ACALL DO 相应按键的处理
EXIT: SETB EA
POP 03H
POP 02H
POP DPL
POP DPH
POP PSW
POP ACC
RETI
--------------------delay-----------------------
YS1: MOV 70H,#16D 延时1
D1: MOV 71H,#21D
DJNZ 71H,$
DJNZ 70H,D1
RET
YS2: MOV 70H,#09D 延时2
D2: MOV 71H,#220D
DJNZ 71H,$
DJNZ 70H,D2
RET
---------------------------------------------------------
TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H TAB1 LED数码管显示表 TAB遥控器键值表(未用)
TAB1: DB 3FH,11H,5EH,5BH,71H,6BH,6FH,19H,7FH,7bH,77H,7CH,39H,5EH,79H,71H
tab1: DB 0C0H,0F9H,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0a7h,0a1h,86h,8EH
TAB2: DB 0c0H,0f9H,64H,70H,59H,52H,42H 倒装LED段码表
0CH 为设置标志,0DH为全显示标志,0EH为显示设置小时标志,0FH为显示设置分标志
10H 为显示设置闹时标志,11H为显示设置闹分标志
增加闹时静音功能
mute-10h,timer-0eh,left-46h,right-47h,up-19h,down-1dh
D MOV A,1CH
CJNE A,#TIMERT,REDO 代码不是设置/退出键
JNB 0CH,SET1 是,则进入
CLR 0CH 是,已经进入,则退出
SETB 0DH 恢复正常显示
CLR 0EH
CLR 0FH
CLR 10H
CLR 11H
RET
SET1: SETB 0CH
SETB 0EH
CLR 0DH
CLR 0FH
CLR 10H
CLR 11H
RET
RED CJNE A,#MUTEM,REDO1 不是设置键的处理REDO1,2,3,4...
LJMP MUTE MUTE?
REDO1: CJNE A,#D_OFF,DO_SET2
LJMP DIS_OFF 关闭显示
DO_SET2:JB 0CH,SET2 时间设置的处理
RET
SET2: CJNE A,#UPU,SET2A
LJMP INC1 +加(^)
SET2A: CJNE A,#DOWND,SET2B
LJMP DEC2 - 减
SET2B: CJNE A,#RIGHTR,SET2C
LJMP RIGHT RIGHT右移(>)
SET2C: CJNE A,#LEFTL,SET2D LJMP LEFT LEFT左移(<)
SET2D: CJNE A,#RECALL,SET2EXT DS1302初始化
LJMP SET1302
SET2EXT:RET
--------------------------------INC------------------------
INC1: JB 0EH,INCH
JB 0FH,INCM
JB 10H,INC_H
JB 11H,INC_M
RET
INC_H: INC 6BH 闹钟小时增加
MOV A,6BH
CJNE A,#24D,INCH3
MOV 6BH,#0
INCH3: MOV R1,#0C2H
MOV R0,6BH
ACALL SETONE 写入DS1302
RET
INC_M: INC 6AH 闹钟分增加
MOV A,6AH
CJNE A,#60D,INCH4
MOV 6AH,#0
INCH4: MOV R1,#0C0H
MOV R0,6AH
ACALL SETONE
RET
INCH: INC 62H
MOV 6FH,62H
ACALL BCD_HEX
INC A
CJNE A,#24D,INCH1
MOV A,#0
INCH1: MOV 6FH,A
ACALL HEX_BCD
MOV 62H,A
MOV R1,#84H
MOV R0,62H
ACALL SETONE
RET
INCM: INC 61H
MOV 6FH,61H
ACALL BCD_HEX
INC A
CJNE A,#60D,INCH2
MOV A,#0
INCH2: MOV 6FH,A
ACALL HEX_BCD
MOV 61H,A
MOV R1,#82H
MOV R0,61H
ACALL SETONE
RET
----------------------------------DEC----------------------
DEC2: JB 0EH,DECH
JB 0FH,DECM
JB 10H,DEC_H
JB 11H,DEC_M
RET
DECH: MOV 6FH,62H
ACALL BCD_HEX
DEC A
CJNE A,#0FFH,DECH1
MOV A,#23
DECH1: MOV 6FH,A
ACALL HEX_BCD
MOV 62H,A
MOV R1,#84H
MOV R0,62H
ACALL SETONE
RET
DECM: MOV 6FH,61H
ACALL BCD_HEX
DEC A
CJNE A,#0FFH,DECM1
MOV A,#59
DECM1: MOV 6FH,A
ACALL HEX_BCD
MOV 61H,A
MOV R1,#82H
MOV R0,61H
ACALL SETONE
RET
DEC_H: DEC 6BH
MOV A,6BH
CJNE A,#0FFH,DECH3
MOV 6BH,#23D
DECH3: MOV R1,#0C2H
MOV R0,6BH
ACALL SETONE
RET
DEC_M: DEC 6AH
MOV A,6AH
CJNE A,#0FFH,DECH4
MOV 6AH,#59D
DECH4: MOV R1,#0C0H
MOV R0,6AH
ACALL SETONE
RET
--------------------------------RIGHT----------------------
RIGHT: JB 0EH,RIGHT1
JB 0FH,RIGHT2
JB 10H,RIGHT3
JB 11H,RIGHT4
RET 右移
RIGHT1: CLR 0EH
SETB 0FH
RET
RIGHT2: CLR 0FH
SETB 10H
RET
RIGHT3: CLR 10H
SETB 11H
RET
RIGHT4: CLR 11H
SETB 0EH
RET
--------------------------------LEFT-----------------------
LEFT: JB 0EH,LEFT1
JB 0FH,LEFT2
JB 10H,LEFT3
JB 11H,LEFT4
RET 左移
LEFT1: SETB 11H
CLR 0EH
RET
LEFT2: SETB 0EH
CLR 0FH
RET
LEFT3: SETB 0FH
CLR 10H
RET
LEFT4: SETB 10H
CLR 11H
RET
------------------------------MUTE--------------
MUTE: setb k_ON
CPL 06H 静音
CLR 08H
RET
-----------------------------DISPLAY OFF--------
DIS_OFF:CLR ET1
CPL 05H
JNB 05H,REDORE
SETB ET1
REDORE: RET
------------------------------------初始化1302
SET1302: CLR RST 2002年1月1日12:00:00
CLR LED3CLK
MOV SECOND,#0
MOV 61H,#0
MOV 62H,#18
MOV 63H,#1
MOV 64H,#1
MOV 65H,#1
MOV 66H,#2
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#00H
LCALL R_BIT
SETB LED3CLK
CLR RST
MOV R0,#SECOND
MOV R7,#7
MOV R1,#80H
SET1302A:CLR RST
CLR LED3CLK
SETB RST
MOV A,R1
LCALL R_BIT
MOV A,@R0
LCALL R_BIT
INC R0
INC R1
INC R1
SETB LED3CLK
CLR RST
DJNZ R7,SET1302A
CLR RST
CLR LED3CLK
sETB LED3CLK
nop
CLR RST
nop
clr led3clk
SETB RST
MOV A,#90H
LCALL R_BIT
MOV A,#10100101B 充电器设置
LCALL R_BIT
SETB LED3CLK
CLR RST
CLR LED3CLK
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#80H
LCALL R_BIT
SETB LED3CLK
CLR RST
RET
----------------------读取一RAM ------
T_6061: CLR RST
CLR LED3CLK
SETB RST
MOV A,R1
LCALL R_BIT
LCALL W_BIT
SETB LED3CLK
CLR RST
RET
-----------------------------
R_1302: MOV R0,#SECOND
MOV R7,#7
MOV R1,#81H
R_1302A: CLR RST
CLR LED3CLK
SETB RST
MOV A,R1
LCALL R_BIT
LCALL W_BIT
MOV @R0,A
INC R0
INC R1
INC R1
SETB LED3CLK
CLR RST
DJNZ R7,R_1302A
RET
------------------R_BIT------------------
R_BIT: MOV R4,#8
R_BIT1: RRC A
MOV LED4IO,C
SETB LED3CLK
CLR LED3CLK
DJNZ R4,R_BIT1
RET
-------------------W_BIT-----------------------
W_BIT: MOV R4,#8
W_BIT1: MOV C,LED4IO
RRC A
SETB LED3CLK
CLR LED3CLK
DJNZ R4,W_BIT1
RET
--------------------------------------------------
BCD_HEX:
MOV A,6FH
ANL A,#0FH
MOV B,A
MOV A,6FH
MOV 6FH,B
SWAP A
ANL A,#0FH
MOV B,#0AH
MUL AB
ADD A,6FH
MOV 6FH,A
RET
HEX_BCD:
MOV A,6FH
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV 6FH,A
RET
-----写一地址---R1 为地址,R0 为数据----------
SETONE: CLR LED3CLK
CLR RST
CLR LED3CLK
NOP
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#00H
LCALL R_BIT
SETB LED3CLK
CLR RST
CLR LED3CLK
NOP
CLR RST
CLR LED3CLK
SETB RST
MOV A,R1
LCALL R_BIT
MOV A,R0
LCALL R_BIT
NOP
SETB LED3CLK
CLR RST
NOP
NOP
CLR RST
CLR LED3CLK
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#80H
LCALL R_BIT
SETB LED3CLK
CLR RST
RET
基于c8051f020单片机最小系统的实时时钟显示程序c8051f020 FYD12864-0402B LCD显示,按键电子时钟//
#include <c8051f020.h>
#include<lcd.h>
#include <intrins.h>
#define uchar unsigned char
void lcd_ini()
void DISPInitial()
void ascii_change(void)
void delay()
void wri_add(uchar com)
void wri_dat(uchar com1)
void shan(void)
void disp()
void tkey(void)
void PORT_Init (void)
sbit cs=P1^7
sbit sid=P1^6
sbit sclk=P1^5
bit flag=1
uchar dat,count,f=1//f测试哪个单元为当前闪烁状态
uchar data clock[3]={24,00,00}
uchar code clockname[10]={"北京时间:"}
uchar data num[6]
/*******主程序*************/
void main()
{
lcd_ini()
count=10//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒
TMOD=0x01
TL0=0XB0
TH0=0X3C
EA=1
ET0=1
IT0=1
EX0=1
TR0=1
while(1)
{
back:ascii_change()
disp()
delay()
if(flag==1)
goto back
tkey()
shan()
delay()
}
}
/****lcd初始化*******/
/*void lcd_ini()
{
wri_add(0x30)
delay()
wri_add(0x0c)
delay()
wri_add(0x01)
delay()
wri_add(0x06)
delay()
}*/
void PORT_Init (void)
{
XBR0= 0x00//不让他连上IO口
XBR1= 0x14 //允许外部中断连在端口上
XBR2= 0x40// Enable crossbar and weak pull-ups
P0MDOUT |= 0x00 // enable TX0 as a push-pull output
// P1MDOUT |= 0x07 // enable P1.6 (LED) as push-pull output
P2MDOUT=0xfe //为了驱动步进电机的控制线
//P3MDOUT = 0xFF
P74OUT=0x00//配置成漏极方式可以让LCD显示成功 ,我试了配置成推挽方式不能正常显示
}
/********定时程序*************/
void timer1() interrupt 1 using 2
{
TL0=0XB0
TH0=0X3C
count--
if(count==0)
{
count=10
clock[2]++//秒//
}
else
goto out
if(clock[2]==60)
{
clock[2]=0
clock[1]++//分//
}
if(clock[1]==60)
{
clock[1]=0
clock[0]++
}
if(clock[0]==24)//时//
clock[0]=0
out:_nop_()
}
/*******十位个位转换成ASCII码************/
void ascii_change(void)
{
num[5]=clock[2]-(clock[2]/10)*10+0x30
num[4]=clock[2]/10+0x30
num[3]=clock[1]-(clock[1]/10)*10+0x30
num[2]=clock[1]/10+0x30
num[1]=clock[0]-(clock[0]/10)*10+0x30
num[0]=clock[0]/10+0x30
}
/********廷时程序*************/
void delay()
{
uchar i,j
for (i=250i>0i--)
for (j=250j>0j--)
}
/*****Write address*********/
void wri_add(uchar com)
{
uchar i,j,k
cs=0
cs=1
dat=0xf8
for(i=1i<=8i++)
{
sid=(bit)(dat&0x80)
sclk=0
sclk=1
sclk=0
dat=dat<<1
}
dat=com
dat=dat&0xf0
for(j=1j<=8j++)
{
sid=(bit)(dat&0x80)
sclk=0
sclk=1
sclk=0
dat=dat<<1
}
dat=com
dat=_cror_(dat,4)// 此为高低四位交换
dat=dat&0xf0
for(k=1k<=8k++)
{
sid=(bit)(dat&0x80)
sclk=0
sclk=1
sclk=0
dat=dat<<1
}
}
/*********Write data*************/
void wri_dat(uchar com1)
{
uchar i,j,k
cs=0
cs=1
dat=0xfa
for(i=1i<=8i++)
{
sid=(bit)(dat&0x80)
sclk=0
sclk=1
sclk=0
dat=dat<<1
}
dat=com1
dat=dat&0xf0
for(j=1j<=8j++)
{
sid=(bit)(dat&0x80)
sclk=0
sclk=1
sclk=0
dat=dat<<1
}
dat=com1
dat=_cror_(dat,4)// 此为高低四位交换
dat=dat&0xf0
for(k=1k<=8k++)
{
sid=(bit)(dat&0x80)
sclk=0
sclk=1
sclk=0
dat=dat<<1
}
}
/******display program***********/ //显示时间
void disp()
{
uchar i,k=0
wri_add(0x80)
for (i=1i<=9i++)
wri_dat(clockname[i-1])
wri_add(0x90)
for (i=1i<=6i++)
{
k++
if(k==3||k==5)
wri_dat(clockname[8])//时间之间的冒号。
wri_dat(num[i-1])
}
}
/*******闪烁程序*************************/
void shan(void)
{
uchar i,k=0
wri_add(0x90)
if(f==1)
{
num[0]=' '
num[1]=' '
}
else
goto next
for (i=1i<=6i++)
{
k++
if(k==3||k==5)
wri_dat(clockname[8])//时间之间的冒号。
wri_dat(num[i-1])
}
goto return1
next: if(f==2)
{
num[2]=' '
num[3]=' '
}
else
goto next1
for (i=1i<=6i++)
{
k++
if(k==3||k==5)
wri_dat(clockname[8])//时间之间的冒号。
wri_dat(num[i-1])
}
goto return1
next1: if(f==3)
{
num[4]=' '
num[5]=' '
}
else
goto return1
for (i=1i<=6i++)
{
k++
if(k==3||k==5)
wri_dat(clockname[8])//时间之间的冒号。
wri_dat(num[i-1])
}
return1:_nop_()
}
/*******外部中断***********/
void intr0() interrupt 0 using 2
{
flag=~flag//判断是否闪烁位//
TR0=~TR0//闪关定时否则开定时
f=1
}
/**********按键程序************/
void tkey(void)
{
uchar judcekey
judcekey=P1&0x0f
if(judcekey==0x0f)
goto return2
/*******移位键*********/
if (judcekey==0x0e)
f++
if (f==4)
f=1
/**********加一键*********/
if(judcekey==0x0d)
{clock[f-1]++}
if (f==1)
{ if (clock[f-1]==24){
clock[f-1]=0}
}
else{ if (clock[f-1]==60)
clock[f-1]=0
}
/******减一键***********/
if(judcekey==0x0b)
{clock[f-1]--}
if (f==1)
{ if (clock[f-1]==0xff){
clock[f-1]=23}
}
else
{ if (clock[f-1]==0xff)
clock[f-1]=59
}
return2:_nop_()
}
//本程序已经调试成功并能够正确执行
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)