pic秒表c语言程序,PIC单片机计时秒表程序设计

a4c26d1e5885305701be709a3d33442f.png

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

(2016-11-19 15:24:52)

标签:

杂谈

//此程序实现计时秒表功能,时钟显示范围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()

{

http://www.ndiy.cn/

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;

}

}

}

}

}

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值