电子日历时钟程序设计(汇编语言)

电子日历时钟程序设计(汇编语言),第1张

CD BIT P12;用于液晶

W BIT P36

R BIT P37

CE BIT P17

DATA1 EQU 43H;第一参数

DATA2 EQU 44H;第二参数

COM EQU 45H;命令寄存器

;

ORG 0000H

jmp MAIN

ORG 0100H

;

MAIN:

;;;;;;;;;;;;;;;;;;;液晶初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOV COM,#80H ;SET or 模式命令

LCALL WRITEDATA3

NOP

MOV DATA1,#00H ;SET TEXT HOME AREA ADDRESS 1000H

MOV DATA2,#10H

MOV COM,#40H

LCALL WRITEDATA

NOP

MOV DATA1,#1EH ;SET TEXT AREA ADDRESS 001EH

MOV DATA2,#00H

MOV COM,#41H

LCALL WRITEDATA

NOP

MOV DATA1,#00H ;SET GRAPHIC HOME AREA ADDRESS 2000H

MOV DATA2,#20H

MOV COM,#42H

LCALL WRITEDATA

NOP

MOV DATA1,#1EH ;SET GRAPHIC AREA ADDRESS 001EH

MOV DATA2,00H

MOV COM,#43H

LCALL WRITEDATA

NOP

MOV DATA1,#0FH ;SET OFFSET REGISTER 000FH

MOV DATA2,#00H

MOV COM,#22H

LCALL WRITEDATA

NOP

MOV DATA1,#00H ;SET ADDRESS POINTER 7C00H

MOV DATA2,#7CH

MOV COM,#24H

LCALL WRITEDATA

NOP

MOV COM,#9CH ;SET TEXT ON,GRAPHIC ON

LCALL WRITEDATA3

NOP

;

ORG 0000H ;程序执行开始地址

LJMP START ;跳到标号START执行

ORG 0003H ;外中断0中断程序入口

LJMP REMO ;外中断0中断返回

ORG 000BH ;定时器T0中断程序入口

LJMP TIME0 ;跳至INTTO执行

ORG 0013H ;外中断1中断程序入口

RETI ;外中断1中断返回

ORG 001BH ;定时器T1中断程序入口

LJMP TIME1 ;跳至TIME1执行

ORG 0023H ;串行中断程序入口地址

RETI ;串行中断程序返回

;

TIME1: RETI

;

TIMEADD EQU 30H;30H做为软件计数缓存

DISP1 EQU 31H;31H做为第一位显示缓存

DISP2 EQU 32H;32H做为第二位显示缓存

DISP3 EQU 33H;33H做为第三位显示缓存

DISP4 EQU 34H;34H做为第四位显示缓存

SECLED EQU P10;秒点显示P10

HALFSEC EQU 35H;半秒计数缓存

UPKEY BIT P27;定义P27是UP键

SETKEY BIT P20;定义P20是SET键

BUZZ BIT P25;

;

;第1位使能P21

;第2位使能P22

;第3位使能P23

;第4位使能P24

;

ORG 0030H;

;

START:

MOV SP,#5FH;放堆栈

MOV P2,#0FFH;把P2置高

CLR P25;把p25置0

LCALL BUZZER;发出滴声

LCALL BUZZER;按键滴声

MOV TIMEADD,#0;软件计数器清零

MOV TMOD,#11H;TIME0工作于方式1,TIME1工作于方式1

MOV TH0,#3CH;

MOV TL0,#0B0H;放定时预置数15536

MOV IE,#8BH;开INT0,TIME0,TIME1

MOV IP,#02H;TIME0中断优先

SETB IT0;外部中断0为负跳变方式触发

SETB TR0;开始计数

MOV DISP1,#00H;

MOV DISP2,#00H;

MOV DISP3,#00H;

MOV DISP4,#00H;把所有显示缓存清零

MOV HALFSEC,#00H;把半秒计数缓存清零

MOV DPTR,#TAB;

SCAN:

