📄 bc7281.txt
字号:
#include <util/delay.h>
#include <avr/io.h>
//*** 函数定义 ***
void write728x(unsigned char, unsigned char); // 写入到BC728x
void send_byte(unsigned char); // 发送一个字节
void delay_1us(void); // 延时1us
void delay_us(unsigned int); // us级延时
void delay_1ms(void); // 延时1ms
void delay_ms(unsigned int); // ms级延时
//*** 变量及I/O口定义 ***
// #define CLK (PORTB&0x20) // clk 连接于 PB.5
// #define DAT_OUT (PORTB&0x80)
// #define DAT_IN (PINB&0x80) // dat 连接于 PB.7
// #define KEY (PINB&0x08) // key 连接于 PB.3
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
void main(void)
{
DDRB=0x01; // 设置I/O口B.5为输出
PORTB=0x00;
delay_us(100); // 等待 BC728x 完成复位
write728x(0x12,0x84); // 初始化BC728x为164模式,KMS=1
while (1)
{
write728x(0x15,0); // 第一排LED全灭
write728x(0x15,0x15); // 第二排LED全亮
write728x(0x15,0x32);
write728x(0x15,0x91);
delay_ms(300);
}
}
// ***********************************************************
// * 写入BC728X, 第一个参数为目标寄存器地址, 第二个参数为要写入的数据 *
// ***********************************************************
void write728x(unsigned char reg_add, unsigned char write_data)
{
send_byte(reg_add); // 发送寄存器地址
send_byte(write_data); // 发送数据字节
}
// ***********************************************************
// * 向 BC728X 发送一个字节 *
// ***********************************************************
void send_byte(unsigned char send_byte)
{
unsigned char bit_counter;
PORTB&=~(1<<PB0); // 产生一 clk 脉冲
// delay_1us();
PORTB|=(1<<PB0);
// delay_1us();
while (PINB&(1<<PB2)); // 等待 BC728X 输出 dat 低电平响应
delay_us(3);
PORTB&=~(1<<PB0); // 再次输出一 clk 脉冲
//delay_1us();
PORTB|=(1<<PB0);
//delay_1us();
while (!(PINB&(1<<PB2))); // 等待 BC728X 进入接收状态
delay_us(2);
for (bit_counter=0;bit_counter<8;bit_counter++)
{ // 发送 8 个比特
if ((send_byte&0x80)==0)
{
DDRB=0x05;
// 设置I/O口B.7和B.5为输出,其余为输入
PORTB&=~(1<<PB2);
// 如果待发bit为0, 置 dat 为 0
delay_1us();
}
else
{
PORTB|=(1<<PB2); // 反之置为 1
}
delay_1us();
send_byte=send_byte*2; // send_byte 左移一位
delay_us(1);
PORTB&=~(1<<PB0); // 输出一 clk 脉冲
// delay_1us();
PORTB|=(1<<PB0);
delay_us(3); // 短暂延时
}
DDRB=0x01;
delay_us(5); // 恢复I/O口B.7为输入
}
void delay_1us(void)
{
asm("nop");
}
void delay_us(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(4*143-2);i++);
}
void delay_ms(unsigned int n)
{
unsigned int i=0;
for(i=0;i<n;i++)
delay_1ms();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -