您当前的位置:五五电子网电子知识单片机-工控设备PIC单片机菜鸟学PIC单片机(三) 正文
菜鸟学PIC单片机(三)

菜鸟学PIC单片机(三)

点击数:7165 次   录入时间:03-04 11:53:39   整理:http://www.55dianzi.com   PIC单片机

菜鸟学PIC 单片机 (三)LCD时钟的总结,并由中断暂禁的后果说开去

 上回说到刚接触PIC没20天的菜鸟碧水长天准备"野心勃勃"写一段LCD显示精确时钟的但遭到无情狙击的故事,幸好得到这里行家的点拨,方能理清一点头绪,于是,今天就接着上回的故事,总结一些通用的注意事项,并对LCD显示精确时钟进行功能实现上的分析.

  

一、先总结一些细节的问题,再分析功能实现上的缺陷:

1. 关于中断现场的保护和恢复的问题
  由于movf指令可以影响STATUS,而W又要在现场保护过程中起中转寄存器的作用,因此,应先保护W,再保护STATUS,最后是保存其他现场变

量。保存的时候应注意,如果W的备份寄存器w_temp若不是位于快速存取区70H~7FH,假如w_temp定位为0x20,那么还需保证bank1,bank2,

bank3中的0xA0,0x120,0x1A0出的单元没有被派做他用。如果fsr_temp,pclath_temp等也不是定义在快速存取区的话,那么,需注意在备份FSR

,PCLATH之前,要确保当前操作在bank0处(当然,在其他bank也可,但必须注意在恢复现场的时候,也要保证在相同的bank中对备份积存器进

行操作,为了方便起见,建议控制在bank0处进行保存和恢复操作)。
   至于,备份寄存器若定位与快取区中,那么对bank没有要求,但对次序的要求仍然存在的。
  
  这是经过改进后的恢复和保存现场代码:
ORG     0x000                  ; processor reset vector
    nop                      ; ICD need
     goto    main              ; go to beginning of program

    ORG     0x004             ; interrupt vector LOCation
    movwf   w_temp            ; 先保存W
    movfw    STATUS            ; 再保存STATUS到W中
    clrf     STATUS          ; 注意该指令,确保对status_temp,pclath_temp的操作在bank0中
                      ; (如果备份寄存器定义在快取区中,可无取消此条clrf及恢复现场那条clrf指令)
    movwf    status_temp       ; 保存上上条指令备份在W中的STATUS
    movfw    PCLATH          ; 备份PCLATH
    movwf    pclath_temp
    movfw    FSR          ; 备份FSR
    movwf    fsr_temp      
    ; 可添加其他欲保护的变量

;******************** 中断服务代码
    btfss    INTCON,T0IE      ; 判断是否为T0中断
    goto    other_int
    btfss    INTCON,T0IF      ; it 's the time of T0 int
    goto    other_int
    bcf    INTCON,T0IF      ; 是T0中断,清除中断标志
    movlw    0x10          ; 微秒的高位字节加上定时时间 256x16分频=4096=0x1000的高位(0x10)
    addwf    us+1
    goto    end_int          
other_int              ; 可添加其他中断服务代码
    nop              ; other isr code CAN be added
;**********************************
end_int                  ; 恢复现场
    clrf    STATUS          ; 确保恢复现场的操作在bank0中(如果备份寄存器定义在快取区中,可无取消此条指令)
    ; 可添加恢复其他变量
    movfw    fsr_temp      ; 恢复FSR
    movwf    FSR
    movfw    pclath_temp      ; 恢复PCLATH(FSR和PCLATH的恢复无先后之分)
    movwf    PCLATH
    movfw   status_temp       ; 先恢复STATUS
    movwf    STATUS            ;
    swapf   w_temp,f
    swapf   w_temp,w          ; 最后恢复W,采用swapf是因为其不会影响STATUS
    retfie                    ; 中断返回

;*********


2.(保留区域,待添加)

--------------------------------------------

二、分析功能实现上的缺陷,并由中断响应及子程序暂禁中断所引起的问题说开去

  先将昨天贴的源程序的main部分的代码拿出来分析:
  主程序要实现的功能是显示时钟:   
                  HH MM SS
                  00:00:00
  定时中断每次产生4096us的增量,在中断服务中,将此时间增量累加在(us+1:us)两个相邻的字节中,由_clock子程序
对(us+1:us)进行及时判断,超出50ms即取走一个50ms的增量,并保留余量在(us+1:us)中以保证长时间定时精确.

主程序流程:

main
    nop
    call    _init         ; 调用初始化子程序,清缓冲区,实现液晶显示器和TMR0的初始化操作.
    call    _disp1        ; 调用显示字符"    HH MM SS    "的子程序
loop   
    call    _clock        ; 调用时间更新子程序,更新定时中断产生的时间累加值
    call    _convert      ; 调用时钟的小时,分,秒的BCD码转换子程序,并换成字符对应的ASCII码
    call    _disp2        ; 调用转换后的小时:分:秒字符的显示子程序
    goto    loop      ; 执行主循环

分析如下:
   由于_clcok和_convert码制字符转换子程序与时间显示_disp2子程序是前后的顺序关系的,在时间显示时,前两个子程序是不工作的,由于

LCM的慢显特性,使得该子程序执行时间较长,这样,即使中断定时时间已经累计到应改变显示结果的条件,但此刻_disp2若仍在显示上一时间

[1] [2]  下一页


本文关键字:单片机  PIC单片机单片机-工控设备 - PIC单片机

《菜鸟学PIC单片机(三)》相关文章>>>