[求助] 请高人讲解内容红色部分(C语言程序设计

183283726   2012-9-25 10:30 楼主
// 使用TMR0测量按键脉冲宽度。  晶体使用4M
#include "pic.h"
#include "myfuncs.h"
#include "seg74.h"
#define  K1  RB0 // K1宏定义为替代RB0,这样阅读程序更容易
  __CONFIG(HS & WDTDIS & LVPDIS);       // 设置用于ICD2调试的控制字
unsigned int g_iTMR0;    // 此整型变量用来扩展TMR0的计数范围
unsigned char g_TMR0_low=0;// 用来保存TMR0定时值
void interrupt ISR(void)
{
  if( T0IE && T0IF) // TMR0溢出
  {
    T0IF=0; // 清空标志位,使CPU能正确响应下次中断
    g_iTMR0++;
  }  
}
void main(void)
{
  unsigned long iPeriod=0; //周期变量
  unsigned char i=0;
  T0CS=0; // 选择CLKOUT信号为时钟源
  PSA=1; // Timer0不占用预分频器
  GIE=0;  // 总中断关闭
   
  SEG_BITSEL_PORT_DIR=0x00;  // 位选端口方向寄存器置为输出
  SEG_FONT_PORT_DIR=0x00;   //字形端口方向寄存器置为输出
  while(1)
  {
    // 初始状态显示四个0
    SEG_BITSEL_PORT = 0x0F;  //四个位都点亮
    SEG_FONT_PORT = 0b11000000; //显示0的字形码
    while(K1)
    { // K1未按则什么也不做,循环等待直到用户按下K1
    }
    // 运行到这里说明K1==0,K1按下了,那么就启动定时器开始定时
    TMR0=0; // Timer0计数值寄存器清零              
    g_iTMR0=0;  //TMR0扩充变量清零
    T0IF=0; // Timer0中断标志位清空  
    T0IE=1; // Timer0中断使能位置位,允许Timer0中断
    GIE=1;  // 总中断打开
   
    while(K1==0)
    {  //K1=0说明按钮还在按下状态,循环等待直到用户松开K1
    }
    g_TMR0_low=TMR0;  //立即保存当前TMR0值,因为TMR0会自动变化
    // g_iTMR0g_TMR0_low合成一个二十四位整型数 // 这句话又怎么理解呢?
iPeriod=((unsigned long)g_iTMR0<<8)+g_TMR0_low; //此语句怎么理解啊,是怎么换算的请帮忙分析讲解?
    iPeriod=iPeriod/1000; //除以1000后单位就是毫秒了,我们假设其值会小于等于9999
    for(i=0;i<10;i++)
    {
          DisplayData(iPeriod);  //主循环就负责显示   
         }
  }
}

回复评论 (5)

就是一个高位一个低位的合成。把高位左移8位加上低位就可以了。其实合成之后的数应该是32位,这样32位数一共四个字节,最高的一个字节的0,次高的是刚才左移8位的,低16位就是刚才的低位。
点赞  2012-9-25 12:46

回复 沙发 jishuaihu 的帖子

马马乎乎听懂点但不是很明白,这方面的知识需要买那些书籍来学习呢,谢谢
点赞  2012-9-25 14:05
这个不需要书吧?那本单片机或者计算机基础的书上都有!
点赞  2012-9-25 22:40

回复 4楼 jishuaihu 的帖子

上面的语句我到是能理解他的意思,不明白为什么要使用这种算法g_iTMR0和g_TMR0_low合成一个二十四位整型,这样使用的目的是什么
点赞  2012-9-26 09:06
16位的不够用呗。16位表示的数最大是65535,没仔细看你的程序,看看这个变量会不会超过65535
点赞  2012-9-26 12:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复