📄 7281.h
字号:
// *********************************//
/* 文件:7281头文件
时间:2008.8.6
备注:PA6、PA7为数据和脉冲端
使用时须加上延时头文件
*************************************/
unsigned char p,q;
// ***********************************************************
// *短暂延时程序,延时时间与time成正比,范围是几个uS到几百个uS *
// ***********************************************************
void delay(unsigned char time)
{
while (time!=0)
{time--;
asm("nop");
asm("nop");
asm("nop");
}
}
// ***********************************************************
// * 向BC728X发送一个字节 *
// ***********************************************************
void send_byte(unsigned char send_byte)
{
unsigned char bit_counter;
DDRA&=~(1<<6);
DDRA|=1<<7;
do
{
PORTA&=~(1<<7); //clk置0
delay(2);
PORTA|=(1<<7); //clk置1
}
while (PINA&0X40); //当DAT=1
PORTA&=~(1<<7); //clk置0
delay(2);
PORTA|=(1<<7); //clk置1
while (!(PINA&0X40)); //当DAT=1
DDRA|=(1<<6); //DAT=1 等待BC728X进入接收状态
for (bit_counter=0;bit_counter<8;bit_counter++)
{ // 发送8个比特
if ((send_byte&0x80)==0) //发送数据时高位在前
{
PORTA&=~(1<<6); // 如果待发bit为0, 置dat为0
}
else
{
PORTA|=(1<<6); // 反之为DAT 1
}
send_byte=send_byte*2; // send_byte左移一位
PORTA&=~(1<<7); //CLK置0
delay(2);
PORTA|=(1<<7); // CLK回1
delay(2); //短暂延时
}
DDRA&=~(1<<6); //DAT口设置为输出 ;为下一次数据传送做准备
PORTA|=(1<<6); // 恢复dat为高电平
delay(5); //指令间设置一个微小延时
}
// ************************************************************
// * 从BC728X接受一个字节 *
// ************************************************************
unsigned char receive_byte(void)
{
unsigned char bit_counter, in_byte;
DDRA&=~(1<<6);
DDRA|=1<<7;
PORTA&=~(1<<7); //CLK=0
delay(2); // 产生一个clk脉冲
PORTA|=(1<<7); //CLK=1
while ((PINA&0X40)==0X40);// 等待BC728X响应dat低电平
PORTA&=~(1<<7); //CLK=0
delay(2); // 产生一个clk脉冲
PORTA|=(1<<7); //CLK=1
delay(2);
DDRA&=~(1<<6); //DAT=0
for (bit_counter=0;bit_counter<8;bit_counter++)
{ // 接收8个bit
delay(2); // 短暂延时
in_byte=in_byte*2; // in_byte左移一位
if ((PINA&0X40)==0X40) // 如果dat为'1'
{
in_byte=in_byte|0x01; // bit0=1
}
PORTA&=~(1<<7); //CLK=0
delay(2); // 产生一个clk脉冲
PORTA|=(1<<7); //CLK=1
}
delay(5); //指令间设置一个微小延时
return(in_byte);
}
// *写入BC728X,第一个参数为目标寄存器地址,第二个参数为要写入的数据 *
// *****************************************************************
void write7281(unsigned char reg_add, unsigned char write_data)
{
send_byte(reg_add); //发送寄存器地
send_byte(write_data); //发送数据字节
}
// **********************************************************
// * 读出BC728X内部寄存器的值,调用参数为寄存器地址 *
// **********************************************************
unsigned char read7281(unsigned char reg_add)
{
send_byte(reg_add|0x80); // 发送读指令(bit7=1)
return(receive_byte()); //接收数据并返回
}
//******************************************************************
//* 初始化 BC7281 (数码管) //
//******************************************************************
void chushihua_BC7281()
{ unsigned int i;
for(i=0;i<0xffff;i++); // 等待BC728x完成复位
PORTA|=(1<<7); //CLK=1
DDRA|=(1<<7); //CLK设置成输出
write7281(0x12,0x80); // 初始化BC728x 为164模式,不反相
write7281(0x10,0xfe); //10单元中的数为1时正常显示
write7281(0x11,0x80); //闪烁速度设置
}
//******************************************************************
//* 初始化 BC7281 (LCD) //
//******************************************************************
void chushihua_BC7281L()
{ unsigned int tmr;
for(tmr=0;tmr<0xffff;tmr++); // 等待BC728x完成复位
PORTA|=(1<<7); //CLK=1
DDRA|=(1<<7); //CLK设置成输出
//write7281(0x12,0x80); // 初始化BC728x 为164模式,不反相
//write7281(0x10,0xfe); //10单元中的数为1时正常显示
//write7281(0x11,0x80); //闪烁速度设置
}
//******************************************************************
//* 外部中断0设置 //
//******************************************************************
void ZHONGDUAN0()
{ DDRD|=~BIT(2);
PORTD|=0X04;
MCUCR|=0X02;
GICR|=0X40;
SREG=0X80;
}
//*****************************************************//
//送数字字型码,16*16的长高
void dis_tab(unsigned char data)
{
switch(data)
{
case 0:{p=0xa3;q=0xb0;break;}
case 1:{p=0xa3;q=0xb1;break;}
case 2:{p=0xa3;q=0xb2;break;}
case 3:{p=0xa3;q=0xb3;break;}
case 4:{p=0xa3;q=0xb4;break;}
case 5:{p=0xa3;q=0xb5;break;}
case 6:{p=0xa3;q=0xb6;break;}
case 7:{p=0xa3;q=0xb7;break;}
case 8:{p=0xa3;q=0xb8;break;}
case 9:{p=0xa3;q=0xb9;break;}
}
}
//*************************************************//
/* 功能:可在中断程序中等待按键按下
时间:2008.8.6
*/
unsigned char get7281()
{ unsigned char key;
do{;}
while(PIND&0X04);
key=read7281(0x13);
do{;}
while(!(PIND&0X04));
write7281(0x15,(0x00+(key&0x0f)));//hex译码0x15 BCD 0x14
PORTD|=0X04;
beep1();
return(key);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -