按钮计数用数码管显示为何不为0?
时间:10-02
整理:3721RD
点击:
本人是新手,编了一个按钮计数用数码管显示。百思不得其解,计数到30,应该为0,但显示20,再从20开始计数到30,显示10.困扰了我好几天,麻烦各位高手解答。(用4094驱动LED,把24位数发送后,开启数码管)
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DATA= P1^1;
sbit CLK= P1^2;
sbit STR= P1^0;
sbit key_input =P3^5 ;
uchar code DSY_CODE[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
uchar ge,shi,bai,qian,data1; //定义输入的整型变量的个,十,百, 数值
uchar key_return;
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
char read_key(void) //按键扫描
{
static char key_state = 0;
uchar key_press, key_return = 0;
key_press = key_input; // 读按键 I/O 电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
break;
case key_state_1: // 按键确认态
if (!key_press)
{
key_return = 1; // 按键仍按下,按键确认输出为"1" (1)
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
//将一个短整型数,个,十,百,千位分别填入一个4位数组,用于数码管显示
void deal_value(unsigned short input )//数据处理函数
{
if(input<10) //如果输入值为0-9
{
ge=input;
}
else if((input>=10)&&(input<100)) //如果输入值为10-99
{
shi=input/10;
ge=input%10;
}
else if((input>=100)&&(input<1000)) //如果输入值为100-999
{
bai=input/100; //百位值
input=input%100;
shi=input/10; //十位值
ge=input%10; //个位值
}
else if((input>=1000)&&(input<10000)) //如果输入值为1000-9999
{
qian=input/1000; //千位值
input=input%1000;
bai=input/100; //百位值
input=input%100;
shi=input/10; //十位值
ge=input%10; //个位值
}
else //如果输入值大于9999 ,显示"FFFF" ,表示显示超范围
{
qian=0; //千位值
bai=0; //百位值
shi=0; //十位值
ge=0;
}
}
void Out_4094(uchar data1) //写CD4094子函数;
{
uchar i; //定义子函数;
for(i=0;i<8;i++) //写八位数据进CD4094;
{
if(data1&0x01) //判断并发串行数据;
{
DATA=1; //发高电平;
}
else
{
DATA=0; //发低电平;
}
CLK=0; //形成上升延脉冲;
_nop_();
_nop_(); //延时;
_nop_();
CLK=1;
data1>>=1; //数据移位,送下一位数据;
}
}
void delay(uint ms)
{
uint a,b; //约1ms
for(a= ms;a<100;a++);
for(b=0;b<100;b++);
}
void main()
{
unsigned short kk=0; //声明一个短整型变量,作为数码管显示的数
while(1)
{
if(!key_input) //每10ms调用按键
{
delay(10);
read_key();
}
if(read_key()) //确认键按下
kk++;
if(kk==30)
kk=0;
deal_value(kk); //将kk值分解为个位,十位,百位,千位,装入缓冲区
STR = 0; //保持然来的状态不变;
data1 = DSY_CODE [ ge ];
Out_4094(data1);
data1 = DSY_CODE [ shi ];
Out_4094(data1);
data1 = DSY_CODE [ bai ];
Out_4094(data1);
STR = 1; //数据送完;更新显示;
}
}
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DATA= P1^1;
sbit CLK= P1^2;
sbit STR= P1^0;
sbit key_input =P3^5 ;
uchar code DSY_CODE[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
uchar ge,shi,bai,qian,data1; //定义输入的整型变量的个,十,百, 数值
uchar key_return;
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
char read_key(void) //按键扫描
{
static char key_state = 0;
uchar key_press, key_return = 0;
key_press = key_input; // 读按键 I/O 电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
break;
case key_state_1: // 按键确认态
if (!key_press)
{
key_return = 1; // 按键仍按下,按键确认输出为"1" (1)
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
//将一个短整型数,个,十,百,千位分别填入一个4位数组,用于数码管显示
void deal_value(unsigned short input )//数据处理函数
{
if(input<10) //如果输入值为0-9
{
ge=input;
}
else if((input>=10)&&(input<100)) //如果输入值为10-99
{
shi=input/10;
ge=input%10;
}
else if((input>=100)&&(input<1000)) //如果输入值为100-999
{
bai=input/100; //百位值
input=input%100;
shi=input/10; //十位值
ge=input%10; //个位值
}
else if((input>=1000)&&(input<10000)) //如果输入值为1000-9999
{
qian=input/1000; //千位值
input=input%1000;
bai=input/100; //百位值
input=input%100;
shi=input/10; //十位值
ge=input%10; //个位值
}
else //如果输入值大于9999 ,显示"FFFF" ,表示显示超范围
{
qian=0; //千位值
bai=0; //百位值
shi=0; //十位值
ge=0;
}
}
void Out_4094(uchar data1) //写CD4094子函数;
{
uchar i; //定义子函数;
for(i=0;i<8;i++) //写八位数据进CD4094;
{
if(data1&0x01) //判断并发串行数据;
{
DATA=1; //发高电平;
}
else
{
DATA=0; //发低电平;
}
CLK=0; //形成上升延脉冲;
_nop_();
_nop_(); //延时;
_nop_();
CLK=1;
data1>>=1; //数据移位,送下一位数据;
}
}
void delay(uint ms)
{
uint a,b; //约1ms
for(a= ms;a<100;a++);
for(b=0;b<100;b++);
}
void main()
{
unsigned short kk=0; //声明一个短整型变量,作为数码管显示的数
while(1)
{
if(!key_input) //每10ms调用按键
{
delay(10);
read_key();
}
if(read_key()) //确认键按下
kk++;
if(kk==30)
kk=0;
deal_value(kk); //将kk值分解为个位,十位,百位,千位,装入缓冲区
STR = 0; //保持然来的状态不变;
data1 = DSY_CODE [ ge ];
Out_4094(data1);
data1 = DSY_CODE [ shi ];
Out_4094(data1);
data1 = DSY_CODE [ bai ];
Out_4094(data1);
STR = 1; //数据送完;更新显示;
}
}
联调图
联调图。
你把if(kk==30)
kk=0; 这个改为if(kk>=30)
kk=0; 看一下什么现象
mark以下。回头来看
谢谢你的解答,我改了但结果还是一样。我用P口显示数值时是正常的,可以为0.是否数码管显示有问题,但+1数码管显示是正常的,百思不得其解,麻烦各位高手赐教。
如果哪位师傅有4094驱动三位数码管的程序,麻烦上传,谢谢