📄 ch452.c
字号:
/****************************************************************************
* 文件名: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 + -