MOV A,DISP1;把第一位显示缓存送入A

MOVC A,@A+DPTR;查表

SETB P24;

CLR P21;第一位显示使能

MOV P0,A;查表得到的7段码送给P0去显示

LCALL DELAY;延时

MOV P0,#0FFH;显示一小段时间后关掉7段显示,去显示下一位

MOV A,DISP2;

MOVC A,@A+DPTR;

SETB P21;

CLR P22;

MOV P0,A;

LCALL DELAY;

MOV P0,#0FFH;

MOV A,DISP3;

MOVC A,@A+DPTR;

SETB P22;

CLR P23;

MOV P0,A;

LCALL DELAY;

MOV P0,#0FFH;

MOV A,DISP4;

MOVC A,@A+DPTR;

SETB P23;

CLR P24;

MOV P0,A;

LCALL DELAY;

MOV P0,#0FFH;

JNB SETKEY,ADJUST;按键按下时去调整时间

;以下是进位程序

MOV A,DISP1;把第一位缓存送入A

CJNE A,#10,SCAN;如果第一位不等于10继续扫描

MOV DISP1,#00H;如果第一位等于10了就把第一位清零

INC DISP2;第二位加1

MOV A,DISP2;

CJNE A,#6,SCAN;如果第二位不等于6继续扫描

MOV DISP2,#00H;

INC DISP3;

MOV A,DISP4;

CJNE A,#2,PM;

MOV A,DISP3;

CJNE A,#4,SCAN;

MOV DISP3,#00H;

AJMP DIS4;

PM:

MOV A,DISP3;

CJNE A,#10,SCAN;

MOV DISP3,#00H;

DIS4:

INC DISP4;

MOV A,DISP4;

CJNE A,#3,SCAN;

MOV DISP4,#00H;

AJMP SCAN;

;

DELAY: ;延时子程序

MOV R7,#2

NOP

D1: MOV R6,#2

DJNZ R6,$

DJNZ R7,D1

RET

;

TAB: DB 88H,0EBH,91H,0A1H,0E2H,0A4H,84H,0E9H,80H,0A0H,0C0H,86H,9CH,83H,94H,0D4H,0FFH

;

;

;

;

;下面程序为设置时间用

ADJUST:

LCALL ADJDELAY;

JB SETKEY,SET1;

LCALL BUZZER;按键滴声

JNB SETKEY,$

CLR TR0; 暂时关闭计时

ADJ4:

SETB P21;

CLR P24;

MOV A,DISP4;

MOVC A,@A+DPTR;

MOV P0,A;显示第四位

JNB SETKEY,ADJ8;如果设置键有动作去调节第3位

JB UPKEY,ADJ4;加键是否按下

LCALL ADJDELAY;

JB UPKEY,ADJ4;延时后再检查加键是否按下

LCALL BUZZER;按键滴声

JNB UPKEY,$;等待加键松开

INC DISP4;第四位加1

MOV A,DISP4;

CJNE A,#3,ADJ4;第四位不等于3转移

MOV DISP4,#00H;第四位等于3清零

AJMP ADJ4;再去显示第四位

ADJ8:

LCALL ADJDELAY;

JB SETKEY,ADJ4;

LCALL BUZZER;按键滴声

JNB SETKEY,$;

ADJ3:

SETB P24;

CLR P23;

MOV A,DISP3;

MOVC A,@A+DPTR;

MOV P0,A;显示第三位

JNB SETKEY,ADJ7;

JB UPKEY,ADJ3;

LCALL ADJDELAY;

JB UPKEY,ADJ3;

LCALL BUZZER;按键滴声

JNB UPKEY,$;

INC DISP3;第3位加1

MOV A,DISP4;

CJNE A,#2,PM1;

MOV A,DISP3;

CJNE A,#4,ADJ3;第3位不等于4转移

MOV DISP3,#00H;第四位等于3清零

AJMP ADJ3;再去显示第四位

PM1:

MOV A,DISP3;

CJNE A,#10,ADJ3;

MOV DISP3,#00H;

AJMP ADJ3;

SET1:

LCALL BUZZER;按键滴声

LCALL BUZZER;按键滴声

JNB SETKEY,$;

NOP;

MOV HALFSEC,#00H;清零秒针

SETB TR0;

LJMP SCAN;

ADJ7:

LCALL ADJDELAY;

JB SETKEY,ADJ3;

LCALL BUZZER;按键滴声

JNB SETKEY,$;

ADJ2:

SETB P23;

CLR P22;

MOV A,DISP2;

MOVC A,@A+DPTR;

MOV P0,A;显示第二位

JNB SETKEY,ADJ6;

JB UPKEY,ADJ2;

LCALL ADJDELAY;

JB UPKEY,ADJ2;

LCALL BUZZER;按键滴声

JNB UPKEY,$;

INC DISP2;第2位加1

MOV A,DISP2;

CJNE A,#6,ADJ2;第2位不等于6转移

MOV DISP2,#00H;第2位等于6清零

AJMP ADJ2;再去显示第2位

ADJ6:

LCALL ADJDELAY;

JB SETKEY,ADJ2;

LCALL BUZZER;按键滴声

JNB SETKEY,$;

ADJ1:

SETB P22;

CLR P21;

MOV A,DISP1;

MOVC A,@A+DPTR;

MOV P0,A;显示第一位

JNB SETKEY,ADJ5;如果SET键有动作转去抖

JB UPKEY,ADJ1;

LCALL ADJDELAY;

JB UPKEY,ADJ1;

LCALL BUZZER;按键滴声

JNB UPKEY,$;

INC DISP1;第1位加1

MOV A,DISP1;

CJNE A,#10,ADJ1;第1位不等于10转移

MOV DISP1,#00H;第1位等于10清零

AJMP ADJ1;再去显示第1位

ADJ5:

LCALL ADJDELAY;

JB SETKEY,ADJ1;

AJMP SET1;

ADJDELAY:;是不是延时40MS

MOV R7,#200

D3: MOV R6,#100

DJNZ R6,$

DJNZ R7,D3

RET

BUZZER: MOV R6,255;蜂鸣子程序

BUZZ1: CPL BUZZ;

MOV R7,#80;

DJNZ R7,$;

DJNZ R6,BUZZ1;

CLR BUZZ;

RET

;以上为设置时间用

;

REMO:

RETI;

;

;

;

TIME0:; TIME0中断处理程序

MOV TH0,#3CH;

MOV TL0,#0B6H;重新放定时预置数15542,用预置数较正时间。

PUSH ACC;机器周期2

PUSH PSW;机器周期2

INC TIMEADD;软件计数器加1,机器周期1

MOV A,TIMEADD;加1后送给A,机器周期1

CJNE A,#10,T_RET;如果A不等于10跳到T_RET,机器周期2

CPL SECLED;取反秒点LED,软件计数器计时半秒,机器周期1

MOV TIMEADD,#00H;软件计数器清零,机器周期1

INC HALFSEC;秒加1,机器周期1

MOV A,HALFSEC;机器周期1

CJNE A,#120,T_RET;把秒针缓存和120比较,不等跳转T_RET,机器周期2

INC DISP1;第一位显示加1,机器周期1

MOV HALFSEC,#00H;清零秒针,机器周期1

T_RET:

POP PSW

POP ACC

RETI

END

我以前做的一个6位数码管的时钟程序,你可以看看,其实6位足够了。

KEYVAL EQU 30H

KEYTM EQU 31H

KEYSCAN EQU 32H

DAT EQU 33H

SCANLED EQU 39H

CLK EQU 77H

SEC EQU 78H

MIN EQU 79H

HOUR EQU 7AH

PAUSE BIT 00H

DOT BIT 01H

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR ;50ms定时

ORG 001BH

LJMP T1ISR ;扫描显示

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#11H

MOV TH0,#03CH

MOV TL0,#0B0H

MOV TH1,#0ECH

