main.c文件:
/********************************
74HC95驱动的数码管显示程序
文件名:main.c
编译:WinAVR-20070122
硬件环境:CA-M8X 打开的开关如下
S6(1,2,5,6,7) - 外部4MHz晶振和595接口
J8(EN-SEG) - 数码管显示允许
芯艺设计室 2004-2007 版权所有
转载请保留本注释在内的全部内容
WEB: http://www.chipart.cn
Email: changfutong@sina.com
*******************************/
#include
#include
#include
#define SER_PORT PORTD
#define SER_DAT PD4
#define SER_RCK PD5
#define SER_SCK PD6
//显示码(可从chipart.cn下载生成工具)
uint8_t g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void DelayMs(uint16_t t)
{
uint16_t i;
for(i=0;i
_delay_loop_2(250 * 4);
}
//向595 写一字节
void ser_out(uint8_t dat)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(dat&0x80)
SER_PORT|=_BV(SER_DAT);
else
SER_PORT&=~_BV(SER_DAT);
//产生移位脉冲
SER_PORT|=_BV(SER_SCK);
SER_PORT&=~_BV(SER_SCK);
dat<<=1;
}
}
//数码管显示数(0~255)
//num :显示的数 hex:是否用十六进制显示
void display_number(uint8_t num,uint8_t hex)
{
uint8_t buf[2];//发送显示码缓冲区
uint8_t temp;
if(hex) //十六进制
{
buf[0]=g_aDisplayBuf[num>>4];//高位
buf[1]=g_aDisplayBuf[num&0x0f];//低位
}
else//十进制
{
buf[1]=g_aDisplayBuf[num%10];
temp=num%100;
buf[0]=g_aDisplayBuf[temp/10];
temp=num/100;
if(temp>0)
buf[1]|=0x80; //第一个数码管小数点表示百位1
if(temp>1)
buf[0]|=0x80;//两个数码管小数点表示百位2
}
//串行发送数据
ser_out(buf[0]);
ser_out(buf[1]);
//产生锁存脉冲
SER_PORT|=_BV(SER_RCK);
SER_PORT&=~_BV(SER_RCK);
}
int main(void)
{
uint8_t i=0;
//595控制I/O初始化
DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);
while(1)
{
display_number(i++,1);
DelayMs(200);
}
}
|
|