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

📄 ch452.c

📁 CH452按键和显示板驱动程序,采用级联方式,模拟SPI口一次发送24位数据.每级120个灯和120个按键.采用查表换算.
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* 文件名:CH452.C
* 功能:按键和显示板驱动程序,采用按键和LED管理芯片CH452
*       每级120个灯和120个按键.采用查表换算.
* 键盘板与LPC2148的连接如下所示:
*	DCLK	--		P0.4 
*	DIN		--		P0.6
*	DOUT	--		P0.5 
*
*  	CS0		--		P0.13
*  	CS1		--		P0.15
*  	CS2		--		P0.17
*	CS3		--		P0.7
*	
*   RST     --      P0.19
*   INT#    --      P0.8
*   INT     --      P0.9
*
*  CS0为总片选,低电平有效.
*  CS1-CS2分别选择1-8组按键和显示.
*  RST为复位控制,高电平复位.
*  INT中断位  进MCU的EINT0;
*  INT#中断查询位,用于查询具体区的中断
*  
*  作者:
*  日期:
****************************************************************************/

#include "config.h"

#define KEY_CS0		(1 << 13)
#define KEY_CS1		(1 << 15)
#define KEY_CS2		(1 << 17)
#define KEY_CS3		(1 << 7)
#define INT_Q		(1 << 8)
#define DCLK		(1 << 4)
#define DIN			(1 << 6)
#define DOUT		(1 << 5)

#define RST			(1 << 19)
/* CH451和CH452的常用命令码 */
#define CH452_NOP		0x0000					// 空操作
#define CH452_RESET     0x0201					// 复位
#define CH452_LEVEL		0x0100					// 加载光柱值
#define CH452_CLR_BIT	0x0180					// 段位清0
#define CH452_SET_BIT	0x01C0					// 段位置1
#define CH452_SLEEP		0x0202					// 进入睡眠状态
#define CH452_LEFTMOV   0x0300		            //设置移动方式-作移
#define CH452_LEFTCYC   0x0301		            //设置移动方式-左循
#define CH452_RIGHTMOV  0x0302		            //设置移动方式-右移
#define CH452_RIGHTCYC  0x0303		            //设置移动方式-右循	
#define CH452_SELF_BCD	0x0380					//自定义BCD码
#define CH452_SYSOFF    0x0400					//关显示、键盘
#define CH452_SYSON1    0x0401					//开显示
#define CH452_SYSON2    0x0403					//开显示、键盘
#define CH452_SYSON2W   0x0423					//开显示、键盘, 真正2线接口
#define CH452_DSP       0x0500					//设置默认显示方式
#define CH452_BCD       0x0580					//设置BCD译码方式
#define CH452_TWINKLE   0x0600		            //设置闪烁控制
#define CH452_GET_KEY	0x0700					// 获取按键
#define CH452_DIG0      0x0800					//数码管位0显示
#define CH452_DIG1      0x0900		            //数码管位1显示 
#define CH452_DIG2      0x0a00		            //数码管位2显示
#define CH452_DIG3      0x0b00		            //数码管位3显示
#define CH452_DIG4      0x0c00		            //数码管位4显示
#define CH452_DIG5      0x0d00					//数码管位5显示	
#define CH452_DIG6      0x0e00					//数码管位6显示	
#define CH452_DIG7      0x0f00		            //数码管位7显示


uint8 const CH452_TAB[60] = {0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x3B,0x3A,0x39,0x38,
							 0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19,0x18,0x33,0x32,0x31,0x30,
							 0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x37,0x36,0x35,0x34,
							 0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,0x2B,0x2A,0x29,0x28,
							 0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x2F,0x2E,0x2D,0x2C};
							 //实际LED的排列顺序
uint8 const Group_TAB[8] = {0x01,0x00,0x03,0x02,0x05,0x04,0x07,0x06};
                             //实际组顺序 1,0,3,2,5,4,7,6							 

#define  KEY_CS		7
#define  CS0		13
#define  CS1		15
#define  CS2		17
#define  SSCS_452()	IO0SET = 1<<KEY_CS;IO0CLR = 1<<CS2;IO0CLR = 1<<CS1;IO0CLR = 1<<CS0
										//KEY_CS 为138的使能端														
#define  CCCS()		IO0CLR = 1<<KEY_CS;
#define  CCCS0()	IO0CLR = 1<<CS2;IO0CLR = 1<<CS1;IO0CLR = 1<<CS0
#define  CCCS1()	IO0CLR = 1<<CS2;IO0CLR = 1<<CS1;IO0SET = 1<<CS0
#define  CCCS2()	IO0CLR = 1<<CS2;IO0SET = 1<<CS1;IO0CLR = 1<<CS0
#define  CCCS3()	IO0CLR = 1<<CS2;IO0SET = 1<<CS1;IO0SET = 1<<CS0
#define  CCCS4()	IO0SET = 1<<CS2;IO0CLR = 1<<CS1;IO0CLR = 1<<CS0
#define  CCCS5()	IO0SET = 1<<CS2;IO0CLR = 1<<CS1;IO0SET = 1<<CS0
#define  CCCS6()	IO0SET = 1<<CS2;IO0SET = 1<<CS1;IO0CLR = 1<<CS0
#define  CCCS7()	IO0SET = 1<<CS2;IO0SET = 1<<CS1;IO0SET = 1<<CS0