MOV TL1,#078H

MOV KEYVAL,#0

MOV SCANLED,#0

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV 37H,#10H

MOV 38H,#10H

MOV SEC,#0

MOV MIN,#0

MOV HOUR,#0

MOV CLK,#0

CLR PAUSE

SETB EA

SETB ET1

SETB TR1

LOOP:

LCALL KEYSEL

MOV A,KEYVAL

CJNE A,#0FFH,LOOP1

SJMP LOOP

LOOP1:

CJNE A,#10,LOOP2 ;“ON”启动

SETB TR0

SETB ET0

SETB PAUSE

SJMP LOOP

LOOP2:

CJNE A,#11,LOOP3 ;“=”清零

MOV SEC,#0

MOV MIN,#0

MOV HOUR,#0

LCALL DISCHG

SJMP LOOP

LOOP3:

CJNE A,#15,LOOP4 ;“+”暂停

CLR TR0

CLR ET0

CLR PAUSE

SJMP LOOP

LOOP4:

CJNE A,#14,LOOP5 ;“-”清显示暂停

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV 37H,#10H

MOV 38H,#10H

CLR TR0

CLR ET0

CLR PAUSE

SJMP LOOP

LOOP5:

CJNE A,#10,LOOP6 ;数字键

LOOP6:

JC LOOP7

LJMP LOOP

LOOP7:

JNB PAUSE,LOOP8 ;暂停状态可以输入数字键

LJMP LOOP

LOOP8:

MOV 33H,34H

MOV 34H,35H

MOV 35H,36H

MOV 36H,37H

MOV 37H,38H

MOV 38H,KEYVAL

MOV A,33H

SWAP A

ORL A,34H

LCALL BCDH

MOV HOUR,A

MOV A,35H

SWAP A

ORL A,36H

LCALL BCDH

MOV MIN,A

MOV A,37H

SWAP A

ORL A,38H

LCALL BCDH

MOV SEC,A

LJMP LOOP

;------------------

;BCD转换为十六进制

BCDH:

MOV B,#10H

DIV AB

MOV R7,B

MOV B,#10

MUL AB

ADD A,R7

RET

;------------------

;十六进制转换为BCD

HBCD:

MOV B,#10

DIV AB

SWAP A

ORL A,B

RET

;------------------

KEYSEL:

MOV KEYVAL,#0

MOV KEYSCAN,#0EFH

LCALL GETKEY

MOV A,KEYTM

JZ KEYS1

MOV KEYVAL,A

SJMP KEYRTN

KEYS1:

MOV KEYSCAN,#0DFH

LCALL GETKEY

MOV A,KEYTM

JZ KEYS2

CLR C

ADD A,#4

MOV KEYVAL,A

SJMP KEYRTN

KEYS2:

MOV KEYSCAN,#0BFH

LCALL GETKEY

MOV A,KEYTM

JZ KEYS3

CLR C

ADD A,#8

MOV KEYVAL,A

SJMP KEYRTN

KEYS3:

MOV KEYSCAN,#7FH

LCALL GETKEY

MOV A,KEYTM

JZ KEYRTN

CLR C

ADD A,#12

MOV KEYVAL,A

KEYRTN:

LCALL CHGKEY

RET

;--------------------

GETKEY:

MOV KEYTM,#0

MOV A,KEYSCAN

MOV P3,A

NOP

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY

MOV R2,#10

LCALL DELAY

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY

MOV A,P3

ANL A,#0FH

MOV R7,A

SF:

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ SF

MOV A,R7

CJNE A,#0EH,NK1

MOV KEYTM,#1

SJMP NOKEY

NK1:

CJNE A,#0DH,NK2

MOV KEYTM,#2

SJMP NOKEY

NK2:

CJNE A,#0BH,NK3

MOV KEYTM,#3

SJMP NOKEY

NK3:

CJNE A,#07H,NOKEY

MOV KEYTM,#4

NOKEY: RET

;--------------------

DELAY:

MOV R3,#50

