数码管
有哪位大哥能帮我看看数码管显示的问题,显示不正确
//AVRstudio6下写的晶振8M.
#include
#define F_CPU 8000000
#include til/delay.h>
#include
#include //中断信号头文件
#define LED PORTE //数据口
#define LEDDDR DDRE //数据口方向寄存器
#define PORT_DATA PORTC //定义c为数码管段码
#define PORT_SEL PORTA //定义A为数码管位码
#define DDR_DATA DDRC //输出方向
#define DDR_SEL DDRA
#define DDR_WAVE_TRIG DDRD //电平检测PD6为TRIG,PD4为ECHO
#define DDR_WAVE_ECHO DDRD
#define PORT_WAVE_TRIG PORTD
#define PORT_WAVE_ECHO PORTD
#define PIN__WAVE_TRIG PIND
#define PIN__WAVE_ECHO PIND
#define TRIG PD6
#define ECHO PD4
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
volatile ulong ov_counter=0;
volatile uint rising_edge,falling_edge;
volatile ulong pulse_clocks = 1000; //高电平宽度
volatile uint temp;
/*****************************************************
数码管显示程序
*****************************************************/
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const uchar data[]={0xfe,0Xfd,0Xfb,0Xf7};
void Display(char *p)
{
char i,sel=0x01;
for(i=0;i<4;i++)
{
PORT_SEL = sel; // 1 表示选通
PORT_DATA = ~table[p];
if(i == 0)
PORT_DATA &= ~(1<<7);
delay_ms(4);
PORT_DATA= 0xFF ;
sel= sel<<1;
}
}
void Calc_Distance( char* p)
{
volatile unsigned long TN = 0;
TN = (falling_edge*17/100);// 单位为mm
p[0]=TN%10; //个位
p[1]=(TN/10)%10; //十位
p[2]=(TN/100)%10; //百位
p[3]=(TN/1000)%10; //千位
PORT_DATA=~p[0];
PORT_SEL=0xfe;
delay_ms(4);
PORT_DATA=~p[1];
PORT_SEL=0xfd;
delay_ms(4);
PORT_DATA=~p[2];
PORT_SEL=0xfb;
delay_ms(4);
PORT_DATA=~p[3];
PORT_SEL=0xf7;
delay_ms(4);
}
/*****************************************************
脉冲发生程序
*****************************************************/
void Io_Init(Void)
{
DDR_DATA = 0xFF;
PORT_DATA = 0x00;
DDR_SEL = 0x0F;
PORT_SEL = 0x0F;
DDR_WAVE_ECHO &= ~(1<
DDR_WAVE_TRIG |= (1<
PORT_WAVE_ECHO &= ~(1<
PORT_WAVE_TRIG &= ~(1<
LEDDDR |= 0XFF;
LED = 0xFF;
}
void Initial_Timer(void)
{
TCCR1B = 0;
TCCR1A = 0x00;
TCCR1B = (1<
TIMSK |= (1<
}
void GenerateTrig(void)
{
PORT_WAVE_TRIG |= (1<
delay_us(30);
PORT_WAVE_TRIG &= ~(1<
}
/*****************************************************
主程序
*****************************************************/
void main()
{
unsigned int count = 0;
Io_Init();
Initial_Timer();
asm("SEI"); //打开全局中断
while(1)
{
Calc_Distance(data);
count++;
if(count > 100)//产生一次Trig
{
count = 0;
GenerateTrig();
}
Display(data);
}
}
ISR(TIMER1_OVF_vect)
{
ov_counter++;
}
ISR(TIMER1_CAPT_vect) //信号捕获
{
if(PIN__WAVE_ECHO & (1<< ECHO)) //上升沿
{
TCNT1H = 0;
TCNT1L = 0;
TCCR1B &= ~(1<
ov_counter=0;
LED ^= (1<
LED |= ~((1<
}
else //下降沿
{
falling_edge = ICR1L;
temp = ICR1H;
falling_edge |= temp<<8;
TCCR1B |= (1<
LED ^= (1<
LED |= ~((1<
}
}
补充内容 (2016-3-17 09:24):
ATMEGA128A芯片
已退回5积分
回帖(1)
2016-4-11 14:11:49
已解决,本人自己解决了
已解决,本人自己解决了
举报
更多回帖