#include "at89x52.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code acLEDCS[]={0xe0,0xd0,0xb0,0x70}; /* 位选地址码,“0”有效,位选接的是P2口高4位 */
uchar code acLedSegCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};/* 段码 */
uchar acLED[4]; /* 显示缓冲区 */
char cScanIndex; /* 位选指针0~3 */
uchar cKeyCode; /* 键值 */
uint nDelayKey; /* 键盘延时变量,为定时中断间隔时间的整数倍 */
uchar cKeySec; /* 按键长按几秒 */
bit bPush; /* 是否按键标志 */
char bSetMode;
char cMode; /* 显示方式变量,0~3对应4种方式 */
uint nTimer; /* 定时计数变量,为定时中断间隔时间的整数倍 */
uint cData[2] = {18,57};
//根据不同题目再添加一些变量
uint sec=0, min =0;
/************************* 数码管显示函数 ***************************/
void display()
{ // 添加要显示的数据
acLED[0] = acLedSegCode[cData[0] /10%10]; /* LED显示第1位 */
acLED[1] = acLedSegCode[cData[0] %10];/* LED显示第2位 */
acLED[2] = acLedSegCode[cData[1] /10%10]; /* LED显示第3位 */
acLED[3] = acLedSegCode[cData[1]%10]; /* LED显示第4位 */
}
/******************** 按键处理程序 ******************/
void DisposeKEY()
{
switch(cKeyCode)
{
case 0xC0://P20 /* 例如:KeyADD */
if(bSetMode == 0 && cData[0] <= 24)
cData[0]+=1;
else if(bSetMode == 1 && cData[1] <= 60)
cData[1]+=1;
break;
case 0xA0://P21 /* 例如:KeySUB */
if(bSetMode == 0 && cData[0])
cData[0]-=1;
else if(bSetMode == 1 && cData[1])
cData[1]-=1;
break;
case 0x60://P22 /* 例如:KeyMode */
bSetMode++;
bSetMode &= 1;
break;
}
cKeyCode = 0;
}
/************************** 主函数 *****************************/
void main(void)
{
/**************** 定时器初始化 *******************/
TMOD= 0x11;
TH1 = -9; /* 16位定时器,晶振22.1184M,22118400/12/256 = 7200 = 18*400 每秒钟溢出400次,每2.5ms中断一次*/
TR1 = 1;
ET1 = 1;
EA = 1; /* 开总中断 */
display(); /* 显示初始界面 */
while(1)
{
if(cKeyCode)
{
DisposeKEY(); /* 响应按键操作 */
}
if(sec >= 60)
{
min+=1;
cData[1] += 1;
sec = 0;
}
if(min >= 60)
{
cData[0] += 1;
min = 0;
}
if(cData[1] == 60)
{
cData[0] += 1;
cData[1] = 0;
}
if(cData[0] == 24)
{
cData[0] = 0;
cData[1] = 0;
}
display();
}
}
/****************** 多任务时序控制时钟中断 *********************/
void IntTimer() interrupt 3
{
TH1 = -9; /* 重装初值,保证每2.5ms中断一次*/
P0 = 0; // 清段选再送位选(消影)
//*************************中断次数计数******************
nTimer++;
/*********************** 定时扫描独立按键 ************************/
P2_3=0;
if((P2 & 0xE0) != 0xE0) // 判断是否有按键动作,P22、P21、P20没有按键时为高电平(逻辑1)
{
nDelayKey++;
if((nDelayKey == 64 || nDelayKey % 64 == 0) && bPush == 0) // 延时削颤10ms,每160ms连加连减
{
cKeyCode = P2 & 0xE0;// 取键值P20 0x06、P21 0x05、P22 0x03
}
}
/***********************************************/
else // 松键,清按键相关变量
{
nDelayKey = 0;
cKeyCode = 0;
cKeySec = 0;
bPush = 0;
P2_3=1;
}
//*************************显示刷新******************
P2 = acLEDCS[cScanIndex]|0x0F; /* 送位选数据 */
if(nTimer <= 200)
P0 = acLED[cScanIndex++] | 0x80;
else if(nTimer <= 400)
{
P0 = acLED[cScanIndex++]; /* 送显示数据,位选指针移位 */
if(nTimer == 400)
{
sec+=1;
nTimer=0;
}
}
cScanIndex &= 3; /* 位选指针回位 */
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
zy2.rar (14个子文件)
zy2
zy2.uvopt 5KB
Objects
zy2.hex 2KB
zy2.build_log.htm 989B
zy2.lnp 87B
main.obj 8KB
zy2 7KB
Listings
main.lst 7KB
zy2.m51 8KB
zy2.uvgui.peace 69KB
zy2.uvproj 12KB
fz2
fz.pdsprj.LAPTOP-LLLG6L9K.peace.workspace 3KB
fz.pdsprj 16KB
Last Loaded fz.fv8.21.pdsbak 16KB
main.c 4KB
共 14 条
- 1
资源评论
ldtouzi
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功