|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2010-10-5 19:38:38
|
显示全部楼层
回复【楼主位】change1
-----------------------------------------------------------------------
SPI,74HC595驱动数码管(GCC和IAR)
//名称:SPI,74HC595驱动数码管
//功能:74HC595驱动数码管
//机型:ATmega16 使用晶振7.3728M
//作者:RM QQ:731424304 百度空间:http://hi.baidu.com/change_ghost/home
//程序版本:V1.0
//维护记录:2010.10.5
//编译器:GCC for AVR
//欢迎大家和我一起交流学习,转载请保持源文件的完整性。
//任何单位和个人不经本人允许不得用于商业用途
//硬件接线:见电路图,程序用于ATmega16_Basic_V1.2开发板,具体接线请参考其电路图,网上可搜到
//595接线:
//PB4----------RCK
//PB5----------Ds
//PB6----------CLR
//PB7----------SCK
#include<avr/io.h>
#include<avr/delay.h>
/***************************************************************************************/
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR() asm("wdr")
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define schar signed char
#define sint signed int
#define slong signed long
/***************************************************************************************/
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0xFF;
}
void init_devices(void)
{
port_init();
}
/***************************************************************************************/
uchar gyadx[25]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,
0X82,0XF8,0X80,0X90,0X88,0X83,
0XC6,0XA1,0X86,0X8E,0X89,0X8C,
0XC7,0XA7,0X84,0X8B,0XAB,0X98,0XC1};
//0~9,A~F;大写H,P,大写L,小写c,小写e,小写h,小写n,小写q,大写U //共阳码
uchar gyidx[25]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,
0X7D,0X07,0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71,0X76,0X73,
0X38,0X58,0X7B,0X74,0X54,0x67,0X3E};
//0~9,A~F;大写H,P,大写L,小写c,小写e,小写h,小写n,小写q,大写U //共阴码
/***************************************************************************************/
void SPImasterInit(void) //SPI初始化
{
DDRB|=(1<<7)|(1<<5); //设置SCK,MOSI为输出,其他为输入
SPCR=(1<<6)|(1<<4)|(1<<1)|(1<<0);//使能SPI,主模式,Fck/128
}
/***************************************************************************************
函数名称: void SPIMasterTransmit(uchar TranData)
函数功能: SPI数据传输
参 数:
返 回 值: 无
****************************************************************************************/
void SPIMasterTransmit(unsigned char TranData)
{
SPDR=TranData; //数据放入SPI寄存器中
while(!(SPSR&(1<<7))); //等待数据传输完毕
}
/***************************************************************************************
函数名称: void display(uchar i)
函数功能: 74HC595数据输出显示
参 数:
返 回 值: 无
***************************************************************************************/
int display(unsigned char i)
{
PORTB&=~(1<<4); //等待数据传输,595存储寄存器数据不变
SPIMasterTransmit(i); //传输数据
PORTB|=(1<<4); //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
}
/***************************************************************************************/
//延时函数
int delay_ms(uint ms) //毫秒级
{
while(--ms)
{ _delay_ms(1); }
}
int delay_us(uint us) //微妙级
{
while(--us)
{ _delay_us(1); }
}
/***************************************************************************************/
//主函数
int main()
{
init_devices();
SPImasterInit();
uchar i;
PORTD=0X00;
DDRD=0XFF;
while(1)
{
for(i=0;i<25;i++)
{
display(gyadx);
delay_ms(500);
}
}
}
//名称:SPI,74HC595驱动数码管
//功能:74HC595驱动数码管
//机型:ATmega16 使用晶振7.3728M
//作者:RM QQ:731424304 百度空间:http://hi.baidu.com/change_ghost/home
//程序版本:V1.0
//维护记录:2010.10.5
//编译器:IAR for AVR5.30
//欢迎大家和我一起交流学习,转载请保持源文件的完整性。
//任何单位和个人不经本人允许不得用于商业用途
//硬件接线:见电路图,程序用于ATmega16_Basic_V1.2开发板,具体接线请参考其电路图,网上可搜到
//595接线:
//PB4----------RCK
//PB5----------Ds
//PB6----------CLR
//PB7----------SCK
#include<iom16.h>
//端口定义
#define DATA PORTB_Bit5
#define SCK PORTB_Bit7
#define RCK PORTB_Bit4
#define CLR PORTB_Bit6
////////////////////////////////////////////////////////////////////
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR() asm("wdr")
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define schar signed char
#define sint signed int
#define slong signed long
////////////////////////////////////////////////////////////////////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0xFF;
}
void init_devices(void)
{
port_init();
}
////////////////////////////////////////////////////////////////////
uchar gyadx[25]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,
0X82,0XF8,0X80,0X90,0X88,0X83,
0XC6,0XA1,0X86,0X8E,0X89,0X8C,
0XC7,0XA7,0X84,0X8B,0XAB,0X98,0XC1};
//0~9,A~F;大写H,P,大写L,小写c,小写e,小写h,小写n,小写q,大写U共阳码
uchar gyidx[25]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,
0X7D,0X07,0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71,0X76,0X73,
0X38,0X58,0X7B,0X74,0X54,0x67,0X3E};
//0~9,A~F;大写H,P,大写L,小写c,小写e,小写h,小写n,小写q,大写U//共阴码
/*-----------------------------------------------------------------*/
void SPImasterInit(void) //SPI初始化
{
DDRB|=(1<<7)|(1<<5); //设置SCK,MOSI为输出,其他为输入
SPCR=(1<<6)|(1<<4)|(1<<1)|(1<<0);//使能SPI,主模式,Fck/128
}
/*-----------------------------------------------------------------
函数名称: void SPIMasterTransmit(uchar TranData)
函数功能: SPI数据传输
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void SPIMasterTransmit(unsigned char TranData)
{
SPDR=TranData; //数据放入SPI寄存器中
while(!(SPSR&(1<<7))); //等待数据传输完毕
}
/*-----------------------------------------------------------------
函数名称: void display(uchar i)
函数功能: 74HC595数据输出显示
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void display(unsigned char i)
{
PORTB&=~(1<<4); //等待数据传输,595存储寄存器数据不变
SPIMasterTransmit(i); //传输数据
PORTB|=(1<<4); //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
}
////////////////////////////////////////////////////////////////////
//非精确定时
int delay_ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<1140;j++);
}
int main()
{
init_devices();
SPImasterInit();
uchar i;
PORTD=0X00;
DDRD=0XFF;
while(1)
{
for(i=0;i<25;i++)
{
display(gyadx);
delay_ms(500);
}
}
} |
|