新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PIC单片机计时秒表程序设计

PIC单片机计时秒表程序设计

作者:时间:2012-12-11来源:网络收藏

//此程序实现功能,00.00~99.99秒,分辨度:0.01秒

#include "p18f458.h"

unsigned char s[4]; //定义0.01 秒、0.1 秒、1秒、10秒计时器
unsigned char k,data,sreg;
unsigned int i;
const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不带小数点的显示段码表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//带小数点的显示段码表

void clkint(void);

//TMR0初始化子程序
void tmint()
{
T0CON=0XCF; //设定TMR0L工作于8位定时器方式
//内部时钟,TMR0不用分频
INTCON=0X20; //总中断禁止,TMR0中断允许,清除TMR0的中断标志
INTCON2bits.TMR0IP=1; //TMR0中断高优先级
RCONbits.IPEN=1; //使能中断优先级
}

//系统其它部分初始化子程序
void initial()
{
TRISA=0x00; //A口设置为输出
TRISB=0XF0; //RB1输出,RB4输入
TRISC=0x00; //SDO引脚为输出,SCK引脚为输出
TRISE=0x00; //E口设置为输出
SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4
SSPSTAT=0xC0; //时钟下降沿发送数据
PIR1=0; //清除SSPIF标志
data=0X00; //待显示的寄存器赋初值
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; //将K1,K2,K3,K4四条列线置0
}

//SPI传输数据子程序
void SPILED(char data)
{
SSPBUF=data; //启动发送
do
{
;
}while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
}

//显示子程序,显示4位数
void dispaly()
{
PORTAbits.RA5=0; //准备锁存
for(k=0;k4;k++)
{
data=s[k];
if(k==2) data=table0[data]; //个位需要显示小数点
else data=table[data];
SPILED(data); //发送显示段码
}
for(k=0;k4;k++)
{
data=0xFF;
SPILED(data); //连续发送4个DARK,使显示好看一些
}
PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成
}

//软件延时子程序
void DELAY()
{
for(i = 3553; --i ;)
continue;
}

//键扫描子程序
void KEYSCAN()
{
while(1)
{
dispaly(); //调用一次显示子程序
while(PORTBbits.RB4==0)
{
DELAY(); //若有键按下,则软件延时
break;
}
if (PORTBbits.RB4==0) break; //若还有键按下,则终止循环扫描,返回
}
}

//等键松开子程序
void keyrelax()
{
while(1)
{
dispaly(); //调用一次显示子程序
if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回
}
}

/*高优先级中断向量*/
#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
_asm
goto clkint //跳到中断程序
_endasm
}

//中断服务程序
#pragma code
#pragma interrupt clkint
void clkint()
{
TMR0=0X13; //对TMR0写入一个调整值。因为写入TMR0后接着的
//两个周期不能增量,中断需要3个周期的响应时间,
//以及C语言自动进行现场保护要消耗周期
INTCONbits.T0IF=0; //清除中断标志
sreg=sreg+1; //中断计数器加1
if(sreg==40) //中断次数为40后,才对S0,S1,S2,S3 操作
{
sreg=0;
s[0]=s[0]+1;
if(s[0]==10)
{
s[0]=0 ;
s[1]=s[1]+1;
if(s[1]==10)
{
s[1]=0 ;
s[2]=s[2]+1;
if(s[2]==10)
{
s[2]=0;
s[3]=s[3]+1;
if(s[3]==10) s[3]=0;
}
}
}
}
}

51单片机相关文章:51单片机教程


c语言相关文章:c语言教程


单片机相关文章:单片机教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