📄 main.c
字号:
/*
控制595驱动的数码显示程序
main.c
硬件:CA-M8
时钟:4MHz
芯艺 2004-12-16
*/
#include <avr/io.h>
#include <avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define FREQ 4
#define SER_PORT PORTD
#define SER_DAT PD4
#define SER_RCK PD5
#define SER_SCK PD6
//显示码
uchar g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void DelayMs(uint t)
{
uint i;
for(i=0;i<t;i++)
_delay_loop_2(250 * FREQ);
}
//向595 写一字节
void ser_out(uchar dat)
{
uchar 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(uchar num,uchar hex)
{
uchar buf[2];//发送显示码缓冲区
uchar 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)
{
uchar i=0;
DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);
// DDRB=_BV(PB0)|_BV(PB1);
while(1)
{
display_number(i++,1);
DelayMs(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -