CH452子函数

又到一年单片机课设时,放一下我以前抄来的CH452子函数吧,附带自己写的沙雕按键判断

#define u8 unsigned char
#define u16 ?unsigned int
#define u32 ?unsigned long int

#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显示*/

sbit ch452_clk=P2^4; //串行数据时钟上升延激活
sbit ch452_din=P2^5; // 串行数据输出,接CH452的数据输人
sbit ch452_load=P2^6; //串行命令加载,上升延激活
sbit ch452_dout=P2^7; ? //键值数据输入,接ch452数据输出 ?
//以下段码仅针对我用的板子,照抄请自行酌情改动
u8 BCD[10]={0xbd, 0x18, 0xd5, 0xd9, //0,1,2,3数据16进制码
? 0x78, 0xe9, 0xed, 0x98,//4,5,6,7
? 0xfd, 0xf8 //8,9
?};?

//--a--
//|f ? |b
//| ? |
//--g---
//|e ? |c
//| ? ?|
//---d-- ?...h

//7654 3210
//agfb cehd

/********************************************************************
函 数 名:ch452_init()
功 能:对ch452芯片进行初始化?
***********************************************************************/
void ch452_init(void)
{
? ch452_din ?= 0; ? /*先低后高,选择4线输入*/
? ch452_din ?= 1;
? ch452_load = 1;
? ch452_clk ?= 1;
?}

/********************************************************************
函 数 名:ch452_write()
功 能:把12位的指令或数据写入ch452
说 明:12位数据或指令的写入顺序是低位
入口参数:command
***********************************************************************/
void ch452_write(unsigned int command)
{
? unsigned char i;
? ch452_load=0;/*命令开始*/
? for(i=0;i<12;i++)
? { /*送入12位数据,低位在前*,&表按位与,如5&7=5,即:0101^0111=5*/
ch452_din=command&1;
ch452_clk=0;
ch452_clk=1;
command>>=1;/*上升沿有效*/
? }
? ch452_load=1; /*加载数据*/
? }

//*************************************************
//读数据子程序,MCU从452读一字节
//*************************************************
u8 ?ch452_read()
{
u8 i;
u8 command,keycode;//定义命令字,和数据存储器 ? ? ? ? ? ? ?
ET0=0;
command=0x07; ? ? ? ? ? ? ? //输入读452命令字
ch452_load=0;
for(i=0;i<4;i++)
{
? ? ch452_din=command&1; ? ? ?//送入最低位
? ? ch452_clk=0; ?
? ? command>>=1; ? ? ?//往右移一位
? ? ch452_clk=1; ? ? ?//产生时钟上升沿锁通知CH452输入位数据
}
ch452_load=1; ? ? ?//产生加载上升沿通知CH452处理命令数据
keycode=0; ? ? ?//清除keycode
for(i=0;i<7;i++)
{
? ? keycode<<=1; ? ? ?//数据移入keycode,高位在前,低位在后
? ? keycode|=ch452_dout; ? ? ?//从高到低读入452的数据
? ? ch452_clk=0; ? ? ?//产生时钟下升沿通知CH452输出下一位
? ? ch452_clk=1;
}
return(keycode); ? ? //反回键值
}

//*************************************************
//按键判断,仅针对我用的板子,用case限定范围是因为计算方法总是跑飞……
//使用的时候直接把read子函数套进传入参数位置就ok了
//*************************************************
u8 key_judge(u8 key_code)
{
u8 num;
switch(key_code)
{
case 0x44:
num=1;
break;
case 0x45:
num=2;
break;
case 0x46:
num=3;
break;
case 0x47:
num=4;
break;
case 0x4c:
num=5;
break;
case 0x4d:
num=6;
break;
case 0x4e:
num=7;
break;
case 0x4f:
num=8;
break;
default:
num=0;
break;?
}
return num;
}