数字时钟kell 程序

数字时钟kell 程序,第1张

软件是要硬件支持的     下面有个图参考

程序可能要调试一下      你是 高手这个应该没什么问题吧。。。

LED   BIT  P37       ;指示灯

TT0   EQU  09H

TT1   EQU  0AH

TT2   EQU  0BH        ;位定义

XIAN0 EQU  50H

XIAN1 EQU  51H

XIAN2 EQU  52H

XIAN3 EQU  53H        ;显存定义

FEN   EQU  54H        ;分存定义

SHI   EQU  55H        ;时存定义

ZHI   EQU  57H        ;按钮暂存内容定义

FLASH BIT  30H        ;闪烁标志位定义

SBIAO BIT  31H        ;定时器工作两种状态的标志位

KEY   BIT  32H        ;正常工作时屏蔽“加键”标志位

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP NIEDS0

ORG 0050H

MAIN:

MOV SP,#60H

MOV ZHI,#00   ;按钮初始值

MOV R7,#10

MOV R6,#2

MOV R5,#10

MOV R4,#2

MOV XIAN0,#0

MOV XIAN1,#0

MOV XIAN2,#0

MOV XIAN3,#0

MOV R0,#FEN

MOV FEN,#0

MOV SHI,#0

MOV TMOD,#01H

MOV TH0,#3CH

MOV TL0,#0B0H

SETB FLASH     ;开机显示不闪

SETB SBIAO     ;开机定时器正常工作

SETB LED

CLR KEY        ;初始屏蔽加键

SETB TR0

SETB ET0

SETB EA

NIEXQ:

LCALL DISP

LCALL KEYHAND

LJMP NIEXQ

NIEDS0:

PUSH ACC

PUSH PSW

JNB SBIAO,DSSS   ;判断是正常工作还是闪烁标志位取反

DJNZ R5,NIEOUT

MOV R5,#10

CPL LED          ;指示灯1S闪烁,因为是取反,所以要500MS取反一次

DJNZ R4,NIEOUT

MOV R4,#2

MOV A,FEN

INC A

MOV FEN,A

CJNE A,#60,NIEOUT

MOV FEN,#0

MOV A,SHI

INC A

MOV SHI,A

CJNE A,#24,NIEOUT

MOV SHI,#0

AJMP NIEOUT

DSSS:

DJNZ R7,NIEOUT

MOV R7,#10

CPL FLASH         ;进入调整状态,标志位取反,显示中判断

CPL LED           ;指示灯在调整时也闪烁

DJNZ R6,NIEOUT

MOV R6,#2

NIEOUT:

MOV TH0,#3CH

MOV TL0,#0B0H

POP PSW

POP ACC

RETI

DISP:

LCALL PAND        ;判断子程序,为了达到调整时闪烁

CLR  P33

SETB P32

SETB P31

SETB P30         ;直接对独立指定位CLR/SETB是为了不影响到P37指示灯的闪烁

MOV A,XIAN0

LCALL CHAB        ;查段码

CLR  P32

SETB P33

SETB P31

SETB P30         ;直接对独立指定位CLR/SETB是为了不影响到P37指示灯的闪烁

MOV A,XIAN1

LCALL CHAB        ;查段码

CLR  P31

SETB P32

SETB P33

SETB P30         ;直接对独立指定位CLR/SETB是为了不影响到P37指示灯的闪烁

MOV A,XIAN2

LCALL CHAB        ;查段码

CLR  P30

SETB P31

SETB P32

SETB P33         ;直接对独立指定位CLR/SETB是为了不影响到P37指示灯的闪烁

MOV A,XIAN3

LCALL CHAB        ;查段码

RET

CHAB:

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

MOV P1,#0FFH

RET

PAND:                     ;判断是否闪烁???

MOV A,R0

CJNE A,#FEN,PPS

JNB FLASH,FFS

LCALL DIVDIV

RET

FFS:

MOV XIAN1,#10

MOV XIAN0,#10

RET

PPS:

JNB FLASH,SSS

LCALL DIVDIV

RET

SSS:

MOV XIAN2,#10

MOV XIAN3,#10

RET

DIVDIV:                    ;分``时分解

MOV A,FEN

MOV B,#10

DIV AB

MOV XIAN1,A

MOV XIAN0,B

MOV A,SHI

MOV B,#10

DIV AB

MOV XIAN3,A

MOV XIAN2,B

RET

KEYHAND:                   ;按键扫描子程序

