51新入门求助!关于数码管和独立键盘模块
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit s2=P3^0;
uchar hex=0;
uchar counter=0;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
};
void delay(uchar msec);//延时函数的声明
void timer_ini(); //定时器的初始化
void display(uchar hex); //数码管的显示
void main()
{
timer_ini(); //初始化定时器
while(1)
{
if(s2==0)
{
delay(5);
if(s2==0) //按下s3,关闭定时器停止计时
{
TR1=0;
for(;!s2;);
TR1=1; //弹出s3,定时器开始计时
}
}
if(TF1==1) //如果定时器溢出
{
TF1=0; //置0
TH1=(65536-46082)/256;
TL1=(65536-46082)%256; //重新初始化
counter++ ;
}
if(counter==20)
{
counter=0;
hex++;
if(hex==16)
{
hex=0;
}
}
display(hex);
}
}
void delay(uchar msec)
{
uchar o_circle;
uchar i_circle;
for(o_circle=msec;o_circle>0;msec--)
for(i_circle=112;i_circle>0;i_circle--);
}
void timer_ini()
{
wela=1;
P0=0xf0;
wela=0;
P0=0XFF;
TMOD=0x10;// 定时器1,工作模式1,16位定时器
TH1=(65536-46082)/256;
TL1=(65536-46082)%256;
TR1=1;// Start timer NO.1 //定时50ms
}
void display(uchar hex)
{
dula=1;
P0=leddata[hex];
dula=0;
} 所实现功能应该是数码管前4位间隔1s显示0~F.按下独立键盘S2数码管停止跑数,松开s2数码管继续跑数 。不过该程序是按下s2后再松开,数码管停止计数。恳请大神帮帮小弟!谢谢!
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit s2=P3^0;
uchar hex=0;
uchar counter=0;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
};
void delay(uchar msec);//延时函数的声明
void timer_ini(); //定时器的初始化
void display(uchar hex); //数码管的显示
void main()
{
timer_ini(); //初始化定时器
while(1)
{
if(s2==0)
{
delay(5);
if(s2==0) //按下s3,关闭定时器停止计时
{
TR1=0;
for(;!s2;);
TR1=1; //弹出s3,定时器开始计时
}
}
if(TF1==1) //如果定时器溢出
{
TF1=0; //置0
TH1=(65536-46082)/256;
TL1=(65536-46082)%256; //重新初始化
counter++ ;
}
if(counter==20)
{
counter=0;
hex++;
if(hex==16)
{
hex=0;
}
}
display(hex);
}
}
void delay(uchar msec)
{
uchar o_circle;
uchar i_circle;
for(o_circle=msec;o_circle>0;msec--)
for(i_circle=112;i_circle>0;i_circle--);
}
void timer_ini()
{
wela=1;
P0=0xf0;
wela=0;
P0=0XFF;
TMOD=0x10;// 定时器1,工作模式1,16位定时器
TH1=(65536-46082)/256;
TL1=(65536-46082)%256;
TR1=1;// Start timer NO.1 //定时50ms
}
void display(uchar hex)
{
dula=1;
P0=leddata[hex];
dula=0;
} 所实现功能应该是数码管前4位间隔1s显示0~F.按下独立键盘S2数码管停止跑数,松开s2数码管继续跑数 。不过该程序是按下s2后再松开,数码管停止计数。恳请大神帮帮小弟!谢谢!
暂时只看到中断服务程序有错~~~~~
奇怪,这个问题我昨天貌似回答过了,怎么没了?难道是小编又发一次吗?
进去调试模式,仿真看看,有可能卡在 for(;!s2;;)出不来了。或者改变表达方式试试,如把 for(;!s2;;)改为 delay(2000)
自己多用心检查代码
谢谢
谢谢
没有,没有