数字电子时钟源程序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WSGR=0x00; //禁止所有的等待状态
}
//延时子程序
void delay(unsigned int pp)
{
unsigned int k,i;
for(k=0;k<pp;k++)
{
for(i=0;i<3997;i++);//延时1ms
}
}
//定时1初始化
void dingshi()
{
*T1CON=0x160C; //停止运行、连续增计数模式
*IMR=0x0002; //开INT2
*IFR=0xFFFF; //清全部中断,写1清0,参见P43
*MCRB=0xFE3C; //启用SPI功能引脚
*MCRA=0; //IOPA、IOPB配置为一般I/O功能
*MCRC=0; //IOPE、IOPF配置为一般I/O功能
*PFDATDIR=0x00FF; //IOPF设置为输入,并上拉
send(0x0400+(m/10));
send(0x0500+(m%10));
*PEDATDIR=0xFF04;delay(1000);*PEDATDIR=0xFF00;}}
if((*PFDATDIR & 0X0004)==0) //按下KEY2,则分钟减
{*T1CON &= ~0x0040;//停止定时器1
{*T1CON &= ~0x0040;}//停止定时器1
if((*PFDATDIR & 0X0008)==0) //若按下KEY3,则复位时钟
{*T1CON &= ~0x0040;//停止定时器1
for(n=0;n<8;n++) //显示全0
{send(d[n]);}
k=0;s=30;m=59;h=23 ;}
unsigned int d[8] = {0x0100,0x0200,0x030a,0x0400,0x0500,0x060a,0x0700,0x0800};
unsigned int w[8] = {0x0101,0x0204,0x030a,0x0400,0x0503,0x060a,0x0700,0x0804};
for(n=0;n<8;n++)//显示全0
{send(d[n]);}
while(1)
{
while(j==1)
{
if((*PFDATDIR & 0X0002)==0) //若按下KEY1,则启动定时器1
{*T1CON |= 0x0040;}//启动定时器1
if((*PFDATDIR & 0X0004)==0) //若按下KEY2,则暂停定时器1
#include "2407c.h"//数字电子时钟按Key1启动、Key2暂停、Key3复位、Key4调时
#define disable() asm(" setc INTM")//禁止全局中断
#define enable() asm(" clrc INTM")//允许全局中断
unsigned int k=0,s=30,m=59,h=23,j=1;
{m--;if(m==-1){m=59; h-=1;};
if(h==-1){h=23; };
send(0x0100+(h/10));
send(0x0200+(h%10));
send(0x0400+(m/10));
send(0x0500+(m%10));
*PBDATDIR=0xFF04;delay(1000);*PBDATDIR=0xFF00;}}
enable();//允许全局中断
//设置MAX7219到需要的工作状态
send(0x0C01);//关闭Shutdown模式,正常操作
send(0x09FF);//全部8个数字都采用解码模式
send(0x0A08);//亮度17/32
send(0x0B07);//扫描全部8个数码管
send(0x0F00);//关闭测试模式
if((*PFDATDIR & 0X0010)==0) //若按下KEY4
{ *T1CON &= ~0x0040;j++;}
}
while(j==2)
{
if((*PFDATDIR & 0X00010)==0) //若按下KEY4,则继续开启时钟
{*T1CON |= 0x0040;
j=1;k=0;s=s;m=m;h=h;}
if(k>999){k-=1000; s+=1;}//超过999ms,需要进位
if(s>59){s-=60; m+=1;}//超过59s,需要进位
if(m>59){m-=60; h+=1;}//超过59m,需要进位
if(h>23){h-=24; }
send(d[0]+h/10);
send(d[1]+(h%10));
void interrupt nothing()
{enable(); return; //允许总中断然后中断返回,因一进入ISR后,总中断就被自动关闭了
}
//主程序
void main(void)
{
unsigned int n;
disable();//关闭全局中断
chushihua();//初始化
dingshi();//初始化定时器1
*T1PER=0x0270; //(0x0270+1)*64/40 us =1ms
*T1CNT=0; //赋定时器初值
*EVAIFRA=*EVAIFRA; //清除可能存在的定时器1周期中断标志*EVAIMRA=*EVAIMRA|0x0080; //允许定时器1周期中断
}
//用SPI发送一个字符
void send(unsigned int data)
*PBDATDIR=0xFF08; //IOPB.3=LOAD = 1,上升沿锁存
}
//INT2中断服务程序
void interrupt GISR2()
{
unsigned int i;
switch(*PIVR)
{
case 0x0027://是定时器1周期中断
*EVAIFRA=*EVAIFRA|0x0080;//清除定时器1周期中断标志k += 1;
{
*PBDATDIR=0xFF00; //IOPB(MAX7219的LOAD引脚)输出低电平
*SPITXBUF=data; //发送一个字符
while((*SPISTS&0x40)!=0x40); //循环,直到SPI有中断,说明发送完毕
data = *SPIRXBUF; //空读SPIRXBUF,以清除SPI中断标志
}
}
}
send(d[3]+(m/10));
send(d[4]+(m%10));
send(d[6]+(s/10));
send(d[7]+(s%10));
break;
default:
break;
}
enable();//允许总中断,因一进入ISR后,总中断就被自动关闭了
return; //中断返回
}
//其他中断
*SPICCR=0x0F; //SPI软复位、上升沿输出数据、16位数据长度
*SPICTL=0x0E; //禁止过冲中断、允许TALK(发送)数据、主机模式、禁止SPI中断
//上升沿有延时
*SPIBRR=0x0F; //SPI波特率=SYSCLK/(SPIBRR+1)=2.5M
*SPICCR=*SPICCR|0x80; //SPI恢复操作,准备发送、接收下一个字符
if((*PFDATDIR & 0X0002)==0) //按下KEY1,则分钟加
{*T1CON &= ~0x0040;//Leabharlann Baidu止定时器1
{m++;if(m>59){m-=60; h+=1;};
if(h>23){h-=24; };
send(0x0100+(h/10));
send(0x0200+(h%10));
//系统初始化子程序
void chushihua (void)
{
asm (" clrc SXM"); //抑制符号位扩展
asm (" clrc OVM"); //累加器正常溢出
asm (" clrc CNF");//B0被配置为数据存储空间
*WDCR=0x00E8; //关闭看门狗
*SCSR1=0X00FC; //CLKIN=10M,CLKOUT=CLK*4=40M
相关文档
最新文档