/*按钮计数试验和红外计数试验*/
#include<c8051f330.h>
#include<stdio.h>
#include<math.h>
#include<intrins.h>
#include<absacc.h>
int i,j,m;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;
long int k=0;
long int q=0,b=0,s=0,g=0,k1=0,k2=0;//用于存放千,百,十,个位的数
//用于存放临时数据
unsigned int D[11]={0x14,0x77,0x2c,0x25,0x47,0x85,0x84,0x37,0x04,0x05,0xff};
void sysclk(void)//系统时钟设置
{
CLKSEL=0X00;//选择内部高频振荡器
OSCICL=0X2D;//内部高频振荡器校准为20M HZ
OSCICN=0XC2;//2分频得到10M HZ系统时钟
}
void pio(void)//I/O初始化
{
P0MDIN=0X0FF;/*P0.0口是外设的高低电平,判断端口的高低电位计数也是数字输入*/
P0MDOUT=0X00;//0000 0000 位4,5,6,7必须是开漏0
P0SKIP=0XFE;//1111 1110 P0.0用到数字资源T1
P1MDIN=0XFF;//同P0口设置
P1MDOUT=0X00;//0000 0000 位0,1,2,3,4,5,6,7必须是开漏0
P1SKIP=0XFF;//1111 1111 P1.n全部被跳过
XBR0=0X00;//0000 0000 全都不连接到端口引脚
XBR1=0XE0;/*111O 0000,位7的弱上拉禁止;位6的交叉开关使能;位5的T1连接到端口引脚,其余都不连接到端口引脚*/
}
void t1(void)//定时器1初始化
{
TCON=0X40;//0100 0000 定时器控制寄存器,T1运行允许
TMOD=0X60;/*0110 0000 定时器方式寄存器,位6为选择外部输入引脚的负跳变加1,位5.4选择方式2:自动重装的8位定时器*/
CKCON=0X00;//定时器时钟控制寄存器
TL1=255;//计数值250数1次溢出,执行中断程序
TH1=255;//重载值250
}
void intt(void)//中断初始化
{
IE=0X88;//中断允许寄存器,允许所有中断请求
IP=0X08;//中断优先级寄存器,设置T1为高优先级
EIE1=0X00;//禁止所有扩展中断
EIP1=0X00;//扩展中断优先级均设为1
}
void delay(m)
{
for(i=0;i<1000;i++)
for(j=0;j<m;j++)
{;;}
}
void main(void)
{
PCA0MD &=~0X40;
sysclk();
pio();
intt();
t1();
P04=0;P05=0;P06=0;P07=0;//决定初始的亮暗
P04=1;P05=1;P06=1;P07=1;
P1=D[8];delay(500);//延时约0.24秒,表明所有初始化完成
P04=0;P05=0;P06=0;P07=0;
if(k<10000)
{q=k/1000;k1=k-1000*q;
b=k1/100;k2=k1-100*b;
s=k2/10;
g=k2-10*s;}
else if(k>=100)
{b=k1/100;k2=k1-100*b;
s=k2/10;
g=k2-10*s;}
else if(k>=10)
{s=k2/10;
g=k2-10*s;}
else g=k;
while(1)
{while(k>=10000)break;
P06=1;P07=0;//显示千位
P1=(q==0)?D[10]:D[q];delay(1);
P05=1;P06=0;//显示百位
P1=(q==0&&b==0)?D[10]:D[b];delay(1);
P04=1;P05=0;//显示十位
P1=(q==0&&b==0&&s==0)?D[10]:D[s];delay(1);
P07=1;P04=0;//显示个位,始终显
P1=D[g];delay(1);
}
}
void zd (void) interrupt 3//中断服务程序
{
TR1=0;//定时器1运行控制,0为禁止
k++;
if(k<=10000)
{q=k/1000;k1=k-1000*q;
b=k1/100;k2=k1-100*b;
s=k2/10;
g=k2-10*s;}
else if(k>=100)
{b=k1/100;k2=k1-100*b;
s=k2/10;
g=k2-10*s;}
else if(k>=10)
{s=k2/10;
g=k2-10*s;}
else g=k;
TF1=0;//定时器1不溢出
TR1=1;//定时器1运行控制,1为允许
}