#include
//头文件
#include//访问绝对地址
#include
#include//输入输出流
#define COM8279 XBYTE[0X5FFF] //8279 控制命令地址
#define DATA8279 XBYTE[0X5EFF] //8279 数据地址
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar
0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳数码管代码 0-F
uint LED[]={0,0,0,0,0,0};//六个数码管的初值
uint Count=0; //定时器中断的次数
uint Key_State,T_State; //定义键的状态和定时器的状态
int second=0; //定时器 1 在 1S 内计数的次数
code
table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
void delay(uint ms) //延时子程序
{
uint i;
while(ms--)
for(i=0;i<120;i++);
}
void Display() //显示子程序
{
COM8279=0x92;//设置写显示命令,8279 命令字
LED[0]=second%10;
LED[1]=second%100/10;
LED[2]=second%1000/100;
LED[3]=second%10000/1000;
LED[4]=second%100000/10000;
LED[5]=second%1000000/100000;
for(i=0;i<6;i++)
DATA8279=table[LED[i]];//显示 display 数组
{
}
}
void Scan_Key() //键盘扫描子程序
{
COM8279=0x40;//读键盘命令(AI=0 仅读一个单元)
keyboard=DATA8279;
if(keyboard==0) //启动功能键被按下
{
delay(10); //去抖
Key_State==1;
TR0=1; //开启定时器/计数器 0
TR1=1; //开启定时器/计数器 1
}
else if(keyboard==1) //停止键被按下
{
delay(10); //延时去抖
Key_State==2;
TR0=0; //关闭定时器/计数器 0
TR1=0; //关闭定时器/计数器 1
}
else if(keyboard==2) //复位键被按下
{
delay(10); //延时去抖
Key_State==3;
TR0=0; //关闭定时器/计数器 0
TR1=0; //关闭定时器/计数器 1
TH1=0;
TL1=0;
}
//继续计数
else
{
TR0=1;
TR1=1;
}
}
void main() //主函数
{
COM8279=0xDC;//清除显示 RAM 和 FIFO 命令字
COM8279=0x34;//程序时钟编程命令 (11000)24 分频
COM8279=0x00;//键盘方式设置(8*8 字符显示左边输入,编码方式扫描键盘,双键
互锁)
COM8279=0x92;//设置写显示命令(AI=1 每次写入后地址自动加 1;显示 RAM 一
个单元地址 0010)
for(i=0;i<6;i++)
{
DATA8279=table[LED[i]];//数据地址,数码管置零
}
TMOD=0x51; //定时器 1 和 0 都工作在方式 1
TH0=(65536-50000)/256; //定时器 0 装入初值
TL0=(65536-50000)%256;
TH1=0; //定时器 1 装入初值
TL1=0;
EA=1; //开放总中断
ET0=1; //开放定时器/计数器 0 中断
ET1=1; //开放定时器/计数器 1 中断
TR0=0; //关闭定时器/计数器 0
TR1=0; //关闭定时器/计数器 1
while(1)
{
Scan_Key(); //调用键盘扫描子程序
if(T_State==1&&Key_State==1)//键状态为 1 且定时器状态为 1
{
T_State=0; //把定时器状态清 0
second=(TH1*256+TL1)*60;//计算转速
TH1=0; //清计数器
TL1=0;
}
if(Key_State==1|Key_State==2)//键状态为 1 或 2
Display(); //调用显示子程序
if(Key_State==3) //键状态为 3
{
for(i=0;i<6;i++)
DATA8279=table[0];//显示 display 数组
{
}
}
}
void T0timer() interrupt 1 //定时器 0 用于定时
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
Count++; //计数值加 1
if(Count>=20) //计数值到了 20 次,即 1S 就清 0, 并把定时器状态设为 1
{
Count=0;
T_State=1;
}
}
void T1timer() interrupt 3 //定时器 1 用于计数
{
TH1=0; //重装初值
TL1=0;
}