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

📄 ch452.c

📁 CH452按键和显示板驱动程序,采用级联方式,模拟SPI口一次发送24位数据.每级120个灯和120个按键.采用查表换算.
💻 C
📖 第 1 页 / 共 2 页
字号:
		Delayus(1);				
		SDCLK();
	}
	return (Data);
}
/********************************************************************************************************
** 函数名称:CH452_Write()
** 函数功能:向CH452写命令函数;
** 入口参数:i cmd
** 出口参数:无
*********************************************************************************************************/
void CH452_Write(uint8 i, uint32 cmd)
{

	Load_452(i);
	
	_SendData(cmd);
	
	Delayus(1);
	SSCS_452();
}
/********************************************************************************************************
** 函数名称:CH452_Read()
** 函数功能:从CH452读取一个字节
** 入口参数:无
** 出口参数:读取到的键值
*********************************************************************************************************/
uint16 CH452_Read(uint8 i)
{
	uint16 Get_KEY;	
	
	CH452_Write(i,CH452_GET_KEY);//0x0700为读取按键值,CH452的读操作中,只能读取此值 
	
	CCCS_452(i);
	Get_KEY = _RecData();
    SSCS_452();
	return (Get_KEY);

}
/********************************************************************************************************
** 函数名称:Shut_key();
** 函数功能:关闭指定区的键盘扫描
** 入口参数:i 要关闭键盘的区
** 出口参数:无
*********************************************************************************************************/
void Close_KEY(uint8 i)
{
  CH452_Write(i,CH452_SYSON1 & 0x00000FFF);
}
/********************************************************************************************************
** 函数名称:Open_key();
** 函数功能:打开指定区的键盘扫描
** 入口参数:i 要打开键盘的区
** 出口参数:无
*********************************************************************************************************/
void Open_KEY(uint8 i)
{
  CH452_Write(i,CH452_SYSON2 & 0x00000FFF);
}
/********************************************************************************************************
** 函数名称:Read_KEY()
** 函数功能:读取键值
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void Read_KEY(void)
{
	uint8 i,KEY_N,KEY_FIQ = 0;
	for(KEY_N=0;KEY_N<8;KEY_N++)
	{
		CCCS_452(KEY_N);
		if((IO0PIN&INT_Q) == 0)
		{
			KEY_FIQ = 1;
			break;
		} 
	}
	if(KEY_FIQ == 0) return;
	KeyPointer = CH452_Read(KEY_N);
	if((KeyPointer & 0x0040) == 0) return;	//不是有效的按键
	KeyPointer = KeyPointer & 0x003F;		//去掉D6
	for(i=0;i<60;i++)						//查询键值表,得出绝对坐标
	{
		if(KeyPointer == CH452_TAB[i]) break;
	}
	KEY_N = Group_TAB[KEY_N];
	KEY_N = KEY_N * 5 + i/12 +1;			//换算得到按键所在的行 y
	i = i%12 + 1;
	KeyPointer = (KEY_N << 8) | (i % 12);	//输出按键 B15-B8 y B7-B0 x
}
/********************************************************************************************************
** 函数名称:LED_Green_Display()
** 函数功能:点亮指定坐标的LED
** 入口参数:x	LED所在列
			y	LED所在行
** 出口参数:无
*********************************************************************************************************/
void LED_Green_Display(uint8 x, uint8 y)
{
	uint32 LED_Data;
	uint8  LED_SEG;
	if((x == 0)||(x >= 13)) return;//超出正确的坐标范围
	if((y == 0)||(y >= 41)) return;//超出正确的坐标范围
	x -= 1;
	y -= 1;
	LED_SEG = Group_TAB[y/5];		//得到实际组排列的顺序
	
	LED_Data = ((y*12) + x)%60;		//计算此键在列表中的位置
	y = CH452_TAB[LED_Data];		//获取对应坐标表中的值
	LED_Data = CH452_SET_BIT | y;
	LED_Data = LED_Data << 12;
	
	CH452_Write(LED_SEG,LED_Data); 
}
/********************************************************************************************************
** 函数名称:LED_Group_Close()
** 函数功能:点亮指定坐标的LED
** 入口参数:x	LED所在列
			y	LED所在行
** 出口参数:无
*********************************************************************************************************/
void LED_Green_Close(uint8 x, uint8 y)
{
	uint32 LED_Data;
	uint8  LED_SEG;
	if((x == 0)||(x >= 13)) return;//超出正确的坐标范围
	if((y == 0)||(y >= 41)) return;//超出正确的坐标范围
	x -= 1;
	y -= 1;
	
	LED_SEG = Group_TAB[y/5];		//得到实际组排列的顺序
	
	LED_Data = ((y*12) + x)%60;		//计算此键在列表中的位置
	y = CH452_TAB[LED_Data];		//获取对应坐标表中的值
	LED_Data = CH452_CLR_BIT | y;
	LED_Data = LED_Data << 12;
	
	CH452_Write(LED_SEG,LED_Data); 
}
 /********************************************************************************************************
** 函数名称:LED_Display()
** 函数功能:点亮指定坐标的LED
** 入口参数:x	LED所在列
			y	LED所在行
** 出口参数:无
*********************************************************************************************************/
void LED_Red_Display(uint8 x, uint8 y)
{
	uint32 LED_Data;
	uint8  LED_SEG;
	if((x == 0)||(x >= 13)) return;//超出正确的坐标范围
	if((y == 0)||(y >= 41)) return;//超出正确的坐标范围
	x -= 1;
	y -= 1;
	
	LED_SEG = Group_TAB[y/5];		//得到实际组排列的顺序
	
	LED_Data = ((y*12) + x)%60;		//计算此键在列表中的位置
	y = CH452_TAB[LED_Data];		//获取对应坐标表中的值
	LED_Data = CH452_SET_BIT | y;
	LED_Data = LED_Data & 0x00000FFF;
	
	Close_KEY(x);
	CH452_Write(LED_SEG,LED_Data); 
	Open_KEY(x); 
}
 /********************************************************************************************************
** 函数名称:LED_Display()
** 函数功能:点亮指定坐标的LED
** 入口参数:x	LED所在列
			y	LED所在行
** 出口参数:无
*********************************************************************************************************/
void LED_Red_Close(uint8 x, uint8 y)
{
	uint32 LED_Data;
	uint8  LED_SEG;
	if((x == 0)||(x >= 13)) return;//超出正确的坐标范围
	if((y == 0)||(y >= 41)) return;//超出正确的坐标范围
	x -= 1;
	y -= 1;
	
	LED_SEG = Group_TAB[y/5];		//得到实际组排列的顺序
	
	LED_Data = ((y*12) + x)%60;		//计算此键在列表中的位置
	y = CH452_TAB[LED_Data];		//获取对应坐标表中的值
	LED_Data = CH452_CLR_BIT | y;
	LED_Data = LED_Data & 0x00000FFF;
	
	Close_KEY(x);	
	CH452_Write(LED_SEG,LED_Data); 
	Open_KEY(x); 
}
 /********************************************************************************************************
** 函数名称:KEYBOARD_Init()
** 函数功能:初始化键盘板,CH452的初始化设置,包含对应的8个组的设置.
			和每组内LED显示和按键的设置.
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void KEYBOARD_Init(void)
{
	uint8 i,j;

	PINSEL0	= (PINSEL0 & (~(0x3F << 14)));					//设置P0.7 P0.8 P0.9为GPIO
	PINSEL0	= (PINSEL0 & (~(0x3F << 26)));					//设置P0.13 P0.15 为GPIO
	PINSEL1	= (PINSEL1 & (~(0x3F << 2 )));					//设置P0.17 P0.19 为GPIO

	IO0DIR	= KEY_CS0 | KEY_CS1 | KEY_CS2 | KEY_CS3 | RST;		//设置IO的输出方向

	CH452_4W_Init();		//初始化CH452接口

	SRST();			//硬件复位RST
	Delayms(60);
	CRST();
		
	Delayms(0xFF);
	Delayms(0xFF);
	Delayms(0xFF);
	Delayms(0xFF);
	
	for(i=0;i<8;i++)//软件指令复位
	{
		CH452_Write(i,CH452_RESET << 12);	
		CH452_Write(i,CH452_RESET & 0x00000FFF);
	}
	
	Delayms(60);
	
	for(i=0;i<8;i++)//各组CH452功能设置	中断低电平有效,字驱动低电平有效
	{		
		CH452_Write(i,CH452_SYSON1 << 12);			//前级CH452只开显示 CH452_SYSOFF CH452_SYSON1 CH452_SYSON2
		CH452_Write(i,CH452_SYSON2 & 0x00000FFF);	//后级CH452开键盘和显示
		CH452_Write(i,CH452_DSP << 12);
		CH452_Write(i,CH452_DSP & 0x00000FFF);
	}
		
	for(i=1; i<=40; i++)//所有段位清零
	{
		for(j=1; j<=12; j++)
		{	
			LED_Red_Close(j,i);
			LED_Green_Close(j, i);
		}
	}
	
	EINT0_Init();		//初始化中断EINT1
	KeyPointer = 0;
}

⌨️ 快捷键说明

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