|
|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 wl771217 于 2024-9-16 15:13 编辑
仿制了ID95809大侠制做的STC15计数器,数码管可以正常显示,但是按按键无法计数没有反应,要把程序里的K3按键程删除才能正常计数,各位大侠们帮忙看下程序是哪里的问题单片机源程序如下:
#include <STC15.h>
#define uchar unsigned char
#define uint unsigned int
sbit FMQ=P3^7;//蜂鸣器
sbit K1=P3^4; //按键加
sbit K2=P3^5; //按键减
sbit K3=P3^2; //复位
bit flag_KEY=0; //按键松开标志位
sbit DS1=P1^3;//数码管第1位
sbit DS2=P1^1;//数码管第2位
sbit DS3=P1^0;//数码管第3位
sbit DS4=P1^2;//数码管第4位
unsigned char ScanTime=1;
unsigned int Num=0;
//共阴数码管段码表,段接P2.0-2.7,位接P1.0-1.3
unsigned char code SEG_Tab[]={
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
};
/*---------------------数码管显示---------------------------------------*/
void display()
{ //数码管初始化
P2=0x00;//P2=00000000
P1=0xFF;//P1=11111111
switch(ScanTime)
{
//----------数码管第1位--------------
case 1:
if(Num==0)
{
P2=0x40;
}
else
{
P2=SEG_Tab[Num/1000];
}
DS1=0;
break;
//-----------数码管第2位-------------
case 2:
if(Num==0)
{
P2=0x40;
}
else
{
P2=SEG_Tab[Num/100%10];
}
DS2=0;
break;
//-----------数码管第3位-------------
case 3:
if(Num==0)
{
P2=0x40;
}
else
{
P2=SEG_Tab[Num/10%10];
}
DS3=0;
break;
//-----------数码管第4位-------------
case 4:
if(Num==0)
{
P2=0x40;
}
else
{
P2=SEG_Tab[Num%10];
}
DS4=0;
break;
//------------------default---------------
default: break;
}
//-----数码管循环------
ScanTime++;
if(ScanTime>4)
{
ScanTime=1;//循环扫描
}
}
/*-------------------------------------
按键扫描
---------------------------------------*/
void keyscan()
{
if(K1==0)
{
if(flag_KEY==1)//按键只响应1次
{
flag_KEY=0;
if(Num<999)
{
Num++;
}
}
}
else if(K2==0)
{
if(flag_KEY==1)//按键只响应1次
{
flag_KEY=0;
if(Num>0)
{
Num--;
}
}
}
else if(K3==0)
{
if(flag_KEY==1)//按键只响应1次
{
flag_KEY=0;
if(Num>0)
{
Num=0;
}
}
}
else//按键松开
{
flag_KEY=1;
}
}
void delay_ms(unsigned int ms)// 延时子程序
{
unsigned int a,b;
for(a=ms;a>0;a--)
for(b=123;b>0;b--);
}
/*-------------------------------------
主函数
---------------------------------------*/
void main()
{
P1M1 = 0x00; P1M0 = 0xFF; //P1口推挽模式
P2M1 = 0x00; P2M0 = 0xFF; //P2口推挽模式
while(1)
{
display();
keyscan();
delay_ms(10);
if(Num>=100)
{
FMQ=0;
}
else
{
FMQ=1;
}
}
} |
|