进修医生有工资吗:7279键盘显示程序

来源:百度文库 编辑:偶看新闻 时间:2024/04/20 22:00:57
#include

  #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);

  }

  }