程序实现的是,按键可以调节数码管倒计时的时间,第一排键盘按第二个键+1,第三个键-1,第四个键复位。现在是按一下第二个键+10,按一下第三个键-10,第四个键复位后48(我程序里初值设置的32啊...)有没有大神可以帮我改一改,找出错在哪里....
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0~9的段码表
unsigned char int_time; //记录中断次数
unsigned int second; //储存秒
static unsigned char num;
static unsigned char second_set=32; //设置的数
sbit stcp1=P2^2;
sbit ds1=P2^1;
sbit shcp1=P2^0;
sbit stcp2=P2^5;
sbit ds2=P2^4;
sbit shcp2=P2^3;
sbit w1=P1^5; //数码管1,位选接P1^5
sbit w2=P1^6; //数码管2,位选接P1^6
sbit a1=P1^4;
uchar code we1[16]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}; //控制LED的亮灭
uchar code we2[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; //控制LED的亮灭
void delay(uint ms)
{
uint x,y;
for(x=ms;x>0;x--)
for(y=255;y>0;y--);
}
/***********************************************************************
函数功能:显示秒
入口参数:k
出口参数:无
************************************************************************/
void DisplaySecond(unsigned char k)
{
//w1=0;
// w2=1; //P2.6引脚输出低电平, DS6点亮
P2=0xbf;
P0=Tab[k/10]; //显示十位
delay(25);
//w2=0;
//w1=1; //P2.7引脚输出低电平, DS7点亮
P2=0x7f;
P0=Tab[k%10]; //显示个位
delay(25);
P2=0xff; //关闭所有数码管
}
/***********************************************************************
函数功能:1*4键盘扫描
入口参数:k
出口参数:无
************************************************************************/
unsigned char Keyscan() //行列式键盘扫描
{
unsigned char i, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}; //让矩阵键的每行为低电平
P1=Buffer[0];//选择第一排按键
temp = 0x01;
for(i=0; i<4; i++)
{
if(!(P1 & temp)) //判断 P1 口高 4 位某一行为低电平
{
delay(10);
if(!(P1 & temp))
{
return (i); //返回键码
}
}
temp <<= 1;
}
return 0;
}
/***********************************************************************
函数功能:按键功能选择
入口参数:k
出口参数:无
************************************************************************/
void Keyswitch(void)
{
switch(num)
{
case 0:
//second_set=0;
break;
case 1:
second_set=second_set+1;
break;
case 2:
second_set=second_set-1;
break;
case 3:
second_set=48;
break;
default:
break;
}
}
void QR0_5951(uchar num1)
{ uchar j;
for (j=0;j<8;j++)
{
num1=num1<<1 ;
ds1=CY;
shcp1=1;//上升沿发生移位
shcp1=0;
}
}
void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示
{ stcp1=0;
stcp1=1;//上升沿将数据送到输出锁存器
stcp1=0; }
void QR1_5952(uchar num2)
{ uchar j;
for (j=0;j<8;j++)
{ num2=num2<<1;
ds2=CY;
shcp2=1;//上升沿发生移位
shcp2=0;
}
}
void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示
{ stcp2=0;
stcp2=1;//上升沿将数据送到输出锁存器
stcp2=0;
}
void main()
{ //uchar i;
TMOD=0x01; //使用定时器T0
TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微秒
//=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1; //开启总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0开始运行
int_time=0; //中断次数初始化
second=32; //秒初始化
while(1)
{
num=Keyscan() ; //判断是否有键盘按下
Keyswitch(); //计时的时间调节
DisplaySecond(second);//调用秒的显示子程序
/*for(i=0;i<2;i++)
{
QR0_5951(80);
OUT_5951();
delay(1);
QR1_5952(60);
OUT_5952();
delay(1);
} */
}
}
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
void interserve(void ) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
int_time ++; //每来一次中断,中断次数int_time自加1
if(int_time==10) //够20次中断,即1秒钟进行一次检测结果采样
{
int_time=0; //中断次数清0
second--; //秒减1
QR0_5951(we1[second/2]);
OUT_5951();
//delay(1);
QR1_5952(we2[second/2]);
OUT_5952();
//delay(1);
if(second==0)
second =second_set; //秒等于60就返回0
}
TH0=(65536-46083)/256; //重新给计数器T0赋初值
TL0=(65536-46083)%256;
TR0=1; //启动定时器T0
}
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0~9的段码表
unsigned char int_time; //记录中断次数
unsigned int second; //储存秒
static unsigned char num;
static unsigned char second_set=32; //设置的数
sbit stcp1=P2^2;
sbit ds1=P2^1;
sbit shcp1=P2^0;
sbit stcp2=P2^5;
sbit ds2=P2^4;
sbit shcp2=P2^3;
sbit w1=P1^5; //数码管1,位选接P1^5
sbit w2=P1^6; //数码管2,位选接P1^6
sbit a1=P1^4;
uchar code we1[16]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}; //控制LED的亮灭
uchar code we2[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; //控制LED的亮灭
void delay(uint ms)
{
uint x,y;
for(x=ms;x>0;x--)
for(y=255;y>0;y--);
}
/***********************************************************************
函数功能:显示秒
入口参数:k
出口参数:无
************************************************************************/
void DisplaySecond(unsigned char k)
{
//w1=0;
// w2=1; //P2.6引脚输出低电平, DS6点亮
P2=0xbf;
P0=Tab[k/10]; //显示十位
delay(25);
//w2=0;
//w1=1; //P2.7引脚输出低电平, DS7点亮
P2=0x7f;
P0=Tab[k%10]; //显示个位
delay(25);
P2=0xff; //关闭所有数码管
}
/***********************************************************************
函数功能:1*4键盘扫描
入口参数:k
出口参数:无
************************************************************************/
unsigned char Keyscan() //行列式键盘扫描
{
unsigned char i, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}; //让矩阵键的每行为低电平
P1=Buffer[0];//选择第一排按键
temp = 0x01;
for(i=0; i<4; i++)
{
if(!(P1 & temp)) //判断 P1 口高 4 位某一行为低电平
{
delay(10);
if(!(P1 & temp))
{
return (i); //返回键码
}
}
temp <<= 1;
}
return 0;
}
/***********************************************************************
函数功能:按键功能选择
入口参数:k
出口参数:无
************************************************************************/
void Keyswitch(void)
{
switch(num)
{
case 0:
//second_set=0;
break;
case 1:
second_set=second_set+1;
break;
case 2:
second_set=second_set-1;
break;
case 3:
second_set=48;
break;
default:
break;
}
}
void QR0_5951(uchar num1)
{ uchar j;
for (j=0;j<8;j++)
{
num1=num1<<1 ;
ds1=CY;
shcp1=1;//上升沿发生移位
shcp1=0;
}
}
void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示
{ stcp1=0;
stcp1=1;//上升沿将数据送到输出锁存器
stcp1=0; }
void QR1_5952(uchar num2)
{ uchar j;
for (j=0;j<8;j++)
{ num2=num2<<1;
ds2=CY;
shcp2=1;//上升沿发生移位
shcp2=0;
}
}
void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示
{ stcp2=0;
stcp2=1;//上升沿将数据送到输出锁存器
stcp2=0;
}
void main()
{ //uchar i;
TMOD=0x01; //使用定时器T0
TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微秒
//=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1; //开启总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0开始运行
int_time=0; //中断次数初始化
second=32; //秒初始化
while(1)
{
num=Keyscan() ; //判断是否有键盘按下
Keyswitch(); //计时的时间调节
DisplaySecond(second);//调用秒的显示子程序
/*for(i=0;i<2;i++)
{
QR0_5951(80);
OUT_5951();
delay(1);
QR1_5952(60);
OUT_5952();
delay(1);
} */
}
}
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
void interserve(void ) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
int_time ++; //每来一次中断,中断次数int_time自加1
if(int_time==10) //够20次中断,即1秒钟进行一次检测结果采样
{
int_time=0; //中断次数清0
second--; //秒减1
QR0_5951(we1[second/2]);
OUT_5951();
//delay(1);
QR1_5952(we2[second/2]);
OUT_5952();
//delay(1);
if(second==0)
second =second_set; //秒等于60就返回0
}
TH0=(65536-46083)/256; //重新给计数器T0赋初值
TL0=(65536-46083)%256;
TR0=1; //启动定时器T0
}