📄 7281.c
字号:
#include <iom16v.h>
#include <macros.h>
#define MHZ 8
#define US MHZ/4 //以4MHZ为基本单位,典型延时时间为(dt+2)us(晶振为1MHZ)P195P195]。
#define SET(a,b) a|=(1<<b)
#define CLR(a,b) a&=~(1<<b)
#define CPL(a,b) a^=(1<<b)
#define CHK(a,b) (a&(1<<b)==(1<<b))
#define BC7281_PORT PORTA
#define BC7281_DDR DDRA
#define BC7281_PIN PINA
#define INT_7281 2
#define DAT_7281 6
#define CLK_7281 7
#define RDAT_7281 (CLR(BC7281_DDR,DAT_7281),(BC7281_PIN&(1<<DAT_7281))==(1<<DAT_7281))//定义PC0口为数据口
void main()
{
unsigned char key_number;
BC7281_init();
while(1)
{
if(!((PIND&0x04)==0x04))
{
key_number=read728x(0x13); /////读键值
if(key_number<0x0A)
{ write728x(0x15,0x00+(key_number&0x0f)); //在第0位以HEX方式显示键码的低四位
write728x(0x15,0x10+(key_number&0xf0));//在第1位以HEX方式显示键码的高四位
}
if(key_number==0x0f)
{
write728x(0x15,0x00+(key_number&0x0f)); //在第0位以HEX方式显示键码的低四位
write728x(0x15,0x10+(key_number&0xf0)); //在第1位以HEX方式显示键码的高四位
}
}
write728x(0x15,(0x60+(0x01)));
write728x(0x15,(0x70+(0x00)));
}
}
void send_byte(unsigned char send_byte)
{
unsigned char bit_counter;
SET(BC7281_PORT,DAT_7281); //为低电平
SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
CLR(BC7281_DDR,DAT_7281); //DAT为输入
SET(PORTA,CLK_7281); //为高电平
CLR(BC7281_PORT,CLK_7281);
delay_7281(US);
SET(BC7281_PORT,CLK_7281);
delay_7281(US);
do {
CLR(BC7281_PORT,CLK_7281);
//delay_7281(US);
SET(BC7281_PORT,CLK_7281);
delay_7281(2*US);
} while (RDAT_7281); //CPU向BC7281发一系列的脉冲信号,直到DAT为低电平
CLR(BC7281_PORT,CLK_7281);//delay_7281(US); // 要在15us内发一脉冲信号
SET(BC7281_PORT,CLK_7281);
delay_7281(US);
while (!RDAT_7281); //等待数据线变为高电平
SET(BC7281_DDR,DAT_7281); //pa6 DAT为输出并延时
delay_7281(US);
for (bit_counter=0;bit_counter<8;bit_counter++) //写八位
{
delay_7281(3*US);
if ((send_byte&0x80)==0)
{CLR(BC7281_PORT,DAT_7281);//从高位写起
}
else
{
SET(BC7281_PORT,DAT_7281);
}
send_byte=send_byte*2; ///左移
CLR(BC7281_PORT,CLK_7281);//delay_7281(US); //产生一个周期为20US的脉冲
SET(BC7281_PORT,CLK_7281);
delay_7281(2*US);
}
//CLR(BC7281_PORT,CLK_7281);
// SET(BC7281_PORT,CLK_7281);
SET(BC7281_PORT,DAT_7281);
delay_7281(6*US);
}
unsigned char receive_byte(void)
{
unsigned char bit_counter, in_byte; //产生一个脉冲
SET(BC7281_PORT,DAT_7281);delay_7281(US); //为高电平
SET(BC7281_PORT,CLK_7281);delay_7281(US); //为高电平
SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
CLR(BC7281_DDR,DAT_7281); //DAT为输入
CLR(BC7281_PORT,CLK_7281); delay_7281(US);
SET(BC7281_PORT,CLK_7281);delay_7281(US);
while (RDAT_7281){}; //等待数据线变为低电平
CLR(BC7281_PORT,CLK_7281); delay_7281(US);
SET(BC7281_PORT,CLK_7281);delay_7281(US);
for (bit_counter=0;bit_counter<8;bit_counter++) //接收八位数据
{
delay_7281(2*US);
in_byte=in_byte*2;
if (RDAT_7281) {in_byte=in_byte|0x01; }
CLR(BC7281_PORT,CLK_7281); delay_7281(US);
SET(BC7281_PORT,CLK_7281);delay_7281(US);
}
delay_7281(2*US);
return(in_byte); /////////键盘返回值
}
void write728x(unsigned char reg_add, unsigned char write_data)
{
send_byte(reg_add);
send_byte(write_data);
}
unsigned char read728x(unsigned char reg_add)
{
send_byte(reg_add|0x80);
return(receive_byte());
}
/*#pragma interrupt_handler int1:3 //声明_int0( )为中断处理
while(RDAT_7281==0){}; //如果数据线为高电平则BC7281空闲
key_number=read728x(0x13);
write728x(0x15,(key_number&0xf0)/16); //在第0位以HEX方式显示键码的低四位
write728x(0x15,0x10+(key_number&0x0f)); //在第1位以HEX方式显示键码的高四位
}
*/
void BC7281_init(void)
{
delay_7281(2*US);
write728x(0x12,0x80); //写控制寄存器。开扫描,CPU未读数据时只有第一个按键有效
// CLR(DDRD,3); //PD2口输出无效
// SET(PORTD,3);
//SET(BC7281_PORT,CLK_7281); //IO上拉有效
//SET(BC7281_PORT,DAT_7281);
// CLR(BC7281_DDR,CLK_7281);
//CLR(BC7281_DDR,DAT_7281);
// SET(MCUCR,ISC11); //INT1 的产生异步中断请求
//CLR(MCUCR,ISC10);
// SET(GICR,INT1); //开INT1中断
// SREG=SREG|0x80; //开全
// while(1){}
}
void delay_7281(unsigned int dt)//延时(dt+2)us (晶振为4MHZ)P195
{
for(;dt>0;--dt){};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -