单片机我学的不好,感觉自己写的没毛病,但是不知道哪里有问题就是出不来
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
uchar temp,a,key; //暂存器
char ctime=0;
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay_ms(uint ms) //延时函数,延时一段时间
{
uint j;
while(ms--)
{for(j=0;j<120;j++);
}
}
void main()
{
TMOD=0X01; //设定定时器为工作方式1
TH0=(65536-45872)/256; //装初值,11.0592 MHZ晶振定时50MS,计数值为45872
TL0=(65536-45872)%256;
EA=1; //打开总中断
ET0=1; //打开定时器中断
TR0=1; //启动定时器0
P2=0xff;
while(1)
{
P1=0x0f;
P2=0xfe; //暂停显示当前数字
P0=led[ctime/1000];
delay_ms(10);
P2=0xfd ;
P0=led[ctime/100%10];
delay_ms(10);
P2=0xfb;
P0=led[ctime/10%10];
delay_ms(10);
P2=0xf7 ;
P0=led[ctime%10];
delay_ms(10);
P2=0x00;
}
}
void int0() interrupt 0
{
P1=0xff;
P1=0xef; //置第1行P1.4为低电平,开始扫描第1行
temp=P1; //读P1口按键
temp=temp & 0x0f; //判断低4位是否有0,即判断列线(P1.0~P1.3)是否有0
if (temp!=0x0f) //若temp不等于0x0f,说明有键按下
{
delay_ms(10); //延时10ms去抖
temp=P1; //再读取P1口按键
temp=temp & 0x0f; //再判断列线(P1.0~P1.3)是否有0
if (temp!=0x0f) //若temp不等于0x0f,说明确实有键按下
{
temp=P1; //读取P1口按键,开始判断键值
switch(temp)
{
case 0xee:key=0;break;
case 0xed:key=1;break;
case 0xeb:key=2;break;
case 0xe7:key=3;break;
}
temp=P1; //将读取的键值送temp
temp=temp & 0x0f; //取出列线值(P1.0~P1.3)
while(temp!=0x0f) //若temp不等于0x0f,说明按键还没有释放,继续等待
{
temp=P1; //若按键释放,再读取P1口
temp=temp & 0x0f;// 判断列线(P1.0~P1.3)是否有0
}
}
}
if(key==1) //判断按键1是否按下
a=1;
if(key==2) //判断按键2是否按下
a=2; //按下则标志2
if(key==3) //判断按键3是否按下
a=3; //按下则标志3
}
void time() interrupt 1 //定时器0中断服务程序
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
i++;
if(i==20) //如果i=20,说明1s时间到
{
i=0;
if(a==1){
ctime++;
if(ctime>9999)
{
ctime=0;
}}}
}
图怎么出不来。。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632