求单片机程序:汇编语言数字钟

求单片机程序:汇编语言数字钟,第1张

用DS1302+单片机比较简单 DS1302程序(51汇编)

推荐

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_()

}

//本程序已经调试成功并能够正确执行


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11072193.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存