PIC16F877A数字时钟时钟程序.docx

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

PIC16F877A数字时钟时钟程序.docx

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

PIC16F877A数字时钟时钟程序.docx

PIC16F877A数字时钟时钟程序

;Digitclock

;-----------------------------------------------

;DATE:

20101205

;Author:

TangHS

;MCU:

PIC16F877A

;FileName:

ClockPIC.ASM

;-----------------------------------------------------------

;Date:

{2010/12/07.14:

35}-Ver01--CS-ICD:

0xAFCE---ISP:

0xb7ce----

;功能:

1.LED显示:

时分秒;格式:

[hhmmss]备注:

按键未定义

;------------------------------------------------------------

;-----------------------------------------------------------

;Date:

{2010/12/07.22:

15}-Ver01--CS-ICD:

0xAFCE---ISP:

0xb7ce----

;功能:

1.LED显示:

时分秒;格式:

[hhmmss]备注:

按键未定义

;2.RB0-SET_KEY;RB1-ADD_KEY;RB2-SUB_KEY;RB3-EXIT_KEY

;------------------------------------------------------------

;Date:

{2010/12/09.18:

06}-Ver02--CS-ICD:

0xAFCE---ISP:

0xef0e----

;************************************************************

;Date:

{2010/12/10.00:

47}-Ver03--CS-ICD:

0xb08d---ISP:

0xfaa7----

;功能:

1.LED显示:

时分秒;格式:

[hhmmss]备注:

按键未定义

;2.RB0-SET_KEY;RB1-ADD_KEY;RB2-SUB_KEY;RB3-EXIT_KEY都OK

;3.MOVLW纠正MOVVREG,1引起的SUB_不良;

;--------------------------------------------------------------

;Date:

{2010/12/10.13:

10}-Ver03.1--CS-ICD:

0xb08b---ISP:

0xfaa4----

;4.时差。

50ms原来计数20次改为19次;250us原来计数200次改为197次

;---------------------------------------------------------------

;Date:

{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;250us*200=50ms

N50msequ36h;50ms*20=1000ms

Nsecequ37h;

;------------------Counstant------------------------------

n1equd'1';d'13';定义一个外层循环廷时常数d'13'(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;第六位数码管

;********************************************************

;NAME:

CONVERT数码管段码查表子程序

;-----------------------------------------------------

CONVERT;取数码管段码

ADDWFPCL,1;地址偏移量加当前PC值

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

CALLDisplay_led;

BTFSCPORTB,0;RB0=0?

再次确认键按下否?

GOTOLOOP_DIS;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;按键释放,子程序名

CALLDisplay_led;

movfPORTB,W;读取RB口数据到W(d=0)

andlw0x1f;屏蔽高4位

bcfSTATUS,Z;

xorlw0x1f;

btfssSTATUS,Z;

gotokeyscanRealase0;Z=0有键按下

;calldelay;Z=1无键按下

CALLDisplay_led;

CALLDisplay_led;

movfPORTB,W;读取RB口数据到W(d=0)

andlw0x1f;屏蔽高4位

bcfSTATUS,Z;

xorlw0x1f;

btfssSTATUS,Z;

gotokeyscanRealase0;Z=0有键按下,waittingforrelease

;Z=1无键按下exit

;------------

RETURN;

;----------------------------

;----------------------------

KEY0_SUB;SET_KEY

INCFFSR,1;21-23-25h

INCFFSR,1;

MOVFFSR,W;

SUBLW0x27;----27>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-

BTFSSSTATUS,Z;FSR=27H?

GOTO$+3;

MOVLW0x21;

MOVWFFSR;

CALLSET_Flag;

RETURN;

KEY1_SUB;ADD_KEY

INCFINDF,1;

CALLArrangTime;

RETURN;

KEY2_SUB;SUB_KEY

;MOVFINDF,1;

;BTFSSSTATUS,Z;INDF=0?

;GOTO$+4;NO:

Jumpto'DECFINDF,1;'

;MOVLW.9;=Yes:

Re-setupREGF

;MOVFINDF,1;=Yes:

9->REGF

;GOTO$+2;=Yes:

andjumpto'CALLTime_sub;'

;DECFINDF,1;

CALLTime_sub;

RETURN;

KEY3_SUB;EXIT_KEY;CALLSet_out

BCFFlag,0;Clear0

MOVLW0x00;HourL->FSR

MOVWFFSR;

RETURN;

;-------------------------------------

;*******************************************

keyscan;--1--按键闭合-----------------------

BTFSSFlag,0;1继续按键处理

gotokeyscan_end;0退出按键处理

CALLArrangTime;

CALLDisplay_led;

MOVFPORTB,W;读取RB口数据到W(d=0)

ANDLW0x1f;屏蔽高4位RBCOUNSTA^1=~A

BCFSTATUS,Z;将z清0

XORLW0x1f;即RA与0x0f作异或运算,若两数相同,结果为0,Z置1

;若两数相异,结果非0,Z=0

BTFSCSTATUS,Z;0jumpkeyclose

GOTOkeyscan;Z=1无键按下退出按键扫描

;calldelay;Z=0有键按下,延时按键去抖动

CALLDisplay_led;

CALLDisplay_led;

;--2----------------------

MOVFPORTB,W;读取RB口数据到W(d=0)

ANDLW0x1f;屏蔽高4位

MOVWFkeyvalue;保存键值到keyvalue

BCFSTATUS,Z;将z清0

XORLW0x1f;即RA与0x0f作异或运算,若两数相同,结果为0,Z置1;若两数相异,Z=0不相同

BTFSCSTATUS,Z;0jumpkeyclose

GOTOkeyscan;Z为1退出按键扫描

;incfportc,1;keyfuctionsub.

;********************************************

KEY0

BTFSCkeyvalue,0;KEY0?

GOTOKEY1;

CALLKEY0_SUB;

gotoAdjust_Time;

KEY1

BTFSCkeyvalue,1;KEY1?

GOTOKEY2;

CALLKEY1_SUB;

gotoAdjust_Time;

KEY2

BTFSCkeyvalue,2;KEY2?

GOTOKEY3;

CALLKEY2_SUB;

gotoAdjust_Time;

KEY3

BTFSCkeyvalue,3;KEY3?

GOTOAdjust_Time;KEY1;

CALLKEY3_SUB;

ADJ_OUT

;----------------------------------------------

Adjust_Time

;CALLArrangTime;

;--------------------------------------------

keyscanRealase;按键释放,子程序名

CALLDisplay_led;

movfPORTB,W;读取RB口数据到W(d=0)

andlw0x1f;屏蔽高4位

bcfSTATUS,Z;

xorlw0x1f;

btfssSTATUS,Z;

gotokeyscanRealase;Z=0有键按下

;calldelay;Z=1无键按下

CALLDisplay_led;

CALLDisplay_led;

movfPORTB,W;读取RB口数据到W(d=0)

andlw0x1f;屏蔽高4位

bcfSTATUS,Z;

xorlw0x1f;

btfssSTATUS,Z;

gotokeyscanRealase;Z=0有键按下

gotokeyscan;Z=1无键按下

;---------------------------------------------

keyscan_end

RETURN;

;-------------keyscan_end------------------------------

;***********Adjust_TIMEEND************************

;

;===============SET_FlagSUB=======================================

SET_Flag

BCFSTATUS,RP0;selectbank0;

MOVFFSR,W;

SUBLW0x21;

BTFSSSTATUS,Z;FSR=21H?

GOTOSET_F2;

;CALLArrangHour;---------------

BSFFlag,1;1

BCFFlag,2;0

BCFFlag,3;0

;------------------------------------

SET_F2

MOVFFSR,W;

SUBLW0x23;

BTFSSSTATUS,Z;FSR=23H?

GOTOSET_F3;

;CALLArrangMin;---------------

BCFFlag,1;0

BSFFlag,2;1

BCFFlag,3;0

;------------------------------------

SET_F3

MOVFFSR,W;

SUBLW0x25;

BTFSSSTATUS,Z;FSR=25H?

GOTOSET_END;

;CALLArrangSec;-----

BCFFlag,1;0

BCFFlag,2;0

BSFFlag,3;1

SET_END

RETURN;

;================SET_FlagEND=========================

;******************************************

;=====================================================

;NAME:

Time_sub(Key2_SUB)

;=====================================

Time_sub

BTFSSFlag,1;FSR=21h=HourL

GOTO$+2;

CALLHour_sub;

;-------------------

BTFSSFlag,2;FSR=23h=HourL

GOTO$+2;

CALLMin_sub;

;--------------------

BTFSSFlag,3;FSR=25h=HourL

GOTO$+2;

CALLSec_sub;

RETURN;

;===============Hour_sub=====================

Hour_sub

MOVFHourL,F;F->F

BTFSSSTATUS,Z;HourL=0?

GOTOHourL_NotZero;NoINDF--

MOVFHourH,F;

BTFSSSTATUS,Z;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

MOVWFHourL;9->HourL

GOTOHour_sub_end;

HourL_NotZero;

DECFHourL,F;

Hour_sub_end

RETURN

;===============Hour_subEND======================

Min_sub

MOVFMinH,F;

BTFSSSTATUS,Z;MinH=0?

GOTOMinH_NotZero;NO

MOVFMinL,F;F->F

BTFSSSTATUS,Z;MinL=0?

GOTOMinL_NotZero;No

Hour00;

(1)-00-

MOVLW.5;

MOVWFMinH;5->MinH

MOVLW.9;

MOVWFMinL;9->MinL

GOTOMin_sub_end;

MinH_NotZero;

MOVFMinL,F;F

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

当前位置:首页 > 求职职场 > 简历

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

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