⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7279测试程序.c

📁 7279液晶显示电路及程序资料包含了液晶7279的电路
💻 C
字号:
/********************************************************/
//           hd7279显示驱动程序                           //
//                共阴数码管                            //
//             dafu   08-05-14                          //
/*******************************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void long_delay(void);    //      长延时
void short_delay(void);    //     短延时
void delay10ms(uchar);  // 10MS
void write7279(uchar, uchar);//写入到 HD7279
uchar read7279(uchar);//从 HD7279读出
void send_byte(uchar);  // 发送一个字节
uchar receive_byte(void); // 接收一个字节

//**************** 变量及I/O口定义 ******************

uchar digit[5];
uchar key_number, j, k;
uint tmr;
unsigned long wait_cnter;
sbit cs=P2^7;       // cs   连接于 P1.4
sbit clk=P1^6;      // clk  连接于P1.5
sbit dat=P1^7;      // dat  连接于P1.2
sbit key=P1^3;      // key  连接于 P1.3

//****** HD7279A 指令 ****************************

#define CMD_RESET 0xa4        //复位
#define CMD_TEST 0xbf         //测试
#define DECODE0 0x80          // 下载数据方式0译码
#define DECODE1 0xc8          //下载数据方式1译码
#define CMD_READ 0x15         // 读键盘
#define UNDECODE 0x90         //下载数据但不译码
#define RTL_CYCLE 0xa3        // 循环左移   (数据不变)
#define RTR_CYCLE 0xa2        //循环右移
#define RTL_UNCYL 0xa1        //左移       (空位为0)
#define RTR_UNCYL 0xa0        //右移
#define ACTCTL 0x98           //消隐
#define SEGON 0xe0            //段点亮
#define SEGOFF 0xc0           //段关闭
#define BLINKCTL 0x88         //闪烁控制       (0闪/1不闪)
//*************************主程序**************
main()

{
 while (1)
 {
  for (tmr=0;tmr<0x2000;tmr++); //       上电延时
  send_byte(CMD_RESET);  // 复位HD7279A
  /*
//******************************************
//            测试指令演示
//******************************************
  send_byte(CMD_TEST);  //
  for (j=0;j<3;j++)  // 3
  {
   delay10ms(100);
  }
  send_byte(CMD_RESET); //      
//**********************************************
//     闪烁指令及键盘接口测试
//     将用户的键码显示出来,如十秒内无键按下或
//     按下SO键进入下一步演示
//**********************************************
*/
  wait_cnter=0;
  key_number=0xff;
/*  write7279(BLINKCTL,0xfc); // 第1,2两段设为闪烁显示
  write7279(UNDECODE,0X08); // 第1位显示'_'
  write7279(UNDECODE+1,0x08);// 第2位显示'_'
  do
  {
   if (!key)  //   如果有键按下
   {
     key_number=read7279(CMD_READ);
 //   读出键码
     write7279(DECODE1+1,key_number/16);
 // 在第2位显示键码高8位
     write7279(DECODE1,key_number&0x0f);
 // 在第1位显示键码低8位
        while (!key);  // 等待按键释放
     wait_cnter=0;
   }
   wait_cnter++;
    }
    while (key_number!=0 && wait_cnter<0x30000);
 //  按键为0或超时进入下一步

  write7279(BLINKCTL,0xff); //     消除闪烁设置
                       */
