AVR单片机 数码管显示问题? 单片机: ATMEGA128A AU1101
现大致说明下595与单片机的IO口连接:PIN10---MISO---PB3PIN11---SCK----PB1PIN12---RCLK--PB0PIN13---OE--...
现大致说明下 595与单片机的IO口连接:
PIN10---MISO---PB3
PIN11---SCK----PB1
PIN12---RCLK--PB0
PIN13---OE-----PC7
PIN14---MOSI--PB2
工具ICCAVR7.0 烧录 AVR Studio 4
程序如下:
#include <iom128v.h>
#include <macros.h>
char data[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delayus(int z)
{
unsigned int a, b;
for (a = z; a>0; a--)
for (b = 113; b>0; b--)
;
}
void display(char num)
{
char i,num1;
for(i=0;i<8;i++)
{
//num1=(num&0x80)>>7;
//if(num1==1)
if((num<<i)&0x80) // 依次取出高位?
PORTB |= BIT(2);
else PORTB &=~BIT(2);
PORTB |= BIT(1); //上升沿发生位移
PORTB &=~BIT(1);
PORTB &=~BIT(0);
PORTB |= BIT(0); //上升沿数据发送到锁存器
PORTB &=~BIT(0);
PORTB |= BIT(0);
}
}
void main()
{
char i;
DDRA =0xff;
PORTA =0xfd;
DDRB =0xff;
PORTB |= BIT(7);
PORTB |= BIT(6); // 选通数码管 4位全亮
PORTB |= BIT(5);
PORTB |= BIT(4);
PORTB &=~BIT(3);
DDRC =0xff;
PORTC =0x00;
while(1)
{
PORTA &=~BIT(1);
display(data[8]);
delayus(800);
PORTA |= BIT(1);
}
}
现在编译的时候 选择单片机型号我有个问题?型号有 ATMega128:M103 mode 和Atmega128(please see NOTES) 还有就是1280 1281 等等 这里选择哪一个?? 我选择是ATMega128:M103 mode 不知道有错没??
然后说下烧录进去,数码管显示不对,并且拔掉烧录器 在插上有的时候数码管和LED竟然全部亮了。。。我实在不懂为什么?? 并且这样的情况经常发生 ??? (LED是连接在PA口)
程序里面 while()循环中 就算数码管不良 那个LED灯也应该一亮一灭吧 但是一直都是在哪里亮着 从来不灭。。。。
求AVR单片机高手解释下 刚开始玩AVR 以前只是玩一下简单的8051 求大神啊。。。 展开
PIN10---MISO---PB3
PIN11---SCK----PB1
PIN12---RCLK--PB0
PIN13---OE-----PC7
PIN14---MOSI--PB2
工具ICCAVR7.0 烧录 AVR Studio 4
程序如下:
#include <iom128v.h>
#include <macros.h>
char data[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delayus(int z)
{
unsigned int a, b;
for (a = z; a>0; a--)
for (b = 113; b>0; b--)
;
}
void display(char num)
{
char i,num1;
for(i=0;i<8;i++)
{
//num1=(num&0x80)>>7;
//if(num1==1)
if((num<<i)&0x80) // 依次取出高位?
PORTB |= BIT(2);
else PORTB &=~BIT(2);
PORTB |= BIT(1); //上升沿发生位移
PORTB &=~BIT(1);
PORTB &=~BIT(0);
PORTB |= BIT(0); //上升沿数据发送到锁存器
PORTB &=~BIT(0);
PORTB |= BIT(0);
}
}
void main()
{
char i;
DDRA =0xff;
PORTA =0xfd;
DDRB =0xff;
PORTB |= BIT(7);
PORTB |= BIT(6); // 选通数码管 4位全亮
PORTB |= BIT(5);
PORTB |= BIT(4);
PORTB &=~BIT(3);
DDRC =0xff;
PORTC =0x00;
while(1)
{
PORTA &=~BIT(1);
display(data[8]);
delayus(800);
PORTA |= BIT(1);
}
}
现在编译的时候 选择单片机型号我有个问题?型号有 ATMega128:M103 mode 和Atmega128(please see NOTES) 还有就是1280 1281 等等 这里选择哪一个?? 我选择是ATMega128:M103 mode 不知道有错没??
然后说下烧录进去,数码管显示不对,并且拔掉烧录器 在插上有的时候数码管和LED竟然全部亮了。。。我实在不懂为什么?? 并且这样的情况经常发生 ??? (LED是连接在PA口)
程序里面 while()循环中 就算数码管不良 那个LED灯也应该一亮一灭吧 但是一直都是在哪里亮着 从来不灭。。。。
求AVR单片机高手解释下 刚开始玩AVR 以前只是玩一下简单的8051 求大神啊。。。 展开
2个回答
展开全部
PB_0-3 接595,PB_4-7 接位选端吧,你的动态扫描,没写对,要理解过程:一次点亮一个数码管,一段时间后,点亮下一个,如此循环。595的,你自己写啦,也省掉了部分代码。
uchar disbuf[4] = {0}; //4位数码管显示缓存
void WriteData(ucahr dat){...} //向595里写数据dat;注意,不要干扰到PB_4-7几个脚。
void display(){
static uchar Com = 0;
PORTB &= 0x0f; //清零PB_4-7,消影;
WriteData(data[disbuf[Com]]); //写段码
PORTB |= (1 << (Com + 4)); //写位码
Com = (Com + 1) % 4;
}
void main()
{
DDRB = 0xff;
disbuf[0] = 2; //写要显示的数字
while(1){
display();
delay(100);
}
}
uchar disbuf[4] = {0}; //4位数码管显示缓存
void WriteData(ucahr dat){...} //向595里写数据dat;注意,不要干扰到PB_4-7几个脚。
void display(){
static uchar Com = 0;
PORTB &= 0x0f; //清零PB_4-7,消影;
WriteData(data[disbuf[Com]]); //写段码
PORTB |= (1 << (Com + 4)); //写位码
Com = (Com + 1) % 4;
}
void main()
{
DDRB = 0xff;
disbuf[0] = 2; //写要显示的数字
while(1){
display();
delay(100);
}
}
追问
能写一个 0-9 循环显示的不? 我有4个LED 全他们全部显示一样的数字即可
谢谢了
你的程序没看明白, 显示那部分位选是三极管控制的 段选是595控制
那我一直把4个位选全部打开 然后送数据进去 ??
追答
这是动态显示数码管。同一时间只能打开一个数码管,其它的要灭掉,一段时间后,灭掉这个,再打开下一个,如此循环。才会形成动态的显示。一次全打开,你能把它显示的过程理清楚吗/。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询