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

📄 ch452ldriver._c

📁 ch452的数码管和键盘驱动程序
💻 _C
字号:
#include<iom8v.h>
#include<macros.h>
#include"delay.h"

unsigned flag;

/************************************************************************
*说明:运行与CH452L的4线模式,MCU使用ATMEGA8L,MCU与CH452L引脚连接如下:
                   LOAD    PC0      
				   DCLK    PC1
				   DIN     PC2
				   DOUT    PD2()INT0
LOAD,DCLK,DIN都为输出,DOUT为输入,若要使用其它IO口,只需更改如下宏定义即可
*************************************************************************/
#define PC0 0
#define PC1 1
#define PC2 2
#define PD2 2

#define LOAD_OUT DDRC |= BIT(PC0)
#define LOAD_OUT0 PORTC &= ~BIT(PC0)
#define LOAD_OUT1 PORTC |= BIT(PC0)

#define DCLK_OUT DDRC |= BIT(PC1)
#define DCLK_OUT0 PORTC &= ~BIT(PC1)
#define DCLK_OUT1 PORTC |= BIT(PC1)

#define DIN_OUT  DDRC  |= BIT(PC2)
#define DIN_OUT0 PORTC &= ~BIT(PC2)
#define DIN_OUT1 PORTC |= BIT(PC2)

#define DOUT_IN DDRD &= ~BIT(PD2)
#define DOUT_OUT0 PORTD &= ~BIT(PD2)
#define DOUT_OUT1 PORTD |= BIT(PD2)
#define DOUT_PIN PIND & 0x04

/*************************************************************************
*宏定义CH452L系统命令
*************************************************************************/
#define RESET_CHIP 0x0201
#define OPEN_DISPLAY 0x0401     //开启显示
#define OPEN_KEYBOARD 0x0422    //开启键盘   
#define OPEN_DISPLAY_KEYBOARD 0x0423    //开启显示和键盘
#define DATA_LEFT 0x0300        //数据左移
#define DATA_RIGHT 0x0302       //数据右移
#define LEFT_CIRCLE 0x0301      //数据左循环
#define RIGHT_CIRCLE 0x0303     //数据右循环
#define READ_KEYCODE 0x0700     //读取按键代码


/*************************************************************************
*宏定义CH452L加载数据DIG7~DIG0
* 说明:若要使用小数点,则只需将第7位置为1即可,例如0x0f80
*************************************************************************/
#define CH452L_DIG7 0x0f00
#define CH452L_DIG6 0x0e00
#define CH452L_DIG5 0x0d00
#define CH452L_DIG4 0x0c00
#define CH452L_DIG3 0x0b00
#define CH452L_DIG2 0x0a00
#define CH452L_DIG1 0x0900
#define CH452L_DIG0 0x0800

/**************************************************************************
*函数名:初始化CH452L端口
*函数功能:LOAD,DCLK,DIN都为输出,DOUT为输入
*入口参数:无
*出口参数:无
**************************************************************************/
int Init_Ch452lport(void)
{
    LOAD_OUT;
	LOAD_OUT1;
	
	DCLK_OUT;
	DCLK_OUT1;
	
	DIN_OUT;
	DIN_OUT1;
	
	DOUT_IN;
	DOUT_OUT1;
	
	Delay_Nus(30);  //延时
    return 0x31;
}

/**************************************************************************
*函数名称:向CH452L写入命令函数 
*函数功能:
*入口参数:定义一无符号整型变量存储12字节的命令字。
*出口参数:无
***************************************************************************/
void Ch452l_Writecommand(unsigned int command)
{
    unsigned char i;
	
	LOAD_OUT0;
	Delay_Nus(2);
    for(i=0;i<12;i++)
	{  
	    DCLK_OUT0;
		if(command&0x0001==0x0001)
		{
		    DIN_OUT1;    
		}
		else
		{
		    DIN_OUT0;
		}
		command=command>>1;
		DCLK_OUT1;
	}
	LOAD_OUT1;       //LOAD上升沿加载一帧数据
	DIN_OUT1;
	DCLK_OUT1;	
}

/**************************************************************************
*函数名:Init_Ch452lsystem(void)
*函数功能:初始化CH452L
*命令说明:
*(1)采用BCD译码方式显示设置显示参数命令:
*       命令     显示位数
*      0x0580       8
*      0x0590       1
*      0x05a0       2
*      0x05b0       3     
*      0x05c0       4
*      0x05d0       5
*      0x05e0       6
*      0x05f0       7
*(2)OPEN_DISPLAY_KEYBOARD开启显示和键盘命令
*        命令        开启             输出中断方式
*      0x0401        显示             无(无键盘功能下不考虑)
*      0x0402        键盘             低电平中断(不推荐用于测试)
*      0x0422        键盘             边缘中断
*      0x0403        显示和键盘       低电平中断(不推荐使用)
*      0x0423        显示和键盘       边缘中断
*入口参数:无
*出口参数:无
**************************************************************************/
int Init_Ch452lsystem(void)
{
    Ch452l_Writecommand(RESET_CHIP);//芯片复位
	Delay_Nus(40);
    
	Ch452l_Writecommand(OPEN_DISPLAY_KEYBOARD);//开启显示和键盘,边缘中断
	Delay_Nus(5);
	return 0x32;
}

