综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读单片机专题PIC16F87X单片机实用软件与接口技术--C语言及其应用正文
 
第7章 秒表

 

7.2.2  程序清单
该源程序已在实验板上调试通过,读者可直接引用,并可利用软件编程的灵活性,加以拓展,实现更为复杂的功能。
#include<pic.h>
#include <math.h>
//
此程序实现计时秒表功能,时钟显示范围00.0099.99秒,分辨度:0.01
unsigned  chars0
s1s2s3
//
定义0.01 秒、0.1 秒、1秒、10秒计时器
unsigned  char   s[4]

unsigned  char  k
data sreg
unsigned   inti

consttable[10]={0xc0
0xf90xa40xb00x990x920x820XD80x800x90}
//
不带小数点的显示段码表
consttable0[10]={0X40
0X790X240X300X190X120X020X780X000X10}
//
带小数点的显示段码表
//TMR0
初始化子程序
voidtmint()
{
T0CS=0
//TMR0工作于定时器方式
PSA=1
//TMR0不用分频
T0IF=0
//清除TMR0的中断标志
T0IE=1
//TMR0中断允许
}
//spi
显示初始化子程序
voidSPIINIT()
{
PIR1=0

SSPCON=0x30

SSPSTAT=0xC0

//
设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送。与"74HC595,当其
//SCLK
从低到高跳变时,串行输入寄存器"的特点相对应
TRISC=0xD7
//SDO引脚为输出,SCK引脚为输出
TRISA5=0
//RA5引脚置为输出,输出显示锁存信号
}
//
系统其它部分初始化子程序
voidinitial()
{
TRISB1=0

TRISB2=0

TRISB4=1

TRISB5=1
//设置与键盘有关的各口的输入输出方式
RB1=0

RB2=0
//建立键盘扫描的初始条件
}
//SPI
传输数据子程序
void  SPILED(data)
{
SSPBUF=data
//启动发送
do{
 

}while(SSPIF==0)

SSPIF=0

}
//
显示子程序,显示4位数
voiddispaly()
{
RA5=0
//准备锁存
for(k=4
k>0k--)
{
data=s[k-1]

if(k==3)data=table0[data]
//第二位需要显示小数点
elsedata=table[data]

SPILED(data)
//发送显示段码
}
for(k=0
k<4k++)
{
data=0xFF

SPILED(data)
//连续发送4DARK,使显示好看一些
}
RA5=1
//最后给锁存信号,代表显示任务完成
}
//
软件延时子程序
void DELAY()
{
for(i = 3553
--i )continue
}
//
键扫描子程序
voidKEYSCAN()
{
while(1){
while(1)
{
dispaly()
//调用一次显示子程序
if ((RB5==0)||(RB4==0))break

}
DELAY()
//若有键按下,则软件延时
if ((RB5==0)||(RB4==0))break
//若还有键按下,则终止循环扫描,返回
 }
}
//
等键松开子程序
voidkeyrelax()
{
while(1){
dispaly()
//调用一次显示子程序
if ((RB5==1)&&(RB4==1))break

}//
为防止按键过于灵敏,每次等键松开才返回
}
//
系统赋值初始化子程序
voidinizhi()
{
s0=0x00

s[0]=s0

s1=0x00

s[1]=s1

s2=0x00

s[2]=s2

s3=0x00

s[3]=s3
//s0=s1=s2=s3=0,并放入显示缓冲数组中
sreg=0x00
//tmr0中断次数寄存器清0
}
//
中断服务程序
voidinterruptclkint(void)
{
TMR0=0X13
//TMR0写入一个调整值。因为写入TMR0后接着的
//
两个周期不能增量,中断需要3个周期的响应时间,
//
以及C语言自动进行现场保护要消耗周期
T0IF=0
//清除中断标志
CLRWDT()

sreg=sreg+1
//中断计数器加1
if(sreg==40)//
中断次数为40后,才对S0S1S2S3 操作
{
sreg=0

s0=s0+1

if(s0==10){
s0=0

s1=s1+1

if(s1==10){
s1=0

s2=s2+1

if(s2==10){
s2=0

s3=s3+1

if(s3==10)s3=0

}
}
}
}
s[0]=s0

s[1]=s1

s[2]=s2

s[3]=s3

}
//
主程序
main()
{
OPTION=0XFF

tmint()
//TMR0初始化


返回 上一页 下一页   信息发布:工号01   转引自: 【 】 【打印】 【关闭

关于我们 ┋ 友情链接


深圳市南山科技园深南花园A座14D
电话:0755-88305872 传真:0755-88305880
Copyright©2005-2009 无忧电子开发网版权所有

粤ICP备05064233号