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