PIC16F877A数字时钟时钟程序Word格式.docx
《PIC16F877A数字时钟时钟程序Word格式.docx》由会员分享,可在线阅读,更多相关《PIC16F877A数字时钟时钟程序Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
50ms原来计数20次改为19次;
250us原来计数200次改为197次
---------------------------------------------------------------
{2010/12/10.17:
30}-Ver03.2--CS-ICD:
0x296B---ISP:
0x7387----
5.在Set_ini中--增加CALLSET_Flag;
指定Flag,1=1;
标志位-
---解决Ver03.1-第一次按SET键时不能调HourL&
HourH的问题
************************************************
程序清单
**************************************************
__CONFIG3F39H;
设置配置位中振荡方式为XT,其它全部禁止或关闭
includeP16F877A.INC
-----------------------------------------------
-----------------ramvarable------------------------------
HourHequ20H;
HourLequ21H;
MinHequ22H;
MinLequ23H;
SecHequ24h;
SecLequ25h;
B'
00100101'
N250usequ26h;
250us*200=50ms
N50msequ27h;
50ms*20=1000ms
Nsecequ28h;
data1equ29h;
定义一个廷时变量寄存器
data2equ2Ah;
定义另一个廷时变量寄存器
keyvalueEQU2Bh;
FlagKeyEQU2Ch;
W_STKequ2Dh;
----------------
STATUS_STKequ2Eh;
PCLATH_STKequ2Fh;
FSR_STKequ30h;
---------------
COUNT0equ31h;
DELAYuse00110000
COUNT1equ32h;
COUNT2equ33h;
Flagequ34h;
---Adjust.Time---------
N250usequ35h;
N50msequ36h;
Nsecequ37h;
------------------Counstant------------------------------
n1equd'
1'
d'
13'
;
定义一个外层循环廷时常数d'
(10ms)
n2equ0ffh;
定义一个内层廷时常数
RBCOUNSTequ0x1f;
rb0~rb4读取后异或常数
------------------bit1-----------------------------
cequ0;
定义进位标志位位地址
rp0equ5;
定义状态寄存器的页选位RP0
NOT_RBPUequ7;
定义选择寄存器RB的上拉电阻位RBPU
zequ2;
定义0状态位的位地址
F_releaseEQU0;
F_pressedequ1;
--------------FlagKey---bit2----------------------------
#defineF_releaseFlagKey,0;
按键释放标志位
#defineF_pressedFlagKey,1;
按键闭合标志位
-------------Flag----------------------------------
Flag,0;
时间调整标志位
Flag,1;
FSR=21H=HourL
Flag,2;
FSR=23H=MinL
Flag,3;
FSR=25H=SecL
**************************************************************
-------------------------------------------------------------
ORG0000H
NOP;
放置一条ICD必需的空操作指令
GOTOMAIN
ORG0004H
GOTOISR_TMR0;
ORG0008H
******************************************************
NAME:
CONMERT1数码管位码查表子程序
-------------------------------------------------
CONVERT1;
取数码管位码
ADDWFPCL,1;
地址偏移量加当前PC值
TABLE1
RETLW0FDH;
第一位数码管
RETLW0FEH;
第二位数码管
RETLW0F7H;
第三位数码管
RETLW0FBH;
第四位数码管
RETLW0DFH;
第五位数码管
RETLW0EFH;
第六位数码管
********************************************************
CONVERT数码管段码查表子程序
-----------------------------------------------------
CONVERT;
取数码管段码
TABLE
RETLW0C0H;
0
RETLW0F9H;
1
RETLW0A4H;
2
RETLW0B0H;
3
RETLW99H;
4
RETLW92H;
5
RETLW82H;
6
RETLW0F8H;
7
RETLW80H;
8
RETLW98H;
9
RETLW7FH;
.
retlw00h;
11
*************************************************************
///////////--Mainprogram--///////////////////////////////
----------------------------------------------------------
***********************************************************
return;
MAIN
CALLSys_ini;
CALLClear_RAM;
BSFINTCON,GIE;
打开全局中断,启动定时器
CALLRAM_ini;
LOOP_DIS
CALLDisplay_led;
NOP;
bcfSTATUS,RP0;
BTFSCPORTB,0;
RB0=0?
键按下否?
GOTOLOOP_DIS;
no
CALLDisplay_led;
Yes
再次确认键按下否?
no
CALLSet_in;
CALLkeyscan;
LoopEND
GOTOLOOP_DIS;
****************************************************
Set_in
BSFFlag,0;
Set1闪烁显示处理放在中断进行
MOVLW0x21;
HourL->
FSR
MOVWFFSR;
CALLSET_Flag;
BSFFlag,1;
1
BCFFlag,2;
0
BCFFlag,3;
0
keyscanRealase0;
按键释放,子程序名
movfPORTB,W;
读取RB口数据到W(d=0)
andlw0x1f;
屏蔽高4位
bcfSTATUS,Z;
xorlw0x1f;
btfssSTATUS,Z;
gotokeyscanRealase0;
Z=0有键按下
calldelay;
Z=1无键按下
Z=0有键按下,waittingforrelease
Z=1无键按下exit
------------
RETURN;
----------------------------
KEY0_SUB;
SET_KEY
INCFFSR,1;
21-23-25h
MOVFFSR,W;
SUBLW0x27;
----27>
>
-
BTFSSSTATUS,Z;
FSR=27H?
GOTO$+3;
MOVLW0x21;
MOVWFFSR;
CALLSET_Flag;
RETURN;
KEY1_SUB;
ADD_KEY
INCFINDF,1;
CALLArrangTime;
KEY2_SUB;
SUB_KEY
MOVFINDF,1;
BTFSSSTATUS,Z;
INDF=0?
GOTO$+4;
NO:
Jumpto'
DECFINDF,1;
'
MOVLW.9;
=Yes:
Re-setupREGF
MOVFINDF,1;
9->
REGF
GOTO$+2;
andjumpto'
CALLTime_sub;
CALLTime_sub;
KEY3_SUB;
EXIT_KEY;
CALLSet_out
BCFFlag,0;
Clear0
MOVLW0x00;
-------------------------------------
*******************************************
keyscan;
--1--按键闭合-----------------------
BTFSSFlag,0;
1继续按键处理
gotokeyscan_end;
0退出按键处理
MOVFPORTB,W;
ANDLW0x1f;
屏蔽高4位RBCOUNSTA^1=~A
BCFSTATUS,Z;
将z清0
XORLW0x1f;
即RA与0x0f作异或运算,若两数相同,结果为0,Z置1
若两数相异,结果非0,Z=0
BTFSCSTATUS,Z;
0jumpkeyclose
GOTOkeyscan;
Z=1无键按下退出按键扫描
Z=0有键按下,延时按键去抖动
--2----------------------
MOVWFkeyvalue;
保存键值到keyvalue
即RA与0x0f作异或运算,若两数相同,结果为0,Z置1;
若两数相异,Z=0不相同
Z为1退出按键扫描
incfportc,1;
keyfuctionsub.
********************************************
KEY0
BTFSCkeyvalue,0;
KEY0?
GOTOKEY1;
CALLKEY0_SUB;
gotoAdjust_Time;
KEY1
BTFSCkeyvalue,1;
KEY1?
GOTOKEY2;
CALLKEY1_SUB;
KEY2
BTFSCkeyvalue,2;
KEY2?
GOTOKEY3;
CALLKEY2_SUB;
KEY3
BTFSCkeyvalue,3;
KEY3?
GOTOAdjust_Time;
KEY1;
CALLKEY3_SUB;
ADJ_OUT
----------------------------------------------
Adjust_Time
CALLArrangTime;
--------------------------------------------
keyscanRealase;
gotokeyscanRealase;
gotokeyscan;
Z=1无键按下
---------------------------------------------
keyscan_end
-------------keyscan_end------------------------------
***********Adjust_TIMEEND************************
===============SET_FlagSUB=======================================
SET_Flag
BCFSTATUS,RP0;
selectbank0;
MOVFFSR,W;
SUBLW0x21;
BTFSSSTATUS,Z;
FSR=21H?
GOTOSET_F2;
CALLArrangHour;
------------------------------------
SET_F2
SUBLW0x23;
FSR=23H?
GOTOSET_F3;
CALLArrangMin;
BCFFlag,1;
BSFFlag,2;
SET_F3
SUBLW0x25;
FSR=25H?
GOTOSET_END;
CALLArrangSec;
-----
BSFFlag,3;
1
SET_END
================SET_FlagEND=========================
******************************************
=====================================================
NAME:
Time_sub(Key2_SUB)
=====================================
Time_sub
BTFSSFlag,1;
FSR=21h=HourL
GOTO$+2;
CALLHour_sub;
-------------------
BTFSSFlag,2;
FSR=23h=HourL
CALLMin_sub;
--------------------
BTFSSFlag,3;
FSR=25h=HourL
CALLSec_sub;
===============Hour_sub=====================
Hour_sub
MOVFHourL,F;
F->
F
HourL=0?
GOTOHourL_NotZero;
NoINDF--
MOVFHourH,F;
HourH=0?
GOTOHourH_NotZero;
NotZero
MOVLW.2;
MOVWFHourH;
2->
hourH
MOVLW.3;
MOVWFHourL;
3->
HourL
GOTOHour_sub_end;
HourH_NotZero;
DECFHourH,F;
HourH--
MOVLW.9
9->
HourL
GOTOHour_sub_end;
HourL_NotZero;
DECFHourL,F;
Hour_sub_end
RETURN
===============Hour_subEND======================
Min_sub
MOVFMinH,F;
MinH=0?
GOTOMinH_NotZero;
NO
MOVFMinL,F;
MinL=0?
GOTOMinL_NotZero;
No
Hour00;
(1)-00-
MOVLW.5;
MOVWFMinH;
5->
MinH
MOVLW.9;
MOVWFMinL;
MinL
GOTOMin_sub_end;
MinH_NotZero;
F