LCALL KAP

JZ NOKEY

PUSH P1            ;暂存P1状态!!

LCALL DISP

POP  P1

LCALL KAP

JZ NOKEY

MOV A,P1

JNB ACC0,K1

JNB ACC1,K2

NOKEY:

RET

KAP:                       ;通用型KAP

MOV A,P1

ORL A,#0FCH

CPL A

RET

DENDAI:                    ;等待键d起

PUSH P1

LCALL DISP

POP  P1

LCALL KAP

JNZ DENDAI

RET

K1:

LCALL DENDAI

MOV A,ZHI

INC A

MOV ZHI,A

CJNE A,#1,KTF

CLR SBIAO          ;按第一次时开启定时器中FLASH标志位取反``

SETB KEY           ;取消屏蔽

RET

KTF:

CJNE A,#2,KKAI

MOV R0,#SHI        ;按第二次属调时

RET

KKAI:

CJNE A,#3,K1OUT

MOV ZHI,#0

MOV R0,#FEN        ;恢复初始状态``调分

SETB SBIAO         ;开启定时1S工作

SETB FLASH         ;判断PAND子程序中用到

CLR KEY            ;屏蔽K2键

K1OUT :

RET

K2:

JNB KEY,K2OUT      ;是否屏蔽

LCALL DENDAI

MOV A,R0

CJNE A,#FEN,KKS    ;是否调分

MOV A,FEN

INC A

MOV FEN,A

CJNE A,#60,K2OUT

MOV FEN,#0

RET

KKS:                       ;不是调分``一定是调时

MOV A,SHI

INC A

MOV SHI,A

CJNE A,#24,K2OUT

MOV SHI,#0

K2OUT:

RET

DELAY:

MOV TT1,#02

DEE1:

MOV TT2,#0FFH

DJNZ TT2,$

DJNZ TT1,DEE1

RET

TAB:

DB 0FH,1FH,2FH,3FH,4FH,5FH,6FH,7FH,8FH,9FH,0FFH

END

这个非常简单啊……

时钟先弄出基时1s出来,然后60进制累加,设定时间,弄几个按键,也是按键累加就好了。

整点也是分钟位有进位就给出一个脉冲还是什么信号就完事了。

……

提供一个时钟计数、设置、闹钟的verilog代码,供参考。

module clock(clk,rst,set, set_typ, set_data, yr, mon, dt, hr, min, sec,

alarm_en, alm_typ, alm_yr, alm_mon, alm_dt, alm_hr, alm_min, alm_sec, alarm_output);

input clk,rst,set;

input [2:0] set_typ; //

input [6:0] set_data;//

output [6:0] yr, mon, dt, hr, min, sec;

input alarm_en;

input [2:0] alm_typ; //

input [6:0] alm_yr, alm_mon, alm_dt, alm_hr, alm_min, alm_sec;

output alarm_output;

parameter C_FR = 32'd20_000_000-32'd1; //定义系统时钟20MHz

reg [31:0] fr_cnt;

reg [3:0] sec_cnt;

reg pp1s; //秒脉冲

//==================================================

//fr_cnt

always@(posedge clk)//

if(!rst)

fr_cnt <= 32'b0;

else if (fr_cnt >= C_FR)

fr_cnt <= 32'b0;

else

fr_cnt <= fr_cnt + 1'b1;

//pp1s

always@(posedge clk)//

if(!rst)

pp1s <= 1'b0;

else if (fr_cnt == C_FR)

pp1s <= 1'b1;

else

pp1s <= 1'b0;

///time counter

always@(posedge clk)

if(!rst)

begin

yr <= 7'b0;

mon <= 7'b0;

dt <= 7'b0;

hr <= 7'b0;

min <= 7'b0;

sec <= 7'b0;

end

else if (set)

begin

case (set_typ)

3'b000: yr <= set_data;

3'b001: mon <= set_data;

3'b010: dt <= set_data;

3'b011: hr <= set_data;

3'b100: min <= set_data;

3'b101: sec <= set_data;

end

else if (pp1s)

begin

if (sec >= 7'd59)

sec <= 7'd0;

else

sec <= sec + 1'b1;

if (sec >= 7'd59)

begin

if (min >= 7'd59)

min <= 7'd0;

else

min <= min + 1'b1;

end

if (sec >= 7'd59 && min >= 7'd59)

begin

if (hr >= 7'd23)

hr <= 7'd0;

else

hr <= hr + 1'b1;

end

///data,mon, year, 大月小月,闰年等,依此类推

//

end

//=================================

//alarm

always@(posedge clk)

if(!rst)

alarm_output <= 1'b0;

else if (alarm_en)

case (alm_typ)

3'b000:

if (yr == alm_yr && mon == alm_mon && dt == alm_dt && hr == alm_hr && min == alm_min && sec == alm_sec)

alarm_output <= 1'b1;

else

alarm_output <= 1'b0;

3'b001:

if (mon == alm_mon && dt == alm_dt && hr == alm_hr && min == alm_min && sec == alm_sec)

alarm_output <= 1'b1;

else

alarm_output <= 1'b0;

3'b010:

if (dt == alm_dt && hr == alm_hr && min == alm_min && sec == alm_sec)

alarm_output <= 1'b1;

else

alarm_output <= 1'b0;

3'b011:

if (hr == alm_hr && min == alm_min && sec == alm_sec)

alarm_output <= 1'b1;

else

alarm_output <= 1'b0;

3'b100:

if (min == alm_min && sec == alm_sec)

alarm_output <= 1'b1;

else

alarm_output <= 1'b0;

default

alarm_output <= 1'b0;

endcase

endmodule

程序代码如下:

#include<iostream>

#include<windowsh>

using namespace std;

class Clock{

public:

Clock(short h=0,short m=0,short s=0):h(h),m(m),s(s){

}

void displayTime();

private:

short h;

short m;

short s;

};void Clock::displayTime(){

while(true){

cout<<h<<':'<<m<<':'<<s<<" ";

Sleep(1000);

cout<<'\r';

if(!(s=++s%60))

if(!(m=++m%60))

h=++h%24;

}

} int main()

{

Clock A(23,59,55);

AdisplayTime();

return 0;

}

扩展资料:

定义一个日期类,包括年、月、日三个成员变量,显示日期的方法如下:

publicclassDemo{

publicstaticvoidmain(String[]args){

Datedate1=newDate(1994,5,22);

date1showInfo();

Datedate2=newDate();

date2year=1995;

date2month=6;

date2day=29;

date2showInfo();

}

}

//日期类:

publicclassDate{

intyear;

intmonth;

intday;

//构造方法

publicDate(intyear,intmonth,intday){

thisyear=year;

thismonth=month;

thisday=day;

}

publicDate(){

}

publicvoidshowInfo(){

Systemoutprintln(year+"年"+month+"月"+day+"日");

}

}

带万年历的LCD显示多功能数字钟

程序清单:

;                    SMC1602接口程序(MCS51模拟口线方式)

;

;连线图: LCM---8031 LCM---8031 LCM------------8031

;        DB0---P00 DB4---P04 RS-------------P20

;        DB1---P01 DB5---P05 RW-------------P21

;        DB2---P02 DB6---P06 E--------------P22

;        DB3---P03 DB7---P07 VLCD接10K可调电阻到GND

;注:8051的晶振频率为110592MHz R0设置数据存放 S8为设置键 S7为加键 S4为确认键

;

;P0口液晶显示

; P24位选键P23加一键P22返回键及报时功能键闹钟设置P20控制显示键

;寄存器 clr rs0 setb rs1 R0 R4 R5在按键中用到  延时中用到 SETB RS0   SETB RS1的R0 R1 R2

;SETB RS0  CLR RS1显示中用到  CLR  RS0  CLR  RS1 在闹钟调整子程序中用到R1

;

;

;报时功能P26    和闹钟功能P25  闹钟调整时间功能已经可以设置     显示的切换方式变了   再关闭的情况下一切正常运行

;

RSPIN   BIT     P12

RWPIN   BIT     P11

EPIN    BIT     P10

WEIXUAN BIT P24 ;位选键设置键

JIAJIAN BIT P23 ;加一键

JIANJIAN BIT P22 ;减一键

FANHUI BIT P21 ;返回键

NZKG BIT P20 ;闹钟设置键

SECONTL EQU 30H ;秒

SECONTH EQU 31H ;秒

MAOHAOL EQU 32H ;:

MINIUTL EQU 33H ;分

MINIUTH EQU 34H ;分

MAOHAOH EQU 35H ;:

HOURL EQU 36H ;时

HOURH EQU 37H ;时

;日期部分

DAYL EQU 40H ;日个

DAYH EQU 41H ;日十

HENL EQU 42H ;-

MONTHL EQU 43H ;yue

MONTHH EQU 44H ;yue

HENH EQU 45H ;-

YEARO EQU 46H ;年

YEART EQU 47H

YEARS EQU 48H

YEARF EQU 49H

TEMP EQU 50H   ;用做存储单元显示子程序(DISPLAY)里用到

BIJIAO EQU 51H ;加一子程序(JIAYI)中用到

ZDRQO EQU 55H ;中断加一程序中用到

ZDRQT EQU 56H ;中断加一程序中用到

ZDRQS EQU 57H ;中断加一程序中用到

ZDRQF EQU 58H ;中断加一程序中用到

DIZHI EQU 59H ;键盘(JIANPAN)子程序里用到

NZBZ BIT 60H ;定时标志位在(闹钟开关部分)

;38H到3FH没用到

BSCSBZ BIT 39H ;报时次数转换标志    (BSCS)里用到

BSCSCC EQU 3AH ;报时次数存储  (BSCS)里用到

ZDBSBZ BIT 3BH ;整点报时标志  (SSBS)里用到

ZMBSBZ BIT 3CH ;整秒闪烁标志  (SSBS)里用到

BSKGBZ BIT 3DH ;报时开启标志  (BSKG)里用到

XKQHBZ BIT 3EH ;显示开启关闭标志 (XIANKONG)里用到

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP ZD

ORG 0030H

MAIN:  MOV SP,#60H  ;给堆栈指针赋初值

MOV 30H,#05H ;秒

MOV 31H,#05H ;秒

MOV 32H,#3AH ;:

MOV 33H,#09H ;分

MOV 34H,#05H ;分

MOV 35H,#3AH ;:

MOV 36H,#03H ;时

MOV 37H,#01H ;时

;日期部分

MOV 40H,#09H ;日个

MOV 41H,#02H ;日十

MOV 42H,#2DH ;-

MOV 43H,#09H ;yue

MOV 44H,#00H ;yue

MOV 45H,#2DH ;-

MOV 46H,#09H ;年

MOV 47H,#09H

MOV 48H,#09H

MOV 49H,#02H

CLR  P25  ;闹钟

CLR P26  ;整点报时

MOV 03H,#00H  ;闹钟分个位

MOV 04H,#00H  ;闹钟分十位

MOV 06H,#04H  ;闹钟时个位

MOV 07H,#01H  ;闹钟时十位

;CLR  P15

;CLR P14

MOV    B,#20

MOV    TMOD,#01H     ;定时器工作方式1

MOV TH0,#4CH

MOV TL0,#08H

SETB ET0                 ;允许T0中断

SETB EA                  ;总中断开放

LCALL    LCDRESET    ;初始化LCD

LCALL DISPSTART ;调用显示初始状态

SETB TR0   ;开启定时器

CLR NZBZ  ;闹钟开启关闭标志

CLR BSKGBZ  ;报时开启关闭标志

CLR XKQHBZ  ;显示开启关闭标志

LOOP: LCALL JIANPAN  ;按键子程序

LCALL DISPLAY  ;显示子程序

LCALL NZBF  ;NAOZHONG  BUFENG

LCALL NZBJ  ;NAOZHONG BIJIAO

LCALL BSKG  ;BAOSHIKAIGUAN

LCALL BSCS  ;BAOSHICISHU

LCALL SSBS  ;闪烁报时

SJMP LOOP

;==============================中断加一程序===================================

ZD: PUSH ACC

MOV TH0,#4CH

MOV TL0,#08H

DJNZ B,ZDEND

MOV    B,#20

INC SECONTL

SETB ZMBSBZ

MOV A,SECONTL

CJNE A,#0AH,ZDEND

MOV SECONTL,#00H

INC  SECONTH

MOV A,SECONTH

CJNE A,#06H,ZDEND

MOV SECONTH,#00H

INC MINIUTL

MOV A,MINIUTL

CJNE A,#0AH,ZDEND

MOV MINIUTL,#00H

INC  MINIUTH

MOV A,MINIUTH

CJNE A,#06H,ZDEND

MOV MINIUTH,#00H

INC  HOURL

SETB BSCSBZ

SETB ZDBSBZ

MOV A,HOURL   ;24小时的判断

CJNE A,#04H,ZDF

MOV A,HOURH

CJNE A,#02H,ZDEND

MOV HOURL,#00H

MOV HOURH,#00H

LCALL ZDRQ

SJMP ZDEND

ZDF: CJNE A,#0AH,ZDEND

MOV HOURL,#00H

INC  HOURH

ZDEND: POP ACC

RETI

;日期部分

ZDRQ: PUSH ACC

INC DAYL

;判断天数28,30,31部分

MOV A,MONTHH  ;用于判断月份时为31天30天28天

CJNE A,#01H,LL

MOV 55H,#0AH  ;存放月份的十位转化为个位是0AH

MOV A,MONTHL

ADD A,55H   ;月分高低相加用于查表

SJMP LL3

LL: MOV A,MONTHL

ADD A,MONTHH

LL3: MOV 56H,A   ;存放相加后的月份数据

MOV DPTR,#TAB5

MOVC A,@A+DPTR  ;查十位和天数的十位比较

MOV 57H,A

MOV A,56H

MOV DPTR,#TAB6  ;查个位和天数的个位比较

MOVC A,@A+DPTR

MOV 58H,A

MOV A,DAYH

CJNE A,57H,LL2

MOV A,DAYL

CJNE A,58H,LL2

MOV DAYH,#00H

MOV DAYL,#01H

SJMP LL4

LL2: MOV A,DAYL

CJNE A,#0AH,ZDRQEND

MOV DAYL,#00H

INC DAYH

MOV A,DAYH   ;比较天数是否要进位

CJNE A,57H,ZDRQEND

MOV A,DAYL

CJNE A,58H,ZDRQEND

MOV DAYH,#00H

MOV DAYL,#01H

;月份和年份

LL4: INC MONTHL

MOV A,MONTHL

CJNE A,#03H,ZDRQ1  ;用于判断月份时为12月时进位

MOV A,MONTHH

CJNE A,#01H,ZDRQ1

MOV MONTHL,#01H  ;天数符合要求

MOV MONTHH,#00H

SJMP ZDRQ2

ZDRQ1: CJNE A,#0AH,ZDRQEND

MOV MONTHL,#00H

INC MONTHH

SJMP ZDRQEND

ZDRQ2: INC YEARO   ;年的加一

MOV A,YEARO

CJNE A,#0AH,ZDRQEND

MOV YEARO,#00H

INC YEART   ;年的进位

MOV A,YEART

CJNE A,#0AH,ZDRQEND

MOV YEART,#00H

INC YEARS

MOV A,YEARS

CJNE A,#0AH,ZDRQEND

MOV YEARS,#00H

INC YEARF

MOV A,YEARF

CJNE A,#0AH,ZDRQEND

MOV YEARF,#00H

ZDRQEND:

POP ACC

RET

;液晶初始化

;========================初始化程序=======================================

LCDRESET:                       ;初始化程序

LCALL    DELAY5MS        ;延时15MS

LCALL    DELAY5MS

LCALL    DELAY5MS

MOV A,#38H          ;显示模式设置(不检测忙信号)

LCALL    LCDWCN          ;共三次

LCALL    DELAY5MS

MOV     A,#38H

LCALL    LCDWCN

LCALL    DELAY5MS

MOV     A,#38H

LCALL    LCDWCN

MOV     A,#38H          ;显示模式设置(以后均检测忙信号)

LCALL    LCDWC

MOV     A,#08H          ;显示关闭

LCALL    LCDWC

MOV     A,#01H          ;显示清屏

LCALL    LCDWC

MOV     A,#06H          ;显示光标移动设置

LCALL    LCDWC

MOV     A,#0CH          ;显示开及光标设置

LCALL    LCDWC

RET

;==============================写指令===================================

LCDWC:                          ;送控制字子程序(检测忙信号)

LCALL    WAITIDLE

;写指令;送控制字子程序(不检测忙信号)

LCDWCN: CLR     RSPIN           ;RS=0 RW=0 E=高脉冲

CLR     RWPIN

MOV     P0,A

SETB    EPIN  ;(

NOP   ;给高电平脉冲

CLR     EPIN  ;)

RET

;==========================写数据=======================================

LCDWD:                              ;写字符子程序

LCALL    WAITIDLE

SETB    RSPIN               ;RS=1 RW=0 E=高脉冲

CLR     RWPIN

MOV     P0,A

SETB    EPIN

NOP

CLR     EPIN

RET

;===============================等待控制器空闲==================================

WAITIDLE:

PUSH    ACC                 ;正常读写 *** 作之前必须检测LCD控制器状态

MOV     P0,#0FFH

lcall DELAY5MS  ;4566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666

CLR     RSPIN               ;RS=0 RW=1 E=高电平

SETB    RWPIN

SETB    EPIN

lcall DELAY5MS  ;465555546465464654648791313848946113134849845461313579641613131354649498

WTD_PA: NOP                         ;DB7:    0  LCD控制器空闲

JB      P07,WTD_PA         ;        1  LCD控制器忙

CLR     EPIN

POP     ACC

RET

;初始状态子程序

DISPSTART:   ;显示初始状态子程序

PUSH ACC

MOV A,#80H

LCALL LCDWC

MOV     DPTR,#TAB ;显示字符

DISP1: CLR A

MOVC A,@A+DPTR

JZ DISP2

LCALL LCDWD

INC DPTR

SJMP DISP1

DISP2: MOV A,#0C0H

LCALL LCDWC

MOV DPTR,#TAB1

DISP3: CLR A

MOVC A,@A+DPTR

JZ DISP_END

LCALL LCDWD

INC DPTR

SJMP DISP3

DISP_END:

POP ACC

RET

;==========================显示子程序=======================================

DISPLAY:PUSH PSW

PUSH ACC

SETB RS0

CLR RS1

MOV A,#85H

LCALL LCDWC

MOV R1,#38H   ;第一行显示数据存储单元的启始地址

MOV TEMP,#30H  ;第一行显示数据存储单元的结束地址

MOV R6,#2

PLAY: DEC R1

CJNE R1,#32H,PLY  ;判断是否为冒号位

MOV A,MAOHAOL  ;是者送冒号的ACSI码

SJMP PLAY1

PLY: CJNE R1,#35H,PLY1

MOV A,MAOHAOH

SJMP PLAY1

PLY1: CJNE R1,#42H,PLY2  ;判断是否为横杠的位置

MOV A,HENL   ;是者送横杠的ACSI码

SJMP PLAY1

PLY2: CJNE R1,#45H,PLY3

MOV A,HENH

SJMP PLAY1

PLY3: MOV A,@R1   ;用查表法送要显示的数据

MOV DPTR,#TAB2

MOVC A,@A+DPTR

PLAY1: LCALL LCDWD

MOV A,R1

CJNE A,TEMP,PLAY  ;判断第一行是否显示好了

MOV A,#0C5H

LCALL LCDWC

MOV R1,#4AH   ;第二行显示数据存储单元的启始地址

MOV TEMP,#40H  ;第二行的结束地址

DJNZ R6,PLAY   ;R6为0时两行显示结束

POP ACC

POP PSW

RET

;按键子程序

JIANPAN:clr rs0      ;键盘子程序

setb rs1  ;键盘子程序

JB WEIXUAN,JIAN_ZEND ;设置键的判断

LCALL DELAY5MS

JB WEIXUAN,JIAN_ZEND

PUSH ACC

JNB WEIXUAN,$

;MOV A,#0FH  ;开启光标闪烁设置

;LCALL LCDWCN

fah: JNB NZBZ,JPNZSJ ;为“1”闹钟   为“0”时钟

LCALL JPXS

MOV R4,#86H  ;闹钟设定时间R4存放显示位地址

MOV R5,#2  ;闹钟设定时间第一行第二行•••••位置改变次数

MOV DIZHI,#8CH ;闹钟设定时间第一行结束地址

MOV R0,#06H

SJMP GIVED

JPNZSJ: CLR TR0

MOV R4,#86H  ;R4存放显示位地址

MOV R5,#2  ;第一行第二行•••••位置改变次数

MOV DIZHI,#8DH ;第一行结束地址

MOV R0,#36H

GIVED: MOV A,#0FH  ;开启光标闪烁设置555555555555555555555555555555555555555555555

LCALL LCDWCN

MOV A,R4

LCALL LCDWC

UPONE: JB FANHUI,UPtwo ;返回键的判断

LCALL DELAY5MS

JB FANHUI,UPtwo

JNB FANHUI,$

SJMP GOBACK

JIAN_ZEND:SJMP JIAN_END ;中继跳转6666666666666666666666666666666666666666666666666666666666666666

UPtwo: JB JIAJIAN,IAM ;加一键的判断

LCALL DELAY5MS

JB JIAJIAN,IAM

JNB JIAJIAN,$

LCALL JIAYI  ;调用按键加一子程序

;MOV A,#0FH  ;开启光标闪烁设置555555555555555555555555555555555555555555555

;LCALL LCDWCN

IAM: JB JIANJIAN,IAM22 ;减一键的判断

LCALL DELAY5MS

JB JIANJIAN,IAM22

JNB JIANJIAN,$

LCALL JIANYI ;调用按键减一子程序

AJMP GIVED

IAM22:  JB WEIXUAN,UPONE ;位选键的判断

LCALL   DELAY5MS

JB WEIXUAN,UPONE

JNB WEIXUAN,$

DEC R0

INC R4

LCALL JIAN  ;调用位选比较程序

CJNE r4,#88H,JJ11

DEC R0

INC R4

SJMP    JJ22

JJ11: CJNE r4,#8BH,JJ22

DEC R0

INC R4

JJ22: MOV A,R4

CJNE A,DIZHI,GIVED

JB NZBZ,fah  ;为“1”闹钟   为“0”时钟

MOV R4,#0C5H

MOV DIZHI,#0CFH

MOV R0,#49H

DJNZ R5,GIVED

LJMP fah

GOBACK: MOV A,#0CH  ;关闭光标闪烁设置

LCALL LCDWCN

POP ACC

JIAN_END:

SETB TR0

RET

;1111111111111111111111111111111111111111111111111111111111111111111111111111

;11111111111111111111111111111111111111111111111111111111111111111111111111

JPXS: MOV A,#85H

LCALL LCDWC

MOV R1,#08H   ;第一行显示数据存储单元的启始地址

JPXS_LL:DEC R1

CJNE R1,#05H,JPXS_LP

MOV A,#3AH

SJMP JPXS_LY

JPXS_LP:MOV A,@R1   ;用查表法送要显示的数据

MOV DPTR,#TAB2

MOVC A,@A+DPTR

JPXS_LY:LCALL LCDWD

CJNE R1,#03H,JPXS_LL

RET

;111111111111111111111111111111111111111111111111111111111111111111111

;111111111111111111111111111111111111111111111111111111111111111111111

;位选比较控制程序

; 在调整时间时这几位是符号冒号和横杠的数据

;在这几位时跳过到下一位

JIAN: CJNE R4,#87H,JIAN5

DEC R0

INC R4

SJMP JIANEND

JIAN5: CJNE R4,#8AH,JIAN1

DEC R0

INC R4

SJMP JIANEND

JIAN1: CJNE R4,#0C9H,JIAN2

DEC R0

INC R4

SJMP JIANEND

JIAN2: CJNE R4,#0CCH,JIANEND

DEC R0

INC R4

JIANEND:RET

;按键加一子程序

JIAYI: INC @R0

CJNE @R0,#0AH,JIAYI_END

MOV @R0,#0

CJNE R4,#86H,JIAYI55

SJMP JIAYI33

JIAYI55:CJNE r4,#89H,JIAYI11

SJMP JIAYI33

JIAYI11:CJNE r4,#8CH,JIAYI22

SJMP JIAYI33

JIAYI22:CJNE R0,#30H,JIAYI_END

JIAYI33:INC R0

INC @R0

CJNE @R0,#06H,JIAYI44

MOV @R0,#0

JIAYI44:DEC R0

JIAYI_END:MOV A,#0CH  ;开启光标闪烁设置

LCALL LCDWCN

JNB NZBZ,JIAYI88 ;为“1”闹钟   为“0”时钟

LCALL JPXS

SJMP JIAYI99

JIAYI88:LCALL DISPLAY  ;显示子程序

JIAYI99: RET

;%%%%%%%%%%%%%%%%%%减一%%%%%%%%%%%%%%%%%%%%%%%%

JIANYI: DEC @R0

CJNE @R0,#00H,JIANYI_END

MOV @R0,#9

CJNE R4,#86H,JIANYI55

SJMP JIANYI33

JIANYI55:CJNE r4,#89H,JIANYI11

SJMP JIANYI33

JIANYI11:CJNE r4,#8CH,JIANYI22

SJMP JIANYI33

JIANYI22:CJNE R0,#30H,JIANYI_END

JIANYI33:INC R0

DEC @R0

CJNE @R0,#0FFH,JIANYI44

MOV @R0,#5

JIANYI44:DEC R0

JIANYI_END:MOV A,#0CH  ;开启光标闪烁设置

LCALL LCDWCN

JNB NZBZ,JIANYI88 ;为“1”闹钟   为“0”时钟

LCALL JPXS

SJMP JIANYI99

JIANYI88: LCALL DISPLAY  ;显示子程序

JIANYI99: RET

;闹钟开关部分

NZBF: JB NZKG,NZBF_END

LCALL DELAY5MS

JB NZKG,NZBF_END

JNB NZKG,$

CPL NZBZ

JB NZBZ,NZBF_LL

MOV     A,#01H          ;显示清屏

LCALL   LCDWC

CLR P25

LCALL DISPSTART ;调用显示初始状态

LCALL DISPLAY  ;调用显示初始状态

JB BSKGBZ,NZBF_LP    ; |

SJMP NZBF_END    ; |

NZBF_LP:MOV     A,#8FH          ;报时标志显示位置 ;  |

LCALL   LCDWC     ;  |保护报时标志在清屏是不被误清

MOV A,#25H  ;显示报时标志  ;  |

LCALL LCDWD          ; |

SJMP NZBF_END    ; |

NZBF_LL:MOV     A,#8EH          ;闹钟标志显示位置

LCALL   LCDWC

MOV A,#26H  ;显示闹钟标志

LCALL LCDWD

NZBF_END:RET

;闹钟比较部分

NZBJ: JB NZBZ,NZBJ_LL

SJMP NZBJ_END

NZBJ_LL:MOV A,07H

CJNE A,37H,NZBJ_END

MOV A,06H

CJNE A,36H,NZBJ_END

MOV A,04H

CJNE A,34H,NZBJ_END

MOV A,03H

CJNE A,33H,NZBJ_END

SETB P25

NZBJ_END:RET

;报时开关

BSKG: JB FANHUI,BSKG_END

LCALL DELAY5MS

JB FANHUI,BSKG_END

JNB FANHUI,$

CPL BSKGBZ

JB BSKGBZ,BSKG_LL

MOV     A,#01H          ;显示清屏

LCALL   LCDWC

CLR P26

LCALL DISPSTART ;调用显示初始状态

LCALL DISPLAY  ;调用显示

JB NZBZ,BSKG_LP ; |

SJMP BSKG_END ; |

BSKG_LP:MOV     A,#8EH          ;  |

LCALL   LCDWC  ;  |保护闹钟标志在清屏是不被误清

MOV A,#26H  ;  |

LCALL LCDWD  ; |

SJMP BSKG_END ; |

BSKG_LL:MOV     A,#8FH          ;报时标志显示位置

LCALL   LCDWC

MOV A,#25H  ;显示报时标志

LCALL LCDWD

BSKG_END:RET

;报时次数

BSCS: JNB BSKGBZ,BSCS_END

JNB BSCSBZ,BSCS_END

MOV A,37H

CJNE A,#01H,BSCS_LL

MOV A,#0AH

SJMP BSCS_LP

BSCS_LL:CJNE A,#02H,BSCS_LP

MOV A,#14H

BSCS_LP:ADD A,36H

RL A

MOV BSCSCC,A

CLR BSCSBZ

BSCS_END: RET

;闪烁报时

SSBS: JNB BSKGBZ,SSBS_END

JNB ZDBSBZ,SSBS_END

JNB ZMBSBZ,SSBS_END

CPL P26

CPL     P27

CLR ZMBSBZ

DJNZ BSCSCC,SSBS_END

CLR ZDBSBZ

CLR P26

SSBS_END:RET

;延时子程序(5MS)

DELAY5MS:

PUSH PSW

SETB RS0

SETB RS1

MOV     R1,#25              ;延时子程序(5MS)

DL5_PA: MOV     R2,#100

DJNZ    R2,$

DJNZ    R1,DL5_PA

POP PSW

RET

TAB: DB "TIME:",00h

TAB1: DB "DATE:",00h

TAB2: DB "01234567891"

TAB3: DB 0AH,06H,00H,0AH,06H,00H,0AH,03H ;用于比较调整时间时的比较

TAB4: DB 0AH,04H,00H,0AH,02H,00H,0AH,0AH,0AH,0AH;用于调整日期时的比较

TAB5: DB 00H,03H,02H,03H,03H,03H,03H,03H,03H,03H,03H,03H,03H;用于天数十位比较

TAB6: DB 00H,02H,09H,02H,01H,02H,01H,02H,02H,01H,02H,01H,02H;用于天数个位比较

END

以上就是关于数字时钟kell 程序全部的内容,包括:数字时钟kell 程序、简易多功能数字电子钟的设计(跪求啊)、课题:多功能数字钟的设计使用verilog HDL语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9551413.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存