/* 定义DCLK控制 */
#define  KB_DCLK	4
#define  SDCLK()	IO0SET = 1 << KB_DCLK
#define  CDCLK()	IO0CLR = 1 << KB_DCLK

/* 定义DIN控制 */
#define  KB_DIN		6
#define  SDIN()		IO0SET = 1 << KB_DIN
#define  CDIN()		IO0CLR = 1 << KB_DIN

/* 定义DOUT控制 */
#define  KB_DOUT	5
#define  IO_DOUT	(1 << KB_DOUT)
#define  CKDOUT		(IO0PIN & IO_DOUT)

/* 定义RST控制 */
#define  LCM_RST	19
#define  SRST()		IO0SET = 1<<LCM_RST
#define  CRST()		IO0CLR = 1<<LCM_RST	

/* 定义主函数需要调用的全局变量*/
uint16 KeyPointer;	            //从键盘板读取到的键值,B15-B8为Y,B7-B0为X   

/********************************************************************************************************
** 函数名称:CH452_4W_Init()
** 函数功能:初始化CH452串口,采用模拟总线方式
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/

void CH452_4W_Init(void)
{
	PINSEL0	= (PINSEL0 & (~(0x3F << 8)));					//设置P0.7 P0.8为GPIO
	IO0DIR	= IO0DIR | DCLK | DIN;							//设置IO的输出方向
}
/********************************************************************************************************
** 函数名称:EINT0_Init()
** 函数功能:初始化EINT0。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void EINT0_Init(void)
{
	EXTMODE = 0x0000;//电平中断
	EXPOLAR = 0x0000;//低电平有效
	PINSEL0	= (PINSEL0 & (~(0x3 << 2))) | (0x2 << 2);   //设置P0.14为EINT1

	IRQEnable();						// 使能IRQ中断
	
	/* 外部中断0初始化 */
	VICIntSelect   = 0x00000000;			// 设置所有中断分配为IRQ中断
	VICVectCntl0   = 0x20 | 14;			// 分配外部中断0到向量中断0
	VICVectAddr0   = (uint32)IRQ_Eint0;	// 设置中断服务程序地址
	VICIntEnable   = 1 << 14;				// 使能EINT0中断
	EXTINT         = 0x01;				// 清除EINT0中断标志

}
/********************************************************************************************************
** 函数名称:Delayms()
** 函数功能:ms延时;
** 入口参数:i	延时的ms数
** 出口参数:无
*********************************************************************************************************/
void Delayms(uint8 i)
{	uint32	j;
	do{	for(j=0;j!=1000;j++)
		{;}
	}while(--i);
}
/********************************************************************************************************
** 函数名称:Delayus()
** 函数功能:ms延时;
** 入口参数:i	延时的ms数
** 出口参数:无
*********************************************************************************************************/
void Delayus(uint8 i)
{	uint32	j;
	do{	for(j=0;j!=100;j++)
		{;}
	}while(--i);
}
/********************************************************************************************************
** 函数名称:CCCS_452()
** 函数功能:452片选脉冲;
** 入口参数:i 选定的片区
** 出口参数:无
*********************************************************************************************************/
void CCCS_452(uint8 i)
{
	switch(i)
	{
		case 0:	CCCS0(); break;
		case 1:	CCCS1(); break;
		case 2:	CCCS2(); break;
		case 3:	CCCS3(); break;
		case 4:	CCCS4(); break;
		case 5:	CCCS5(); break;
		case 6:	CCCS6(); break;
		case 7:	CCCS7(); break;
	}
}
/********************************************************************************************************
** 函数名称:Load_452()
** 函数功能:452片选脉冲;
** 入口参数:i 选定的片区
** 出口参数:无
*********************************************************************************************************/
void Load_452(uint8 i)
{

	CCCS_452(i);
	CCCS();	
}
/********************************************************************************************************
** 函数名称:_SendData()
** 函数功能:发送串行数据;
** 入口参数:要发送的数据24 bit, LSB first
** 出口参数:无
*********************************************************************************************************/

void _SendData(uint32 Data)
{
	uint8 i;

	for (i = 0;i < 24;i ++)
	{
 		if (Data & 1)
			SDIN(); 
		else
			CDIN();
		CDCLK();
		Data >>= 1;
		SDCLK();
	}
}
/********************************************************************************************************
** 函数名称:_RecData()
** 函数功能:接收串行数据;
** 入口参数:无
** 出口参数:接收到的数据8 bit, MSB first
*********************************************************************************************************/

uint8 _RecData(void)
{
	uint8 i;
	uint8 Data = 0;

	for (i = 0;i < 7;i ++)
	{
		Data <<= 1;				
		if (CKDOUT == IO_DOUT)			
			Data += 1;
		CDCLK();

⌨️ 快捷键说明

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