// 使用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_iTMR0和g_TMR0_low合成一个二十四位整型数
// 这句话又怎么理解呢?
iPeriod=((unsigned long)g_iTMR0<<8)+g_TMR0_low; //此语句怎么理解啊,是怎么换算的请帮忙分析讲解?
iPeriod=iPeriod/1000; //除以1000后单位就是毫秒了,我们假设其值会小于等于9999
for(i=0;i<10;i++)
{
DisplayData(iPeriod);
//主循环就负责显示
}
}
} |