
软件是要硬件支持的 下面有个图参考
程序可能要调试一下 你是 高手这个应该没什么问题吧。。。
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语言 单片机 数字钟、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)