数字时钟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

#include<reg52h>

sbit ksec=P3^0;

sbit kmin=P3^1;

sbit khour=P3^2;

unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;

unsigned int num=0,sec=0,min=0,hour=0;

unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(unsigned int z)

{

unsigned int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void keyscan();

void display();

void main()

{TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;ET0=1;TR0=1;

while(1)

{display();

keyscan();

}

}

void time0() interrupt 1

{num++;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

void display()

{if(num==20)

{num=0;

sec++;

if(sec==60)

{sec=0;

min++;

if(min==60)

{min=0;

hour++;

if(hour==24)

{hour=0;

min=0;

sec=0;

}

}

}

}

secge=sec%10;

secshi=sec/10;

minge=min%10;

minshi=min/10;

hourge=hour%10;

hourshi=hour/10;

P2=0xfe;

P0=table[secge];

delay(5);

P2=0xfd;

P0=table[secshi];

delay(5);

P2=0xfb;

P0=0x40;

delay(5);

P2=0xf7;

P0=table[minge];

delay(5);

P2=0xef;

P0=table[minshi];

delay(5);

P2=0xdf;

P0=0x40;

delay(5);

P2=0xbf;

P0=table[hourge];

delay(5);

P2=0x7f;

P0=table[hourshi];

delay(5);

}

void keyscan()

{if(ksec==0)

{delay(10);

if(ksec==0)

{sec++;

if(sec>=60)

sec=0;

}

while(ksec==0)

display();}

if(kmin==0)

{delay(10);

if(kmin==0)

{min++;

if(min>=60)

min=0;

}

while(kmin==0)

display();

}

if(khour==0)

{delay(10);

if(khour==0)

{hour++;

if(hour>=60)

hour=0;

}

while(khour==0)

display();

}

}

已经编译通过了:发现的错误很多! 你自己比对一下吧!

QQ:361179146

以上就是关于数字时钟kell 程序全部的内容,包括:数字时钟kell 程序、C语言 单片机 数字钟、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存