DELAY1:

MOV R4,#100

DJNZ R4,$

DJNZ R3,DELAY1

DJNZ R2,DELAY

RET

;--------------------

T0ISR:

PUSH ACC

CLR TR0

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

INC CLK

MOV A,CLK

CJNE A,#20,T0ISRE

MOV CLK,#0

INC SEC

MOV A,SEC

CJNE A,#60,T0ISRE

MOV SEC,#0

INC MIN

MOV A,MIN

CJNE A,#60,T0ISRE

MOV MIN,#0

INC HOUR

MOV A,HOUR

CJNE A,#24,T0ISRE

MOV SEC,#0

MOV MIN,#0

MOV HOUR,#0

T0ISRE:

LCALL DISCHG

POP ACC

RETI

;--------------------

DISCHG:

MOV A,HOUR

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 34H,A

POP ACC

ANL A,#0F0H

SWAP A

MOV 33H,A

MOV A,MIN

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 36H,A

POP ACC

ANL A,#0F0H

SWAP A

MOV 35H,A

MOV A,SEC

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 38H,A

POP ACC

ANL A,#0F0H

SWAP A

MOV 37H,A

RET

;--------------------

T1ISR:

PUSH ACC

CLR TR1

MOV TH1,#0ECH

MOV TL1,#78H

SETB TR1

MOV DPTR,#LEDTAB

T100:

MOV R0,#DAT

MOV A,SCANLED

ADD A,R0

MOV R0,A

MOV A,SCANLED

JNZ T101

MOV P2,#01H

CLR DOT

SJMP T1DIS

T101:

DEC A

JNZ T102

MOV P2,#02H

SETB DOT

SJMP T1DIS

T102:

DEC A

JNZ T103

MOV P2,#04H

CLR DOT

SJMP T1DIS

T103:

DEC A

JNZ T104

MOV P2,#08H

SETB DOT

SJMP T1DIS

T104:

DEC A

JNZ T105

MOV P2,#10H

CLR DOT

SJMP T1DIS

T105:

MOV P2,#20H

CLR DOT

T1DIS:

MOV A,@R0

MOVC A,@A+DPTR

JNB DOT,T1DIS1

ORL A,#01H

T1DIS1:

CPL A

MOV P0,A

INC SCANLED

MOV A,SCANLED

CJNE A,#6,T1END

MOV SCANLED,#0

T1END:

POP ACC

RETI

;--------------------

CHGKEY:

MOV A,KEYVAL

JZ KV16

DEC A

JNZ KV01

MOV KEYVAL,#7

RET

KV01:

DEC A

JNZ KV02

MOV KEYVAL,#4

RET

KV02:

DEC A

JNZ KV03

MOV KEYVAL,#1

RET

KV03:

DEC A

JNZ KV04

MOV KEYVAL,#10

RET

KV04:

DEC A

JNZ KV05

MOV KEYVAL,#8

RET

KV05:

DEC A

JNZ KV06

MOV KEYVAL,#5

RET

KV06:

DEC A

JNZ KV07

MOV KEYVAL,#2

RET

KV07:

DEC A

JNZ KV08

MOV KEYVAL,#0

RET

KV08:

DEC A

JNZ KV09

MOV KEYVAL,#9

RET

KV09:

DEC A

JNZ KV10

MOV KEYVAL,#6

RET

KV10:

DEC A

JNZ KV11

MOV KEYVAL,#3

RET

KV11:

DEC A

JNZ KV12

MOV KEYVAL,#11

RET

KV12:

DEC A

JNZ KV13

MOV KEYVAL,#12

RET

KV13:

DEC A

JNZ KV14

MOV KEYVAL,#13

RET

KV14:

DEC A

JNZ KV15

MOV KEYVAL,#14

RET

KV15:

DEC A

JNZ KV16

MOV KEYVAL,#15

RET

KV16:

MOV KEYVAL,#0FFH

RET

;--------------------

LEDTAB: DB 0FCH ;"0" 00H

DB 60H ;"1" 01H

DB 0DAH ;"2" 02H

DB 0F2H ;"3" 03H

DB 66H ;"4" 04H

DB 0B6H ;"5" 05H

DB 0BEH ;"6" 06H

DB 0E0H ;"7" 07H

DB 0FEH ;"8" 08H

DB 0F6H ;"9" 09H

DB 0EEH ;"A" 0AH

DB 3EH ;"B" 0BH

DB 9CH ;"C" 0CH

DB 7AH ;"D" 0DH

DB 9EH ;"E" 0EH

DB 8EH ;"F" 0FH

DB 00H ;" " 10H

;--------------------

END

自己写了一个时钟程序,用来模拟时间类型软件的破解,先从基础的运行时间开始,程序运行界面如图:十秒后程序自动退出

十秒后程序自动退出

破解思路:查看程序导入表函数(有N多个程序可以查看,以PETOOLS为例),如图所示:输入表目录

只找到一个和时间有关的函数GetSystemTimeAsFileTime。我们可以通过od自带的api断点,去断下GetSystemTimeAsFileTime这个函数,

Enter进入,在系统领空下段,运行程序,会断在这个函数的系统领空,之后ctrl+F9执行到返回到,call GetSystemTimeAsFileTime的调用,再ctrl+F9执行到返回,来到如下关键代码处:

可见通过上面call函数clock的调用,返回值去和10比较,来判断程序运行的时间,修改跳转或者修改A的值即可实现破解。

用这个程序吧 C和汇编都有。

数字钟[★]

1. 实验任务

