数码管跳一位数 比如100到101 之间会有一段什么都不显示 下面是我的程序(编码器的) 希望会的大神不啬赐教~~~
#include <REG51.H>
#include <INTRINS.H> // 空操作函数,移位函数头文件包含
#define uchar unsigned char
#define uint unsigned int
unsigned char counter;
unsigned char b;
sbit PINA = P1^0;//csn信号white
sbit PINB = P1^1;//这个是时钟blue
sbit PIND = P1^2;//这个是数据green
sbit LED2 = P2^2;//LED显示位选控制 百位
sbit LED3 = P2^1;//LED显示位选控制 十位
sbit LED4 = P2^0;//LED显示位选控制 个位
uchar led_buf[4]; /*定义LED显示缓冲区,将带显示数值放入该区域*/
/*------------------------------------------------
数码管段码表
------------------------------------------------*/
uchar code disp_buff[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
/*------------------------------------------------
延时子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*void delay(uint t)
{
uint i;
while(t--)
{
for(i=0;i<125;i++){}
}
}*/
/*------------------------------------------------
取编码器位置值子程序
------------------------------------------------*/
long GetSSI(void)
{
static bit Curr_encoder_b; //定义一个变量来储存当前B信号
static bit Last_encoder_b; //定义一个变量来储存上次B脚信号
static bit updata= 0;
if( PINA && PINB) //编码器无转动退出
{
updata = 0;
return;
}
Last_encoder_b = PINB; //记录B信号
while(!PINA) //等待A由低变高
{
Curr_encoder_b = PINB; //记录等待期间的B信号(指当前B信号)
updata = 1; }
if(updata)
{
updata = 0 ;
if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B从0到1为正转
{
if(counter == 255)
{ return; }
counter++; //正转计数加
}
else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B从1到0为反转
{
if(counter == 0)
{return; }
counter--; //反转计数减
}
}
}
//LED 共阴
void main()
{
counter = 0;
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
TMOD &= 0xf1; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = (65636-50000)/256; //设置定时初值
TH0 = (65636-50000)%256; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1;
TR0 = 1; //定时器0开始计时;
IT0 = 1 ;
EX0 = 1;
EA = 1;
while(1)
{
GetSSI();//取绝对值编码器位置数据
led_buf[2]=(counter%1000)/100;//百位
led_buf[1]=(counter%100)/10;//十位
led_buf[0]=counter%10; //个位
//将数据的各位数字放入指定缓冲区
P0 = disp_buff[led_buf[2]]; //取显示数据,段码
LED2 = 0; //点亮LED2(第二位百位)
delay(200); //延时一小段时间
LED2 = 1; //熄灭LED2
P0 = disp_buff[led_buf[1]]; //取显示数据,段码
LED3 = 0; //点亮LED3(第三位十位)
delay(200); //延时一小段时间
LED3 = 1; //熄灭LED3
P0 = disp_buff[led_buf[0]]; //取显示数据,段码
LED4 = 0; //点亮LED4(第四位)
delay(200); //延时一小段时间
LED4 = 1; //熄灭LED4
// delay(300);
}
}
|