PIC16F877A数字时钟时钟程序Word格式.docx

上传人:b****5 文档编号:19143664 上传时间:2023-01-04 格式:DOCX 页数:26 大小:21.50KB
下载 相关 举报
PIC16F877A数字时钟时钟程序Word格式.docx_第1页
第1页 / 共26页
PIC16F877A数字时钟时钟程序Word格式.docx_第2页
第2页 / 共26页
PIC16F877A数字时钟时钟程序Word格式.docx_第3页
第3页 / 共26页
PIC16F877A数字时钟时钟程序Word格式.docx_第4页
第4页 / 共26页
PIC16F877A数字时钟时钟程序Word格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

PIC16F877A数字时钟时钟程序Word格式.docx

《PIC16F877A数字时钟时钟程序Word格式.docx》由会员分享,可在线阅读,更多相关《PIC16F877A数字时钟时钟程序Word格式.docx(26页珍藏版)》请在冰豆网上搜索。

PIC16F877A数字时钟时钟程序Word格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1