📄 timer00.c
字号:
//------------------------------------------------------------------------------
// Project: TIMER FOR ATMEL 89S52 MCU AND THE DISPLAY WITH MAX7219
//
// Filename: Timer00.c
// Version: 1.0.0
// Description:
//
// CPU Frequency: 6 MHz
//
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Header files
//------------------------------------------------------------------------------#include <stdio.h>//
#include <string.h>//
#include <absacc.h> //
#include <stdlib.h>//
#include <regx52.h>
//#include <float.h>
//#include <math.h>
void Initial();
unsigned char keysub(void);
void keyoff(void);
void keykey(unsigned char tmp);
unsigned int Dis7219(unsigned int a, unsigned int b);
void Delay(unsigned int a);
sbit led1=P3^7;
sbit led2=P3^6;
sbit speaker=P2^4;
unsigned char keytemp=0xff;
unsigned char keynum=0x00;
unsigned char symbol=0; //设定键值
unsigned char key=0x00;
main(void){
unsigned int data x=1;
unsigned int data y=0x0014;
unsigned char i=0;
unsigned int data j=0x003b;
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
Initial();
speaker=1;
START:
while(symbol==0){
led1=1;led2=1;i=0; //Light the diodes
while(i<58){
Delay(100);
i++;
if (symbol==1){
break;
}
}
led1=0;led2=0;i=0;
while(i<58){
Delay(100); //half a second
i++;
if (symbol==1){
break;
}
}
x--;
if (x==0&&y==0){
break;
}
if ((x==0)&&(y!=0)){
y--;
x=0x003b;
}
Dis7219(y,x);
}
Dis7219(y,x);
while((x==0)&&(symbol==0)){
speaker=0;i=0;
while(i<58){
Delay(100);
i++;
}
speaker=1;i=0;
while(i<58){
Delay(100);
i++;
}
}
EX0=0;j=0;speaker=1;
while(symbol==1){
keytemp=y;
keysub();
if (key==1){ //Done key P0.6
speaker=0;
Delay(500);
Delay(500);
speaker=1;
break;
}
else if(key==2){ // Increasing key P0.5
y=y+keynum;
x=0;
}
else if(key==3){ // Decreasing key P0.4
y=y-keynum;
x=0;
}
else if(key==4){ // Configuring key P0.7
}
if (y>=99){
y=0;
keytemp=0;
}
keynum=0;
Dis7219(y,x);
}
symbol=0;EX0=1;x=1;
keynum=0;
goto START;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//键盘键值判断
unsigned char keysub(void){ //传回键值
unsigned char temp1,temp2;//存储P1值
temp1=P1; //读P1口
Delay(20); //延时10ms,防抖动
temp2=P1;
if((temp1==temp2)&&(temp2!=0xff))
{//有键按下
if((temp2&0X40)==0){
key=1; //确认键---第6位
keyoff(); //键松开
}
else if((temp2&0X20)==0){
key=2; //增---第5位
keykey(temp2); //连续减
}
else if((temp2&0X10)==0){
key=3; //减---第4位
keykey(temp2); //连续增
}
else if((temp2&0X80)==0){
key=4; //开/停键---第7位
keyoff();
}
} //有键按下
else{ //无键按下
key=9;
keynum=0; //恢复keynum为0,取消连续键值
}
return(key); //返回键值
}
//%%%%%%判断键是否松开%%%%%%%%%%%%%%%%%%%%%%
void keyoff(void)
{
unsigned char temp;
while(1)
{
Delay(100); //延时200ms,以保证按确认键,开停键松开后才进入程序
temp=P1;
//判断健是否松开,如果松开,则退出循环
if(temp==0xff)
{ break;}
}
}
//%%%%%%%判断键是否连续按下%%%%%%%%%%%%%%
void keykey(unsigned char tmp){
unsigned char temp;
Delay(3000); //延时300us
temp=P1; //再读键值
//如果松开
if(temp!=tmp){
keynum++;//keynum=0;
}
else //没松开
{
keynum++;
if(keytemp>=20){
keynum=10;
}
if(keytemp<=5){
Delay(250);Delay(250);Delay(250);
}
else if(keytemp<=10){
Delay(250);Delay(250);
}
else if(keytemp<=15){
Delay(50);
}
else{
Delay(40);
}
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Initial(void){
SCON=0x50;TMOD=0x11;PCON=0;
TCON=0x00; //set to specify level-sensitive detection (i.e., zero level).
T2CON=0x34;
EA=1;ET0=1;EX0=1;symbol=0; //
RCAP2H=0xfe;
RCAP2L=0xdf;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Ext0_INT (void) interrupt 0{
symbol=1;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Timer0_INT(void) interrupt 1{
symbol=0;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Delay(unsigned int a){ //crystal 4M; Instruction Cycles:1us; a=1, time=1.019ms
unsigned int i=0;
unsigned int j=0;
unsigned int m=20;
while(i<a+m)
i++;
while(j<(a+m))
j++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -