本帖最后由 Z巧er 于 2014-8-21 11:45 编辑
我用的是两相增量式旋转编码器 程序如下:
/**********************************************
HC595 字节写入函数
**********************************************/
void hc595send(unsigned char x)
{
unsigned char n,temp;
for(n=0;n<=7;n++) //一个字节要分8次写入
{
temp=x&0x80; //记住一定要先写最高位
if(temp!=0) //判断是否不等于0
{
PORTB|=(1<<PB5); //PB5赋为1
hc595shift(); //使寄存器移位
}
else //等于0
{
PORTB&=~(1<<PB5); //PB5赋为0
hc595shift(); //使寄存器移位
}
x<<=1; //数据左移一位,那么下一个循环将是获取第7位的数据 跟着是第6位 第5位。。。第1位 最后把所有数据都移入HC595
}
}
/**********************************************
寄存器移位函数
**********************************************/
void hc595shift(void)
{
PORTB|=(1<<PB7); //一开始初始化端口时,PB7已为低,这时若把PB7拉高,则是上升沿,就会把进行寄存器移位操作
PORTB&=~(1<<PB7); //每次上升沿完成,要重新将时钟线置低,准备下一次上升
}
/**********************************************
字节写入存储寄存器,并且送往输出端口
**********************************************/
void hc595store(void)
{
PORTB|=(1<<PB4); //一开始初始化端口时,PB4已为低,这时若把PB4拉高,则是上升沿,就会把字节写入存储寄存器
PORTB&=~(1<<PB4); //每次上升沿完成,要重新将时钟线置低,准备下一次上升
}
void display(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
hc595send(ledwei);
hc595send(ledduan[dis_buff]);
hc595store();
}
}
int main(void)
{
//unsigned char i=0;
pulse=10;
a=21;
device_init();
//for(i=0;i<=7;i++)
//dis_buff=0;
//sei(); //开启全局中断
while(1)
{
gengxin_disbuff(); //缓冲区的脉冲数更新
}
}
|