/***************************************************************************
*函数名:
*功能:
*入口参数:
 n   要显示的数码管的位数 
 *p  要显示的数码管的值,BCD码,在显示前将要显示的数码管的BCD码存入该数组
*出口参数:
****************************************************************************/
void Display_Ch452lBCD(unsigned char n,unsigned char *p)
{
    unsigned char i;
	switch(n)
	{
	    case(1):
		    Ch452l_Writecommand(0x0590);//1位显示,BCD译码
			Delay_Nus(3);
			break;
		case(2):
		    Ch452l_Writecommand(0x05a0);//2位显示,BCD译码
			Delay_Nus(3);
			break;
		case(3):
		    Ch452l_Writecommand(0x05b0);//3位显示,BCD译码
			Delay_Nus(3);
			break;
		case(4):
		    Ch452l_Writecommand(0x05c0);//4位显示,BCD译码
			Delay_Nus(3);
			break;
	    case(5):
		    Ch452l_Writecommand(0x05d0);//5位显示,BCD译码
			Delay_Nus(3);
			break;
		case(6):
		    Ch452l_Writecommand(0x05e0);//6位显示,BCD译码
			Delay_Nus(3);
			break;
		case(7):
		    Ch452l_Writecommand(0x05f0);//7位显示,BCD译码
			Delay_Nus(3);
			break;
	    case(8):
		    Ch452l_Writecommand(0x0580);//8位显示,BCD译码
			Delay_Nus(3);
			break;
		default:
		    break;
	}
	Ch452l_Writecommand(CH452L_DIG7 | p[7]);
	Ch452l_Writecommand(CH452L_DIG6 | p[6]);
	Ch452l_Writecommand(CH452L_DIG5 | p[5]);
	Ch452l_Writecommand(CH452L_DIG4 | p[4]);
	Ch452l_Writecommand(CH452L_DIG3 | p[3]);
	Ch452l_Writecommand(CH452L_DIG2 | p[2]);
	Ch452l_Writecommand(CH452L_DIG1 | p[1]);
	Ch452l_Writecommand(CH452L_DIG0 | p[0]);
	Ch452l_Writecommand(CH452L_DIG0 | p[0]);
}

/***************************************************************************
*函数名:
*功能:读取CH452L按键代码
*入口参数:无
*出口参数:返回读取到的键值,参考手册上的键值表
*说明:由于读取按键代码时B0~B7无效,只有B8~B11有效,可以使用简化的读取按键命
令,即输出命令0111。必须关中断,再开中断,否则读出的键值出错
****************************************************************************/
unsigned char Read_Keycode(void)
{
    unsigned char keyvalue=0,temp,i;
	unsigned char cmd=0x07;//使用简化的读取按键命令,使用cmd的低四位
	GICR &= 0xbf;  //关中断INT0
	Delay_Nus(5);
	LOAD_OUT0;    //LOAD输出0
	for(i=0;i<4;i++)
	{
	    DCLK_OUT0;
		if(cmd & 1)
		{
		    DIN_OUT1;
		}
		else
		{
		    DIN_OUT0;
		}
		DCLK_OUT1;
		cmd=cmd>>1;
	}
	LOAD_OUT1;    //LOAD上升沿加载一帧数据
	DIN_OUT1;
	DCLK_OUT1;
	keyvalue=0;
	for(i=0;i<7;i++)
	{
	    keyvalue<<=1;
		if(DOUT_PIN)
		{
		    keyvalue=keyvalue+1;
			Uart_Transmit(0x01);
		}
		DCLK_OUT0;
		DCLK_OUT1;
	}
	DCLK_OUT1;
	DIN_OUT1;
	GICR |= 0x40;    //开中断
	GIFR = 0x40;   //清中断标志INT0
	Delay_Nus(5);
	return keyvalue;
}

/***************************************************************************
*函数名:
*功能:外部中断INT0的初始化,边缘触发
*入口参数:无
*出口参数:无
*中断方式说明:     MCUCR         INT0中断方式
*                   0x00          低电平中断
*                   0x01          上升沿和下降沿都产生中断
*                   0x02          下降沿产生中断
*                   0x03          上升沿产生中断
****************************************************************************/
void Init_Int0(void)
{
    CLI(); 
    MCUCR = 0x00; //0x00为低电平触发INT0中断
    GICR |= 0x40; //INT0使能
    TIMSK = 0x00; 
    SEI(); 
}

/***************************************************************************
*函数名:INT0中断服务函数
*功能:
*说明:低电平触发中断
*入口参数:无
*出口参数:无
****************************************************************************/
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
    flag=1;
	Uart_Transmit(0xbb);
	//GIFR = 0x40;   //清中断标志INT0
}

⌨️ 快捷键说明

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