搜档网
当前位置:搜档网 › 作息时间控制系统C++代码

作息时间控制系统C++代码

作息时间控制系统C++代码
作息时间控制系统C++代码

#include

#include

#define COM8279 XBYTE[0x5FFF] //使用外部存储器的方式访问8279 命令口和数据口

#define DATA8279 XBYTE[0x5EFF]

unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极键码unsigned char key;

sbit pb2=P1^1;

void init();

void check();

void delay(unsigned char);

void keyevent(unsigned char key);

void display();

unsigned char curr,ischanging,currinput; //当前时段的命令,1:修改模式0:计时、当前修改的位置

int count,sec,min,hour; //中断计数、秒、分、时

unsigned char time[11][4]={{0xFF,0x00,0x00,0x00},{0xFE,0x07,0x1E,0x00},

{0xFF,0x07,0x1E,0x0A},{0xFE,0x08,0x1E,0x00},{0xFF,0x08,0x1E,0x0a},

{0xFE,0x08,0x1E,0x00},{0xFF,0x09,0x1e,0x0a},{0xFE,0x09,0x14,0x00},

{0xFF,0x09,0x14,0x0a},{0xFE,0x09,0x28,0x00}, {0xFF,0x09,0x28,0x0a}};

void main(void)

{

init();

curr=0;

hour=7;

min=59;

sec=50;

COM8279=0x00; //8279初始化

COM8279=0x34; //分频参数设置

COM8279=0xDC; //清除显示RAM和FIFO

while(1) //程序主循环

{

P1=time[curr][0]; //不停执行当前时间段的事件

display(); //不停更新显示

}

}

void init() //系统初始化

{

TMOD=0x01; //定时器模式1选择

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1; //定时器中断

TR0=1; //定时器开启

EX1=1; //外部中断1开启

IT1=1; //选择外部中断1 边沿触发

EA=1; //中断总开关

}

void timer0() interrupt 1 //时钟中断50ms

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==20) //50msX20=1 s

{

count=0;

sec++;

if(sec==60)

{

min++;

sec=0;

if(min==60)

{

hour++;

min=0;

if(hour==24)

{

hour=0;

}

}

}

check(); //每秒检测一次当前时段事件

}

}

void check() //检查时间的触发条件

{

unsigned char i;

for(i=1;i<11;i++)

{

if(hour==time[i][1]&&min==time[i][2]&&sec==time[i][3]) //时分秒都相等的时候改变时段事件

{

curr=i; //修改当前时段标志用于主循环中输出命令

P1=time[i][0];

}

}

}

void display() //显示从右到左

{

COM8279=0x92; //写显示RAM,地址自加

DA TA8279=table[sec%10];

DA TA8279=table[sec/10];

DA TA8279=table[min%10]&0x7f; //控制点亮

DA TA8279=table[min/10];

DA TA8279=table[hour%10]&0x7f;

DA TA8279=table[hour/10];

}

void Int1ISR(void) interrupt 2

{

COM8279=0x40; //读FIFO RAM ,地址不自加key=DATA8279;

keyevent(key);

}

void input(unsigned char key)

{

switch(currinput) //判断当前输入的位置然后根据位置限制输入范围{

case 1:if(key>2)break;

hour=hour+10*key;

currinput++;

break;

case 2:if(hour==20&&key>3)break;

hour=hour+key;

currinput++;

break;

case 3:if(key>5)break;

min+=key*10;

currinput++;

break;

case 4:if(key>9)break;

min+=key;

currinput++;

break;

case 5:if(key>5)break;

sec+=key*10;

currinput++;

break;

case 6:if(key>9)break;

sec+=key;

currinput++;

break;

}

}

void keyevent(unsigned char key)

{

switch(key)

{

case 10:ischanging=1;

TR0=0; //停止计时

hour=0;

min=0;

sec=0;

currinput=1;

break;

case 11:ischanging=0;

TR0=1; //重开计时

break;

default:

if(key>9)break;

if(ischanging) input(key);

break;

}

display();

}

相关主题