#include <reg52.h> #define CMD_RESET 0xa4 //复位(清除)指令 #define CMD_TEST 0xbf //测试指令 #define CMD_READ 0x15 //读键盘数据指令 #define BLINKCTL 0x88 //闪烁控制 #define ACTCTL 0x98 //消隐控制 #define DECODE0 0x80 //下载数据且按方式0译码 #define DECODE1 0xc8 //下载数据且按方式1译码 #define UNDECODE 0x90 //下载数据但不译码 #define SEGON 0xe0 //段点亮指令 #define SEGOFF 0xc0 //段关闭指令 #define RTL_CYCLE 0xa3 //循环左移指令 #define RTR_CYCLE 0xa2 //循环右移指令 #define RTL_UNCYL 0xa1 //左移指令 #define RTR_UNCYL 0xa0 //右移指令 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //*******************变量及I/O口定义********************** sbit cs=P1^0; //7279使能端 sbit clk=P1^1; //7279时钟脉冲 sbit dat=P1^2; //7279数据端 sbit key=P1^3; //7279键位 /**************函数原型说明****************/ void write7279(uchar,uchar); //写入到HD7279 void send_uchar(uchar); //发送一个字节 void Init_Timer0(); void short_delay(void); //延时约8us void long_delay(void); //延时约50us uchar ucHMiao=0,ucSec=0,ucMin=0,ucHour=0; uchar bflag=0; //1秒标记 //uchar ww_led[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70, 0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47,0x00,0x67}; //0--9的数码表 uchar ww_led[]={0xdb,0xc0,0xb3,0xf2,0xe8,0x7a,0x6b,0xd0, 0xfb,0xf8};//0--9的数码表 uchar Led_buf[6]={0x5b,0x0f,0x77,0x77,0x0f,0x00};//START十六进制代码 uchar led_buf[]; //***************************************** //发送数据给7279显示 //***************************************** void send_uchar(uchar out_uchar) { uchar i; cs=0; long_delay(); for(i=0;i<8;i++) { if(out_uchar&0x80) dat=1; else dat=0; clk=1; short_delay(); clk=0; short_delay(); out_uchar=out_uchar*2; } dat=0; } //********************************** // 函数功能:接收一个字节 // 形式参数:无 // 返回值 :接收到的字节in_uchar //********************************** uchar receive_uchar(void) { uchar i,in_uchar; dat=1; //设为输入状态 long_delay(); for(i=0;i<8;i++) { clk=1; short_delay(); in_uchar=in_uchar*2; if(dat) in_uchar=in_uchar|0x01; clk=0; short_delay(); } dat=0; return(in_uchar); } //************************************************ *********** // 函数功能:往7279发送一个不带数据的指令,然后读出7279的值 // 形式参数:要发送的指令commond // 返回值 :无 //************************************************ *********** uchar read7279(uchar commond) { send_uchar(commond); return(receive_uchar()); } //***************************************** // 函数功能:找出键值为value的按键的键号 // 形式参数:键值value // 返回值 :查到的键号i //***************************************** uchar get_key_number(uchar value) { uchar i; uchar KEY_CODE[]={ 0x04,0x05,0x06,0x07, 0x0c,0x0d,0x0e,0x0f, 0x14,0x15,0x16,0x17, 0x1c,0x1d,0x1e,0x1f}; //键值表 for(i=0;value!=KEY_CODE[i];i++); return i; } uchar Key_Scan(void) { uchar key_value,key_number; if(!key) //如果有键按下 { key_value=http://blog.soso.com/qz.q/read7279(CMD_READ); //读出键值 key_number=get_key_number(key_value); //查出键号 while(!key);////////////////////////////////////// /////////////////////////////////////////////////// //// return key_number; } else { return (0xff); } } //**************************************** // 函数功能:往7279发送一个带数据的指令 // 形式参数:命令commond(数码管位子),数据Data(显示的数据) // 返回值 :无 //**************************************** void write7279(uchar commond,uchar Data) { send_uchar(commond); send_uchar(Data); } //*********************** // 函数功能:延时约8us // 形式参数:无 // 返回值 :无 //*********************** void short_delay(void) //延时约8us { uchar i; for(i=0;i<2;i++); } //************************ // 函数功能:延时约50us // 形式参数:无 // 返回值 :无 //************************ void long_delay(void) //延时约50us { uchar i; for(i=0;i<12;i++); } void Disp(uint k) //时间处理函数 { uchar i; led_buf[0]= k%10; led_buf[1]= k%100/10; led_buf[2]= k%1000/100; led_buf[3]= k%10000/1000; for(i=0;i<4;i++) //显示6位数码管 { write7279(0x90+i,0); //0X90为最右边数码管 write7279(DECODE1+i,Led_buf[i]); //0X90为最右边数码管 } } void int_7279(void) { uchar i; /**********************初始化***********************************/ send_uchar(CMD_RESET); for(i=0;i<8;i++) { write7279(UNDECODE+i,1); } } ![]() |
|