📄 ch452.c
字号:
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 + -