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

📄 hd7279a.c

📁 这是一个很不我键盘LED驱动参考程序,希望对大家有所帮助
💻 C
字号:
#include <reg52.h>

//*** 函数定义 ***

void long_delay (void);                             // 长延时
void short_delay (void);                            // 短暂延时
void delay10ms (unsigned char);                     // 延时10MS
void write7279 (unsigned char, unsigned char);      // 写入到HD7279
unsigned char read7279 (unsigned char);             // 从HD7279读出
void send_byte (unsigned char);                     // 发送一个字节
unsigned char receive_byte (void);                  // 接收一个字节

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

unsigned char digit[5];
unsigned char key_number, j, k;
unsigned int tmr;
unsigned long wait_cnter;
sbit cs = P0^4;                                     // cs  连接 P1.1
sbit clk = P0^5;                                    // clk 连接于 P1.2
sbit dat = P0^6;                                    // dat 连接于 P1.3
sbit key = P1^4;                                    // key 连接于 P1.4

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

#define CMD_RESET 0xa4                              // 复位
#define CMD_TEST 0xbf                               // 测试
#define DECODE0 0x80                                // 方式0译码
#define DECODE1 0xc8                                // 方式1译码
#define CMD_READ 0x15                               // 读键盘指令
#define UNDECODE 0x90                               // 方式2译码
#define RTL_CYCLE 0xa3                              // 循环左移
#define RTR_CYCLE 0xa2                              // 循环右移
#define RTL_UNCYL 0xa1                              // 左移指令
#define RTR_UNCYL 0xa0                              // 右移指令
#define ACTCTL 0x98                                 // 消隐指令
#define SEGON 0xe0                                  // 段亮指令
#define SEGOFF 0xc0                                 // 段关闭指令
#define BLINKCTL 0x88                               // 闪烁指令

//*** 主程序 ***

void main()
{
  while (1)
  {
	for (tmr=0;tmr<0x2000;tmr++) ;                  // 上电延时
    send_byte (CMD_RESET);                          // 复位HD7279A

//***********************************************
//                 测试指令演示
//***********************************************
    send_byte (CMD_TEST);                           // 测试指令
    for (j=0; j<3; j++)
    {
      delay10ms (100);
    }
	send_byte (CMD_RESET);                          // 清除指令

//***********************************************
//           闪烁指令及键盘接口测试
//    将用户按键的键码显示出来,如果10秒内无按键
//    或按S0键即进入下一步演示           
//***********************************************

    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 &0xff);      // 在第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++)                             //   计数初始值为0000
	{
      digit [j] = 0;
      write7279 (DECODE0+j,digit [j]);
	}
	  while (digit [4] < 1)                         //如果计数达到20000就停止
	  {
	    digit [0]++;
	      if (digit [0] > 9)
		  {
		    digit [0] = 0;
			digit [1]++;
			  if (digit [1] > 9)
			  {
			    digit [1] = 0;
			    digit [2]++;
			      if (digit [2] > 9)
				  {
				    digit [2] = 0;
			        digit [3]++;
			          if (digit [3] > 9)
					  {
					    digit [3] = 0;
			            digit [4]++;
			              if (digit [4] > 9)
						  {
						    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 [0] == 3)
						{
						  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++)
	{
	  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);

//***********************************************
//            译码方式1及右移指令测试
//***********************************************

    for (j=0; j<16; j++)
	{
      send_byte (RTR_UNCYL);                        // 不循环右移指令
	  write7279 (DECODE1 +7, j);                    // 译码方式0指令,显示在第8位
      delay10ms (50);
	}
	delay10ms (150);

//***********************************************
//                 消隐指令测试
//***********************************************

    k = 0xff;
      for (j=0; j<6; j++)
	  {
        k = k/2;
	    write7279 (ACTCTL,k);                       // 每隔一秒钟增加一个消隐位
	    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);
    }
  }
}
//***********************************************
//                   写入7279
//***********************************************

    void write7279 (unsigned char cmd, unsigned char dta)
	{
      send_byte (cmd);
      send_byte (dta);
	}
  
//***********************************************
//                   读7279
//***********************************************

    unsigned char read7279 (unsigned char command)
	{
      send_byte (command);
      return (receive_byte());
	}

//***********************************************
//                   发送字节
//***********************************************

    void send_byte (unsigned char out_byte)
	{
      unsigned char 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;
	}

//***********************************************
//                   接收字节
//***********************************************

  unsigned char receive_byte (void)
  {
    unsigned char 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)
  {
    unsigned char i;
    for (i=0; i<0x30; i++);
  }

  void short_delay (void)
  {
    unsigned char i;
    for (i=0;i<8;i++);
  }

//***********************************************
//               延时 n*10ms
//***********************************************

  void delay10ms (unsigned char time)
  {
    unsigned char i;
    unsigned int 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 + -