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

📄 ch451.c

📁 ch451键盘LED管理芯片的驱动程序,很好用的,设计很标准的代码
💻 C
字号:
#include "ch451.h"
#include "cd4094.h"
#include "hardware.h"
/*
*****************************************************
**硬件说明:
**1.显示 []    []    :   []   []
**       DIG0 DIG1 DIG2 DIG3 DIG4
**2. :DIG2-SEG0,SEG1
**3. 键盘dig5,dig6,dig7------seg0~seg7
**4. ch451_cs接CD4094输出口线
*****************************************************
*/

/////////////////////////////////////////////////////////////////////////
//
void WriteCh451(unsigned int iCmd);
unsigned char ReadCh451();


void          InitCh451();
unsigned char IsKbhit();
unsigned char GetKeyValue(unsigned char *ch);
unsigned char WaitForKeyDown(unsigned char *ch,unsigned long timeout);
void          WaitForKeyUp();
void          DispClock(unsigned char hour,unsigned char minute,bit flag);


void WriteCh451(unsigned int iCmd)
{
        unsigned int xdata i;

        WatchDog();

        SelectChip(SEL_CH451);

        NOP;NOP;NOP;
        for(i=0;i<12;i++)
	{               

                if(iCmd&0x01) SPI_SI=1;
                else          SPI_SI=0;


                SPI_SCK=0;
                NOP;NOP;NOP;
		SPI_SCK=1;
                NOP;NOP;NOP;

                iCmd=iCmd>>1;

	}
        NOP;NOP;NOP;

        SelectChip(SEL_NULL);

}


unsigned char ReadCh451()
{

        unsigned int xdata i=0;
        unsigned char xdata ch=0;
        unsigned char xdata iCmd=0x07;
        bit kk;

        WatchDog();

        //1.写4位标识
        SelectChip(SEL_CH451);
        //NOP;NOP;NOP;
        for(i=0;i<4;i++)
	{
        
                SPI_SCK=0;
                NOP;NOP;NOP;

                if(iCmd&0x01) SPI_SI=1;
                else          SPI_SI=0;

		SPI_SCK=1;
                NOP;NOP;NOP;
                iCmd=iCmd>>1;

	}

        SelectChip(SEL_NULL);

        //2.read data
        for(i=0;i<7;i++)
        {
        
                        NOP;NOP;NOP;
                        kk=CH451_SO;
                        ch=ch<<1;
                        if(kk)ch=ch+1;

                        NOP;NOP;NOP;
		        SPI_SCK=0;
		        NOP;NOP;NOP;
              		SPI_SCK=1;


        }

        return ch;
}

/////////////////////////////////////////////////////////////////////////
//CH451函数库
//初始化
void InitCh451()
{
        WatchDog();

        SPI_SI=0;
        SPI_SCK=1;
        SelectChip(SEL_CH451);
        CH451_SO=1;
        WriteCh451(CH451CMD_RESET );
        WriteCh451(CH451CMD_SET_SYSPARA+0x02);
        WriteCh451(CH451CMD_SET_DISPPARA+0x80);
}


/*
**************************************
**fun:scan key
**in:
**out:ch
**ret:0-表示有键按下
**    1-无键按下
**************************************
*/

unsigned char IsKbhit()
{
     if(CH451_SO==0)return ID_OK;
     else         return ID_ERR;
}
/*
       #define KEY_NUM_0		0x00
       #define KEY_NUM_1		0x01
       #define KEY_NUM_2		0x02
       #define KEY_NUM_3		0x03
       #define KEY_NUM_4		0x04
       #define KEY_NUM_5		0x05
       #define KEY_NUM_6		0x06
       #define KEY_NUM_7		0x07
       #define KEY_NUM_8		0x08
       #define KEY_NUM_9		0x09
       #define KEY_DOT                  0x0a
       #define KEY_ESC                  0x0b
       #define KEY_ENTER	        0x0c
       #define KEY_UP			0x0d
       #define KEY_DOWN                 0x0e
       #define KEY_RESERVE	        0x0f
*/
/*
**************************************
**fun:获取键值
**in:
**out:ch
**ret:0-表示新键按下
**    1-表示旧键按下
**************************************
1,2,3,4,5,6,7, 8,     9,  10,  11
seg0   _     seg7   dig5,dig6,dig7
0--------------7    dig5
8-------------15    dig6
8,9       10    11    12   13  14     15
          dot,  esc  enter up  down
*/
unsigned char GetKeyValue(unsigned char *ch)
{

        unsigned char xdata key=0;

        WatchDog();

        key=ReadCh451();
        if(key&0x40)                      //有键按下?
        {
               switch(key)
               {
                      case 0x45:
                      *ch=KEY_NUM_0;break;
                      case 0x4d:
                      *ch=KEY_NUM_1;break;
                      case 0x55:
                      *ch=KEY_NUM_2;break;
                      case 0x5d:
                      *ch=KEY_NUM_3;break;
                      case 0x65:
                      *ch=KEY_NUM_4;break;
                      case 0x6d:
                      *ch=KEY_NUM_5;break;
                      case 0x75:
                      *ch=KEY_NUM_6;break;
                      case 0x7d:
                      *ch=KEY_NUM_7;break;

                      case 0x46:
                      *ch=KEY_NUM_8;break;
                      case 0x4e:
                      *ch=KEY_NUM_9;break;
                      case 0x56:
                      *ch=KEY_DOT;break;
                      case 0x5e:
                      *ch=KEY_ESC;break;
                      case 0x66:
                      *ch=KEY_ENTER;break;
                      case 0x6e:
                      *ch=KEY_UP;break;
                      case 0x76:
                      *ch=KEY_DOWN;break;
                      case 0x7e:
                      *ch=KEY_RESERVE;break;

                      default:
                      *ch=KEY_RESERVE;break;
               }
               return ID_OK;

        }

        return ID_ERR;

}

/*
**************************************
**fun:wait for a key
**in:timeout超时 ,循环计数,0---死等,其他超时
**out:ch
**ret:0-表示有键按下
**    1-无键按下,超时
**************************************
*/
unsigned char WaitForKeyDown(unsigned char *ch,unsigned long timeout)
{
        unsigned char xdata key=0;

        WatchDog();

        if(timeout==0)
        {
                while(1)
                {
                        WatchDog();
                        if(IsKbhit()==ID_OK)
                        {
                                if(GetKeyValue(&key)==ID_OK)break;
                        }
                }
                *ch=key;
                return ID_OK;
        }

        while(--timeout)
        {
                WatchDog();
                if(IsKbhit()==ID_OK)
                {
                        if(GetKeyValue(&key)==ID_OK)break;
                }
        }

        if(timeout==0)
        {
                return ID_ERR;
        }
        else
        {
                *ch=key;
                return ID_OK;
        }
}

void WaitForKeyUp()
{
        unsigned char xdata key=0;

        WatchDog();

        while(1)
        {
                WatchDog();
                if(GetKeyValue(&key)==ID_ERR)return;
        }

}

/*
**************************************
**fun:显示时间
**in: hour-ASCII码,minute-ASCII码,flag-标志是否显示
**   12:30     0x12,0x30,1
**out:
**ret:
**************************************
*/
void DispClock(unsigned char hour,unsigned char minute,bit flag)
{
        unsigned char xdata hour_l,hour_h;
        unsigned char xdata minute_l,minute_h;

        WatchDog();

        hour_l=hour&0x0f;
        hour_h=(hour&0xf0)>>4;
        minute_l=minute&0x0f;
        minute_h=(minute&0xf0)>>4;

        if(flag==1)
        {
                WriteCh451(CH451CMD_SET_SYSPARA+0x03);
                WriteCh451(CH451CMD_LOAD_DATA0+hour_h);
                WriteCh451(CH451CMD_LOAD_DATA1+hour_l);
                WriteCh451(CH451CMD_LOAD_DATA2+0x07);
                WriteCh451(CH451CMD_LOAD_DATA3+minute_h);
                WriteCh451(CH451CMD_LOAD_DATA4+minute_l);

        }
        else
        {
                //灭掉显示
                WriteCh451(CH451CMD_SET_SYSPARA+0x02);

        }
}

⌨️ 快捷键说明

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