PIC16F877A数字时钟时钟程序培训讲学.docx
- 文档编号:10502843
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:30
- 大小:21.47KB
PIC16F877A数字时钟时钟程序培训讲学.docx
《PIC16F877A数字时钟时钟程序培训讲学.docx》由会员分享,可在线阅读,更多相关《PIC16F877A数字时钟时钟程序培训讲学.docx(30页珍藏版)》请在冰豆网上搜索。
PIC16F877A数字时钟时钟程序培训讲学
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC16F877A 数字 时钟 程序 培训 讲学