初级会员
- 积分
- 87
- 金钱
- 87
- 注册时间
- 2015-12-5
- 在线时间
- 9 小时
|
1金钱
此代码是数码管显示时钟,利用四个按键实现暂停、切换、加、减。调用key();的时候,发现在单片机实训板上,四个按键均无反应。在此搞不懂什么原因造成,请大神们帮忙解答,谢谢,拜托拜托~
代码奉上:
#include <reg51.h>
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;
#define CONT1 80 //加减常量
#define CONT2 20 //连续加减速度变量
/***********************************************************************************************/
unsigned char code led_code[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,0X80,0X90,0xBF,
~0X40};
//定义0~9以其带小数点和“-”的显示码
unsigned char led_reg[8]={0,0,11,0,0,11,0,0}; //定义显示数码缓存器
unsigned char hour; //定义时钟变量
unsigned char min; //定义分钟变量
unsigned char sec; //定义秒钟变量
//unsigned char T;
unsigned char inputkey; //定义键盘输入存储变量
unsigned char shift_r; //定义键盘移位变量
unsigned char key_delay,flash_adj;
unsigned int T=0; //定义秒钟调整变量
unsigned char jian,jia,zt,qh;
unsigned int numqh,numzt;
bit task_f; //定义任务标志位
bit key_mark; //定义按键记录标志位
/************************************************************************************************
**function:delay(unsigned char i)
**功 能:延时程序
************************************************************************************************/
void delay(unsigned char i)
{ unsigned char j,k;
for(k=0;k<i;k++)
{ for(j=0;j<255;j++);
}
}
/************************************************************************************************
**function:led_show()
**功 能:显示函数
************************************************************************************************/
//void led_show( )
//{ static unsigned char led_shift=0x00; //定义静态变量
// P2=0xFF; //关闭数码管控制端口
// P0=led_code[led_reg[led_shift]]; //把字符代码送到P0端口
// switch(led_shift) //选择数码管控制位
// { case 0: P2_0=0;break; //控制左1数码管
// case 1: P2_1=0;break; //控制左2数码管
// case 2: P2_2=0;break; //控制左3数码管
// case 3: P2_3=0;break; //控制左4数码管
// case 4: P2_4=0;break; //控制左5数码管
// case 5: P2_5=0;break; //控制左6数码管
// case 6: P2_6=0;break; //控制左7数码管
// case 7: P2_7=0;break; //控制左8数码管
// default:break;
// }
// led_shift++; //数码管控制变量自加
// if(led_shift==0x08) //判断是否扫描一轮
// led_shift=0x00; //归零进行下一轮扫描
//}
void led_con(unsigned char i) //数码管位选控制程序
{ switch(i) //选择数码管控制位
{ case 0: P2=0xFE;break; //控制左1数码管
case 1: P2=0xFD;break; //控制左2数码管
case 2: P2=0xFB;break; //控制左3数码管
case 3: P2=0xF7;break; //控制左4数码管
case 4: P2=0xEF;break; //控制左5数码管
case 5: P2=0xDF;break; //控制左6数码管
case 6: P2=0xBF;break; //控制左7数码管
case 7: P2=0x7F;break; //控制左8数码管
default:break;
}
}
//************************************************************************************************
void led_show( )
{ static unsigned char led_shift=0x00; //定义静态变量
P2=0xFF; //关闭数码管控制端口
P0=led_code[led_reg[led_shift]]; //把字符代码送到P0端口
if(shift_r==(led_shift+1)) //判断哪位数码管需要闪烁
{ flash_adj++;
if(flash_adj<0x05) led_con(led_shift); //0~5时,调用数码管位选控制程序,数码管亮
else if(flash_adj<0x0A) P2=0XFF; //5~A时,数码管灭
else flash_adj=0x00; //清闪烁速度调整变量
}
else //所有数码管不需要闪烁
led_con(led_shift); //调用数码管位选控制程序
led_shift++; //数码管控制变量自加
if(led_shift==0x08) //判断是否扫描一轮
led_shift=0x00; //归零进行下一轮扫描
}
/************************************************************************************************
**function:clock()
**功 能:时钟函数
************************************************************************************************/
void clock()
{
if(T==20) //判断1秒钟是否到
{ T=0; //到了1秒钟,秒调整变量清零
sec++; //秒钟变量加1
if(sec>59) //判断1分钟是否到
{ sec=0; //到了1分钟,秒钟变量清零
min++; //分钟变量加1
if(min>59) //判断1小时是否到
{ min=0; //到了1小时,分钟变量清零
hour++; //时钟变量加1
if(hour>23) //判断24小时是否到
{ hour=0; //24小时到了,时钟变量清零
}
}
}
led_reg[0]=hour/10; //提取时钟的十位
led_reg[1]=hour%10; //提取时钟的个位
led_reg[3]=min/10; //提取分钟的十位
led_reg[4]=min%10; //提取分钟的个位
led_reg[6]=sec/10; //提取秒钟的十位
led_reg[7]=sec%10; //提取秒钟的个位
}
}
/***********************************************************************************************
中断与定时器
************************************************************************************************/
void T1_ini()
{
//AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1;
}
void timer1()interrupt 3
{
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
// TF1 = 0;
T++;
task_f = 1; //使能任务标志位
}
/************************************************************************************************
按键程序
************************************************************************************************/
void key()
{
if(zt==0)
{
delay(8);
if(zt==0)
{
numzt++;
if(numzt>1)numzt=0;
if(numzt==0)
TR0=0;
if(numzt==1)
TR0=1;
}
}
if(qh==0)
{
delay(10);
if(qh==0)
{
numqh++;
P1=0xff;
TR0=0;
if(numqh>4)numqh=1;
}
while(!qh);
}
if(jia==0)
{
P1=0xff;
delay(10);
if(jia==0&&numqh==1)
{
sec++;
if(sec>59)sec=0;
}
if(jia==0&&numqh==2)
{
min++;
if(min>59)min=0;
}
if(jia==0&&numqh==3)
{
hour++;
if(hour>23)hour=0;
}
while(!jia);
}
if(jian==0)
{
P1 =0xff;
delay(10);
if(jian==0&&numqh==1)
{
sec--;
if(sec<0)sec=59;
}
if(jian==0&&numqh==2)
{
min--;
if(min<0)min=59;
}
if(jian==0&&numqh==3)
{
hour--;
if(hour<0)hour=23;
}
while(!jian);
}
if(numqh==4)
{
TR0=1;
numqh=0;
}
}
/************************************************************************************************
mian()
************************************************************************************************/
void main()
{ P0=0X00; //P0端口输出低电平
P2=0XFF; //P2端口输出高电平
T1_ini();
while(1)
{
clock(); //调用时钟函数
// if (task_f) //判断任务标志位是否有效
// {
// task_f=0; //标志位清零
led_show(); //调用显示函数
// key(); //调用按键函数
}
}
//}
|
|