⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch451.c

📁 基于AVR单片机的CH451一应用。8个数码管
💻 C
字号:
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

#include<util/delay.h>
#include<avr/interrupt.h>
#include"ch451.h"

void ch451_init(void);
void ch451_write(unsigned int command);

extern unsigned char ch451_key;  //存放键盘中断中读取的键值

/*******************************************
主函数包含
DDRD=0xf7;
PORTD=0xff;
unsigned char ch451_key;
*******************************************/


/************初始化子程序*************/
void ch451_init()
{
    ch451_din0;    //先低后高,选择4线输入
	_delay_us(10);
	ch451_din1;	
	
	ch451_write(CH451_SYSON2); //开显示、键盘
	ch451_write(CH451_BCD|0x000);//设置BCD译码方式,中间是几就是显示几位,若为0则全显
}

/********CH451输出命令子程序**********/

 //定义一无符号整型变量存储12字节的命令字。
void ch451_write(unsigned int command)
{
    unsigned char i;
	
	GICR=(0<<INT1);
	
    ch451_load0;                  //命令开始  

    for(i=0;i<12;i++)
    {                            //送入12位数据,低位在前
        if(command&1)
		{ch451_din1;}
		else
		{ch451_din0;}
     
        ch451_dclk0;
        command>>=1;
        ch451_dclk1;            //上升沿有效
    }

    ch451_load1;               //加载数据
	
	GICR=(1<<INT1);
	
}

//*************************************************/
//输入命令子程序,MCU从451读一字节
unsigned char ch451_read(void)
{
    unsigned char i;
    unsigned char command,keycode;		//定义命令字,和数据存储器
	
	GICR=(0<<INT1);
	
    command=0x07;			               //输入读451命令字	
    ch451_load0;
	
    for(i=0;i<4;i++)
    { 
		if(command&1)		      //送入最低位
		{ch451_din1;}
		else
		{ch451_din0;}
		
        ch451_dclk0;			 
        command>>=1;			      //往右移一位
        ch451_dclk1;			      //产生时钟上升沿锁通知CH451输入位数据
    }
	
    ch451_load1;			      //产生加载上升沿通知CH451处理命令数据
    keycode=0;				      //清除keycode
    for(i=0;i<7;i++)
	{
        keycode<<=1;			      //数据移入keycode,高位在前,低位在后
        keycode|=ch451_dout;         //从高到低读入451的数据
        ch451_dclk0;			     //产生时钟下升沿通知CH451输出下一位
        ch451_dclk1;
    }
	
	GICR=(1<<INT1);
  
    return(keycode);			     //反回键值  0~F
}

/**********按键中断*************/
SIGNAL(SIG_INTERRUPT1)
{
    unsigned char i;
    unsigned char command,keycode;		//定义命令字,和数据存储器
	
	GICR=(0<<INT1);
	
    command=0x07;			               //输入读451命令字	
    ch451_load0;
	
    for(i=0;i<4;i++)
    { 
		if(command&1)		      //送入最低位
		{ch451_din1;}
		else
		{ch451_din0;}
		
        ch451_dclk0;			 
        command>>=1;			      //往右移一位
        ch451_dclk1;			      //产生时钟上升沿锁通知CH451输入位数据
    }
	
    ch451_load1;			      //产生加载上升沿通知CH451处理命令数据
    keycode=0;				      //清除keycode
    for(i=0;i<7;i++)
	{
        keycode<<=1;			      //数据移入keycode,高位在前,低位在后
        keycode|=ch451_dout;         //从高到低读入451的数据
        ch451_dclk0;			     //产生时钟下升沿通知CH451输出下一位
        ch451_dclk1;
    }	
	
	ch451_key=keycode;
	
	GICR=(1<<INT1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -