又到一年单片机课设时,放一下我以前抄来的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; }