(1. 开机时,显示12:00:00的时间开始计时;

(2. P00/AD0控制“秒”的调整,每按一次加1秒;

(3. P01/AD1控制“分”的调整,每按一次加1分;

(4. P02/AD2控制“时”的调整,每按一次加1个小时;

2. 电路原理图

图4201

3. 系统板上硬件连线

(1. 把“单片机系统”区域中的P10-P17端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;

(2. 把“单片机系统:区域中的P30-P37端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;

(3. 把“单片机系统”区域中的P00/AD0、P01/AD1、P02/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;

4. 相关基本知识

(1. 动态数码显示的方法

(2. 独立式按键识别过程

(3. “时”,“分”,“秒”数据送出显示处理方法

5. 程序框图

6. 汇编源程序

SECOND EQU 30H

MINITE EQU 31H

HOUR EQU 32H

HOURK BIT P00

MINITEK BIT P01

SECONDK BIT P02

DISPBUF EQU 40H

DISPBIT EQU 48H

T2SCNTA EQU 49H

T2SCNTB EQU 4AH

TEMP EQU 4BH

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV SECOND,#00H

MOV MINITE,#00H

MOV HOUR,#12

MOV DISPBIT,#00H

MOV T2SCNTA,#00H

MOV T2SCNTB,#00H

MOV TEMP,#0FEH

LCALL DISP

MOV TMOD,#01H

MOV TH0,#(65536-2000) / 256

MOV TL0,#(65536-2000) MOD 256

SETB TR0

SETB ET0

SETB EA

WT: JB SECONDK,NK1

LCALL DELY10MS

JB SECONDK,NK1

INC SECOND

MOV A,SECOND

CJNE A,#60,NS60

MOV SECOND,#00H

NS60: LCALL DISP

JNB SECONDK,$

NK1: JB MINITEK,NK2

LCALL DELY10MS

JB MINITEK,NK2

INC MINITE

MOV A,MINITE

CJNE A,#60,NM60

MOV MINITE,#00H

NM60: LCALL DISP

JNB MINITEK,$

NK2: JB HOURK,NK3

LCALL DELY10MS

JB HOURK,NK3

INC HOUR

MOV A,HOUR

CJNE A,#24,NH24

MOV HOUR,#00H

NH24: LCALL DISP

JNB HOURK,$

NK3: LJMP WT

DELY10MS:

MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

DISP:

MOV A,#DISPBUF

ADD A,#8

DEC A

MOV R1,A

MOV A,HOUR

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

MOV A,#10

MOV@R1,A

DEC R1

MOV A,MINITE

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

MOV A,#10

MOV@R1,A

DEC R1

MOV A,SECOND

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

RET

INT_T0:

MOV TH0,#(65536-2000) / 256

MOV TL0,#(65536-2000) MOD 256

MOV A,#DISPBUF

ADD A,DISPBIT

MOV R0,A

MOV A,@R0

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P1,A

MOV A,DISPBIT

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P3,A

INC DISPBIT

MOV A,DISPBIT

CJNE A,#08H,KNA

MOV DISPBIT,#00H

KNA: INC T2SCNTA

MOV A,T2SCNTA

CJNE A,#100,DONE

MOV T2SCNTA,#00H

INC T2SCNTB

MOV A,T2SCNTB

CJNE A,#05H,DONE

MOV T2SCNTB,#00H

INC SECOND

MOV A,SECOND

CJNE A,#60,NEXT

MOV SECOND,#00H

INC MINITE

MOV A,MINITE

CJNE A,#60,NEXT

MOV MINITE,#00H

INC HOUR

MOV A,HOUR

CJNE A,#24,NEXT

MOV HOUR,#00H

NEXT: LCALL DISP

DONE: RETI

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H

TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

END

7. C语言源程序

#include <AT89X51H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00};

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};

unsigned char dispbitcnt;

unsigned char second;

unsigned char minite;

unsigned char hour;

unsigned int tcnt;

unsigned char mstcnt;

unsigned char i,j;

void main(void)

{

TMOD=0x02;

TH0=0x06;

TL0=0x06;

TR0=1;

ET0=1;

EA=1;

while(1)

{

if(P0_0==0)

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_0==0)

{

second++;

if(second==60)

{

second=0;

}

dispbuf[0]=second%10;

dispbuf[1]=second/10;

while(P0_0==0);

}

}

if(P0_1==0)

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_1==0)

{

minite++;

if(minite==60)

{

minite=0;

}

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

while(P0_1==0);

}

}

if(P0_2==0)

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_2==0)

{

hour++;

if(hour==24)

{

hour=0;

}

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

while(P0_2==0);

}

}

}

}

void t0(void) interrupt 1 using 0

{

mstcnt++;

if(mstcnt==8)

{

mstcnt=0;

P1=dispcode[dispbuf[dispbitcnt]];

P3=dispbitcode[dispbitcnt];

dispbitcnt++;

if(dispbitcnt==8)

{

dispbitcnt=0;

}

}

tcnt++;

if(tcnt==4000)

{

tcnt=0;

second++;

if(second==60)

{

second=0;

minite++;

if(minite==60)

{

minite=0;

hour++;

if(hour==24)

{

hour=0;

}

}

}

dispbuf[0]=second%10;

dispbuf[1]=second/10;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

}

}

用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 P16 ; 数据传送总线

SCLK bit P15; 时钟控制总线

RST bit P17 ; 复位总线

RS BIT P35

RW BIT P36

EN BIT P37

ORG 0000H

ORG 0013H

LCALL JKS

AJMP KS

; ;main program

ORG 0030H

KS: CLR RST

MOV SP,#2AH

;----LCD初始化----

CLR EN ;使能端为0,液晶执行命令

INIT_LCD:

MOV A,#38H ;双列显示,字形57点阵

ACALL WCOM

ACALL DELAY1

MOV A,#38H ;双列显示,字形57点阵

ACALL WCOM

ACALL DELAY1

MOV A,#38H ;双列显示,字形57点阵

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 P07,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

以上就是关于电子日历时钟程序设计(汇编语言)全部的内容,包括:电子日历时钟程序设计(汇编语言)、8051单片机的数字钟汇编程序、汇编语言要求编写一个时钟程序 用八位数码管实现时分秒的计时功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9284389.html

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

发表评论

登录后才能评论

评论列表(0条)

保存