//******************************************
//           快速记数演示
//******************************************

  for (j=0;j<5;j++)  // 记数初值为00000
  {
   digit[j]=0;
   write7279(DECODE0+j,digit[j]);
  }
  while (digit[4]<2)  // 如果记数到20000就停止
  {
   digit[0]+1;        //第一个数码管加1
   if (digit[0]>9)    //  若>9,第一个数码管清零
   {
    digit[0]=0;
    digit[1]+1;          //第二个数码管加1
    if (digit[1]>9)      //若>9,第一,二个数码管清零
    {
     digit[1]=0;
     digit[2]+1;
     if (digit[2]>9)
     {
      digit[2]=0;
      digit[3]+1;
      if (digit[3]>9)
      {
       digit[3]=0;
       digit[4]+1;
       if (digit[4]>2)     //第五个数码管>2,清零,从新开始
       {
         digit[4]=0;
       }
      }
     }
    }
   }
   write7279(DECODE0,digit[0]);    //译码显示
   if (digit[0]==0)
   {
    write7279(DECODE0+1,digit[1]);

    if (digit[1]==0)
    {
      write7279(DECODE0+2,digit[2]);
          if (digit[2]==0)
      {
            write7279(DECODE0+3,digit[3]);
            if (digit[3]==0)
            {
            write7279(DECODE0+4,digit[4]);
            }
      }
    }
   }
  }
  delay10ms(150);
  send_byte(CMD_RESET); //  清除显示
                 /*
//*************************************************
//             下载数据但不译码测试
//*************************************************
  write7279(UNDECODE+7,0x49);
 // 在第8位按不译码显示三
  delay10ms(80);
//*************************************************
//    循环左右移测试       
//      右3次,左3次
//*************************************************
  for (j=0;j<23;j++)       //8*3
  {
   send_byte(RTR_CYCLE); // 循环右移23次
   delay10ms(12);
  }
  for (j=0;j<23;j++)
  {
   send_byte(RTL_CYCLE); // 循环左移23次
   delay10ms(12);
  }
//*********************************************
//           译码0,左移测试

//*********************************************
  for (j=0;j<16;j++)
  {
   send_byte(RTL_UNCYL); //    不循环左移指令
   write7279(DECODE0,j);
 // 译码0显示在第1位
   delay10ms(50);
  }
  delay10ms(150);
  send_byte(CMD_RESET);     //复位
//*********************************************
//      译码1,右移测试
//*********************************************
  for (j=0;j<16;j++)
  {
   send_byte(RTR_UNCYL); //   不循环左移指令
   write7279(DECODE1+7,j);
 // 译码1显示在第8位
   delay10ms(50);
  }
  delay10ms(150);
//*********************************************
//        消隐测试
//*********************************************
  k=0xff;
  for (j=0;j<6;j++)
  {
      k=k/2;
      write7279(ACTCTL,k);//每隔1s增加一个消隐位
      delay10ms(100);
  }
  write7279(ACTCTL,0xff); // 恢复8位显示
  delay10ms(100);
  send_byte(CMD_RESET); //

//**********************************************
//          段点亮指令和 段关闭指令
//**********************************************
  for (j=0;j<64;j++)

  {
      write7279(SEGON,j);  // 将64个段逐个点亮
      write7279(SEGOFF,j-1);  //同时将前一个段关闭
      delay10ms(20);
  }
 }
}

/**************写入指令*************************
void write7279(uchar cmd, uchar dta)
{
 send_byte (cmd);
 send_byte (dta);
}
 /
/**************读出指令**********************
uchar read7279(uchar command)
{
 send_byte(command);
 return(receive_byte());
}
/*************发送一个字节指令*****************/
void send_byte( uchar out_byte)
{
 uchar i;
 cs=0;
 long_delay();
 for (i=0;i<8;i++)
 {
  if (out_byte&0x80)
  {
   dat=1;
  }
  else
  {
   dat=0;
  }
  clk=1;
  short_delay();
  clk=0;
  short_delay();
  out_byte=out_byte*2;
 }

 dat=0;
}
/***********接收一个字节指令***********************/
uchar receive_byte(void)
{
  uchar i, in_byte;
 dat=1;    //
 long_delay();
 for (i=0;i<8;i++)
 {
  clk=1;
  short_delay();
  in_byte=in_byte*2;
  if (dat)
  {
   in_byte=in_byte|0x01;
  }
  clk=0;
  short_delay();
 }
 dat=0;
 return (in_byte);
}
/*************长延时******************************/
void long_delay(void)
{
  uchar i;
 for (i=0;i<0x30;i++);
}
/*************短延时*******************************/
void short_delay(void)
{
  uchar i;
 for (i=0;i<8;i++);
}
//*********************n*10ms**********************/
void delay10ms(uchar time)
{
  uchar i;
  uint j;

 for (i=0;i<time;i++)
 {
  for(j=0;j<0x390;j++)
  {
   if (!key)
   {
    key_int();
   }
  }
 }
}
/*************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -