📄 ch451.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 + -