?? 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 + -