云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 菜鸟学PIC单片机(二)

菜鸟学PIC单片机(二)

  • 62 次阅读
  • 3 次下载
  • 2026/1/27 6:32:01

菜鸟学PIC单片机(二):LCD 时钟 (功能设计过程中的致命bug)

结合昨天LCM的驱动编写过程,小弟今天准备利用定时器用LCM来显示时钟. 呵呵,下午边调变改,有些收获和疑问,现一并写出来,请行家指点.

功能很明确:利用TMR0实现精确定时,_clock子程序更新时间,LCM显示时间

但是,遇到了一些问题:

1.在ICD和demo板上调试运行,结果显示应为 HH MM SS 00:00:00

且ss对应下的秒区字符应该每1秒改变一次.但是,运行的结果如下: 1) 参考本例的源程序,其他一切不变,只是预分频为1:8(原来设计为1:16) 那么,应该是每0.5秒变化一次,但是据小弟多次观察,运行的时候,SS的秒区

为每分钟(人工大概估计)计数一次,及秒表变成了分表,另外,在每分钟里,SS区的字符会有2到3次调变 比如0x(x为当前计数显示值)变成24,一晃而过,又恢复显示0x.

(a)小弟仔细检查定时,转换,显示的程序流程,没有发现为何没半秒显示计数变成了每分钟显示计数的原因; (b)至于SS秒区的字符会跳变,小弟认为可能是LCM的控制问题.

2. 在主程序main中,loop循环中的第一条指令clrwdt会引起一些问题: main nop

call _init ; 调用初始化子程序

call _disp1 ; 调用显示字符\的子程序 loop clrwdt ; ★★★注意!!该语句的功能,小弟很疑惑 call _clock ; 调用时钟计算子程序

call _convert ; 调用时钟的小时,分,秒的BCD码转换子程序 call _disp2 ; 调用转换后的小时:分:秒字符的显示子程序 goto loop 所引起的问题如下:

1)首先,我在ICD烧录时,在option选项中是关掉WDT的;

2)若去掉该语句,程序仍然同前文1.所描述的情况,唯一变化的是,时间显示区的字符跳变 从SS区换成HH区,即小时区下的00会在分钟之内,好几次跳变成52. 3)以为是偶然,于是禁用和启用该语句两次,现象没变.

小弟认为,既然分频器给了TMR0,烧录时也关了WDT,那么,该语句所起的作用是什么呢?

3. 其实该程序存在一个致命的问题,吃晚饭时,小弟想到了症结所在. 呵呵,小弟先不点出来,愿意和大家一起商讨解决的好办法......

完整的源程序

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

; Filename:time0.asm ; Date:11-15-2004 ; File Version: v1.0 ;

; Author: Liyu ; Company: 614 ; ;

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

; Files required: ; ; ;

;********************************************************************** ; ; Notes: ; ; ; ;

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

list p=16f877 ; list directive to define processor

#include ; processor specific variable definitions

;__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;meanings:_CP_OFF,Code_Protect Off;_WDT_ON,WatchDog On;_BOOEN_ON, ;_PWRTE_ON,Power_On delay timer On;_RC_OSC,RC OSC surge;

;***** 变量定义

w_temp EQU 0x20 ; variable used for context saving status_temp EQU 0x21 ; variable used for context saving pclath_temp EQU 0x22 fsr_temp EQU 0x23 RS EQU 1 RW EQU 2 E EQU 3

;************************** cblock 0x70

hour ; 定义小时变量 min ; 定义分钟变量 sec ; 定义秒变量 ms50 ; 定义50ms变量 us :2 ; 定义微秒变量

count ; 定义计数器变量(查字符表用) tmp1 ; 定义临时变量,显示字符用 x ; 延时计数器变量 y ; 延时计数器变量

bin ; BCD码转换前的二进制寄存器 bcd_h ; BCD码转换后的高位 bcd_l ; BCD码转换后的低位 count1 ; 计数器 endc

;*********时钟显示缓冲区变量定义

cblock 0x24 ; 定义LCM待显示的时间字符缓冲区 space1 space2 space3

space4 ; 前面四个空格

hour_h ; xx小时的第一个字符变量 hour_l ; xx小时的第二个字符变量 colon1 ; 冒号\

min_h ; xx分钟的第一个字符变量 min_l ; xx分钟的第二个字符变量 colon2 ; 冒号\

sec_h ; xx秒的第一个字符变量 sec_l ; xx秒的第二个字符变量 space5 ; 后面四个空格 space6 space7 space8 endc

;*******************************************************************888 ORG 0x000 ; processor reset vector

nop ; ICD need

goto main ; go to beginning of program

ORG 0x004 ; interrupt vector location

movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register movf PCLATH,w movwf pclath_temp movf FSR,w

movwf fsr_temp ; 保护现场(此处恢复现场时,应将W最后从w_temp中恢复,谢版的提醒)

;********TMR0中断服务代码

btfss INTCON,T0IE ; 判断是否为T0中断 goto other_int

btfss INTCON,T0IF ; T0是否溢出 goto other_int

bcf INTCON,T0IF ; 是T0中断,清除中断标志

movlw 0x10 ; 256x16分频=4096us=0x1000us的高位(0x10) addwf us+1 ; 微秒的高位字节加上定时时间 goto end_int

other_int ; 其他中断服务代码 nop ; other isr code can be added

end_int ; 恢复现场

movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f

swapf w_temp,w ; restore pre-isr W register contents movf pclath_temp,W movwf PCLATH movf fsr_temp,W movwf FSR

retfie ; return from interrupt

;****************************************** ;主程序:LCM 时钟 main nop

call _init ; 调用初始化子程序

call _disp1 ; 调用显示字符\的子程序

搜索更多关于: 菜鸟学PIC单片机(二) 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

菜鸟学PIC单片机(二):LCD 时钟 (功能设计过程中的致命bug) 结合昨天LCM的驱动编写过程,小弟今天准备利用定时器用LCM来显示时钟. 呵呵,下午边调变改,有些收获和疑问,现一并写出来,请行家指点. 功能很明确:利用TMR0实现精确定时,_clock子程序更新时间,LCM显示时间 但是,遇到了一些问题: 1.在ICD和demo板上调试运行,结果显示应为 HH MM SS 00:00:00 且ss对应下的秒区字符应该每1秒改变一次.但是,运行的结果如下: 1) 参考本例的源程序,其他一切不变,只是预分频为1:8(原来设计为1:16) 那么,应该是每0.5秒变化一次,但是据小弟多次观察,运行的时候,SS的秒区 为每分钟(人工大概估计)计数一次,及

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com