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

📄 saa1064_x86.c.txt

📁 这是《嵌入式linux-硬件、软件与接口》一书对应的所有linux方面实例的源代码
💻 TXT
字号:
/*
 * SAA1064_x86 v1.0 11/05/01
 * www.embeddedlinuxinterfacing.com
 *
 * The original location of this code is
 * http://www.embeddedlinuxinterfacing.com/chapters/10/
 *
* Copyright (C) 2001 by Craig Hollabaugh
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Library General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

/* SAA1064_x86
 * This program demonstrates communication with a SAA1064 I2C LED
 * display driver using the i2c-pport x86 parallel port device driver.
 *
 * For more Linux I2C information, visit the lm_sensors site at
 * http://www.lm-sensors.nu/
 *
 * This program opens the I2C device driver file, sets the address for
 * SAA1064-#0 then sends it 6 bytes.
 * byte 1 - internal starting SAA1064 register address
 * byte 2 - configuration register setting
 * byte 3 - LED segment 1 value
 * byte 4 - LED segment 2 value
 * byte 5 - LED segment 3 value
 * byte 6 - LED segment 4 value
 *
 * For more SAA1064 or I2C protocol, visit the Philips Semiconductor website
 * at http://www.semiconductors.philips.com
 */

/*
gcc -I/usr/src/linux/include -o SAA1064_x86 SAA1064_x86.c
 */

#include <fcntl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

int main(void)
{
  int file;
  int address;
  unsigned char buffer[10], i;

/* seg is a segment mapping table. Element 0, 0xFC, tells the
 * SAA1064 to turn on the segments to display a 0. Likewise,
 * seg's other entries map to 1 through 9 and a through f.
 */
  unsigned char seg[] = { 0xFC, 0x60, 0xDA, 0xF2, 0x66,
                          0xB6, 0xBE, 0xE0, 0xFE, 0xF6,
                          0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E } ;


  if (( file = open("/dev/i2c0",O_RDWR)) < 0) {
    printf("Can't open /dev/i2c0\n");
    exit(1);
  }

  address = 0x38;

/*
 * Why 0x38? Philip's SAA1064 group address is 0111, the SAA1064-#0 is
 * an address zero, making it's full address 0111.0000 which is 0x70.
 * The I2C driver wants addresses divided by 2, so 0x70 / 2 = 0x38.
 */
  if (ioctl(file,I2C_SLAVE,address) < 0) {
    printf("Can't set address\n");
    exit(1);
  }

  buffer[0] = 0x00;   /* internal starting SAA1064 register address */
  buffer[1] = 0x46;   /* 12mA current, all digits on, dynamic mode */
  buffer[2] = seg[1]; /* this puts a '1' on the display segment 1 */
  buffer[3] = seg[2]; /* this puts a '2' on the display segment 2 */
  buffer[4] = seg[3]; /* this puts a '3' on the display segment 3 */
  buffer[5] = seg[4]; /* this puts a '4' on the display segment 4 */

  if ( write(file,buffer,6) != 6) {
    printf("Write failed\n");
    close(file);
    exit(1);
  }

  close(file);
}

⌨️ 快捷键说明

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