请高人讲解红 {MOD}部分如何理解(C语言程序)

2019-07-16 04:31发布

本帖最后由 183283726 于 2012-9-25 10:17 编辑

times New Roman">// 使用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);  //主循环就负责显示            }  }}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lovezjf234
1楼-- · 2019-07-16 05:10
本帖最后由 lovezjf234 于 2012-9-25 12:29 编辑

<<8就相当于乘以256
lstcspring
2楼-- · 2019-07-16 07:05
1、更正一下<<8相当于乘以256
2、((unsigned long)g_iTMR0<<8)+g_TMR0_low
<<8给g_TMR0_low留出位置, 将_TMR0_low
加到g_iTMR0的低位
lovezjf234
3楼-- · 2019-07-16 11:00
lstcspring 发表于 2012-9-25 12:26
1、更正一下

sorry,看错了
eric.zhan
4楼-- · 2019-07-16 13:27
赞同解释。
草根白骨精
5楼-- · 2019-07-16 16:31
 精彩回答 2  元偷偷看……
183283726
6楼-- · 2019-07-16 18:34
lstcspring 发表于 2012-9-25 12:26
1、更正一下

不知道这方面的知识需要买那些书籍学习下呢,谢谢了

一周热门 更多>