虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

74HC595驱动

  • 深入浅出AVR单片机--从ATMega48/88/168开始

    深入浅出AVR单片机思路清晰,以AVR单片机为载体,介绍了初学单片机所必须掌握的专业知识。书中语言严谨但不乏幽默风趣,配以大量的照片、图示和实例程序,使读者在愉悦中完成专业知识的学习,并培养了学习嵌入式系统的兴趣。本书在讲述AVR单片机的同时,更注重于对读者学习和设计能力的启发、培养,帮助他们养成“从实践中来,到实践中去”的科学方法论,为进一步的学习创造了基础。  本书讲述浅显、内容丰富、编排合理、实例详尽。首先介绍了如何阅读器件资料的方法,然后熟悉ICCAVR集成开发环境并搭建实验开发装置,接着从实际应用出发,启发式地介绍AVR单片机的常用资源和对应软件方法,最后较为全面地补充了从事嵌入式系统开发要扩展的软件知识。 第1篇 Are you ready? 第1章 学会阅读Datasheet  1.1 如何阅读PDF文件,如何获得Datasheet文件  1.2 Datasheet告诉我们些什么  1.3 如何看懂AVR的Datasheet  1.4 如何得到帮助  1.5 汇编语言执行时间的计算方法  1.6 ATmega48/88/168常用熔丝的作用及其配置方法  1.7 对误烧写为外部时钟模式的解锁方法  实例1 阅读74HC595 Datasheet 第2章 深入开发环境  2.1 认识ICC编译环境  2.2 事半功倍的代码生成器  2.3 ICC之不得不说的故事  2.4 AVR最小系统和下载线DIY  实例2 AVR最小系统DIY第2篇 Let\'s go! 第3章 从跑马灯开始  3.1 输入/输出界面   3.1.1 单片机的输入/输出设备——引脚   3.1.2 “芯”里有数——数码管显示   3.1.3 单片机的输入/输出设备——从按键到键盘  3.2 用ATmega48/88/168单片机端口驱动数码管  3.3 操纵ATmega48/88/168单片机端口  3.4 端口内建上拉电阻的使用  3.5 端口位操作  实例3 跑马灯  实例4 数码管的显示(上)  实例5 数码管的显示(下)  实例6 矩阵键盘 第4章 对不起接个电话  4.1 十万火急——中断  4.2 中断的特性  4.3 使用中断时的注意事项  4.4 ATmega48/88/168单片机有哪些中断源  4.5 如何编写一个中断的服务程序代码  4.6 ATmega48/88/168单片机中断的开关控制  4.7 ATmega48/88/168中断标志位  4.8 ATmega48/88/168中断优先级  4.9 ATmega48/88/168单片机中断向量  4.10 中断与查询之争  4.11 用查询方式响应外设中断  4.12 中断误触发  4.13 前后台与原子操作  实例7 中断唤醒的键盘扫描  实例8 旋转编码器 第5章 一秒究竟有多长  5.1 单片机与时间  5.2 软件延时  5.3 不需要加载的“自由计时器”  5.4 通过重加载控制定时中断周期  5.5 使用代码生成器生成定时器1初始化代码  5.6 定时器的其他工作模式  5.7 PWM波及其应用简介  5.8 人类能看懂的电子时钟——实时时钟简介  实例9 闪烁的灯  实例10 渐明渐暗的灯  实例11 复杂闪烁控制 第6章 电量低  6.1 从猜数游戏到A/D转换器  6.2 ATmega48/88/168的A/D转换器  6.3 ATmega48/88/168单片机中与A/D相关的引脚  6.4 ATmega48/88/168单片机中与A/D相关的寄存器  6.5 使用A/D时需要注意些什么  6.6 怎样知道A/D转换完成  6.7 读取A/D的转换结果  6.8 使用代码生成器生成ADC初始化代码  6.9 书写具有工程结构的初始化代码  6.10 电量计原理概述  …… 第7章 正在过收费站 第8章 包装的学问 第9章 傻孩子求职记 第10章 MISSION UPDATE第3篇 Code Name C 第11章 朝花夕拾 第12章 指针都是纸老虎 第13章 来自身边的启示 第14章 初识嵌入式系统

    标签: ATMega AVR 168 48

    上传时间: 2014-05-05

    上传用户:佳期如梦

  • 带键盘扫描和LED/LCD驱动显示板设计及源程序

    带键盘扫描和LED/LCD驱动显示板电路设计

    标签: LED LCD 键盘扫描 显示板

    上传时间: 2013-11-24

    上传用户:liaocs77

  • PWM模块单片机的步进电机细分驱动的理论和方法介绍

    本文介绍了一种PWM模块单片机的步进电机细分驱动方法。

    标签: PWM 模块 单片机

    上传时间: 2014-04-11

    上传用户:jrsoft

  • 驱动程序与应用程序的接口

    有两种方式可以让设备和应用程序之间联系:1. 通过为设备创建的一个符号链;2. 通过输出到一个接口WDM驱动程序建议使用输出到一个接口而不推荐使用创建符号链的方法。这个接口保证PDO的安全,也保证安全地创建一个惟一的、独立于语言的访问设备的方法。一个应用程序使用Win32APIs来调用设备。在某个Win32 APIs和设备对象的分发函数之间存在一个映射关系。获得对设备对象访问的第一步就是打开一个设备对象的句柄。 用符号链打开一个设备的句柄为了打开一个设备,应用程序需要使用CreateFile。如果该设备有一个符号链出口,应用程序可以用下面这个例子的形式打开句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3",  GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路径名的前缀“\\.\”告诉系统本调用希望打开一个设备。这个设备必须有一个符号链,以便应用程序能够打开它。有关细节查看有关Kdevice和CreateLink的内容。在上述调用中第一个参数中前缀后的部分就是这个符号链的名字。注意:CreatFile中的第一个参数不是Windows 98/2000中驱动程序(.sys文件)的路径。是到设备对象的符号链。如果使用DriverWizard产生驱动程序,它通常使用类KunitizedName来构成设备的符号链。这意味着符号链名有一个附加的数字,通常是0。例如:如果链接名称的主干是L“TestDevice”那么在CreateFile中的串就该是“\\\\.\\TestDevice0”。如果应用程序需要被覆盖的I/O,第六个参数(Flags)必须或上FILE_FLAG_OVERLAPPED。 使用一个输出接口打开句柄用这种方式打开一个句柄会稍微麻烦一些。DriverWorks库提供两个助手类来使获得对该接口的访问容易一些,这两个类是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass类封装了一个设备信息集,该信息集包含了特殊类中的所有设备接口信息。应用程序能有用CdeviceInterfaceClass类的一个实例来获得一个或更多的CdeviceInterface类的实例。CdeviceInterface类是一个单一设备接口的抽象。它的成员函数DevicePath()返回一个路径名的指针,该指针可以在CreateFile中使用来打开设备。下面用一个小例子来显示这些类最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface(  GUID* pClassGuid,  DWORD instance,  PDWORD pError){  CDeviceInterfaceClass DevClass(pClassGuid, pError);  if (*pError != ERROR_SUCCESS)    return INVALID_HANDLE_VALUE;  CDeviceInterface DevInterface(&DevClass, instance, pError);  if (*pError != ERROR_SUCCESS)    return INVALID_HANDLE_VALUE;  cout << "The device path is "    << DevInterface.DevicePath()    << endl;   HANDLE hDev;  hDev = CreateFile(   DevInterface.DevicePath(),    GENERIC_READ | GENERIC_WRITE,    FILE_SHARE_READ | FILE_SHARE_WRITE,    NULL,    OPEN_EXISTING,    FILE_ATTRIBUTE_NORMAL,    NULL  );  if (hDev == INVALID_HANDLE_VALUE)    *pError = GetLastError();  return hDev;} 在设备中执行I/O操作一旦应用程序获得一个有效的设备句柄,它就能使用Win32 APIs来产生到设备对象的IRPs。下面的表显示了这种对应关系。Win32 API  DRIVER_FUNCTION_xxxIRP_MJ_xxx  KDevice subclass member function CreateFile  CREATE  Create ReadFile  READ  Read WriteFile  WRITE  Write DeviceIoControl  DEVICE_CONTROL  DeviceControl CloseHandle  CLOSECLEANUP  CloseCleanUp 需要解释一下设备类成员的Close和CleanUp:CreateFile使内核为设备创建一个新的文件对象。这使得多个句柄可以映射同一个文件对象。当这个文件对象的最后一个用户级句柄被撤销后,I/O管理器调用CleanUp。当没有任何用户级和核心级的对文件对象的访问的时候,I/O管理器调用Close。如果被打开的设备不支持指定的功能,则调用相应的Win32将引起错误(无效功能)。以前为Windows95编写的VxD的应用程序代码中可能会在打开设备的时候使用FILE_FLAG_DELETE_ON_CLOSE属性。在Windows NT/2000中,建议不要使用这个属性,因为它将导致没有特权的用户企图打开这个设备,这是不可能成功的。I/O管理器将ReadFile和WriteFile的buff参数转换成IRP域的方法依赖于设备对象的属性。当设备设置DO_DIRECT_IO标志,I/O管理器将buff锁住在存储器中,并且创建了一个存储在IRP中的MDL域。一个设备可以通过调用Kirp::Mdl来存取MDL。当设备设置DO_BUFFERED_IO标志,设备对象分别通过KIrp::BufferedReadDest或 KIrp::BufferedWriteSource为读或写操作获得buff地址。当设备不设置DO_BUFFERED_IO标志也不设置DO_DIRECT_IO,内核设置IRP 的UserBuffer域来对应ReadFile或WriteFile中的buff参数。然而,存储区并没有被锁住而且地址只对调用进程有效。驱动程序可以使用KIrp::UserBuffer来存取IRP域。对于DeviceIoControl调用,buffer参数的转换依赖于特殊的I/O控制代码,它不在设备对象的特性中。宏CTL_CODE(在winioctl.h中定义)用来构造控制代码。这个宏的其中一个参数指明缓冲方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表显示了这些方法和与之对应的能获得输入缓冲与输出缓冲的KIrp中的成员函数:Method  Input Buffer Parameter  Output Buffer Parameter METHOD_BUFFERED  KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT  KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT  KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER  KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代码指明METHOD_BUFFERED,系统分配一个单一的缓冲来作为输入与输出。驱动程序必须在向输出缓冲放数据之前拷贝输入数据。驱动程序通过调用KIrp::IoctlBuffer获得缓冲地址。在完成时,I/O管理器从系统缓冲拷贝数据到提供给Ring 3级调用者使用的缓冲中。驱动程序必须在结束前存储拷贝到IRP的Information成员中的数据个数。如果控制代码不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,则DeviceIoControl的参数呈现不同的含义。参数InputBuffer被拷贝到一个系统缓冲,这个缓冲驱动程序可以通过调用KIrp::IoctlBuffer。参数OutputBuffer被映射到KMemory对象,驱动程序对这个对象的访问通过调用KIrp::Mdl来实现。对于METHOD_OUT_DIRECT,调用者必须有对缓冲的写访问权限。注意,对METHOD_NEITHER,内核只提供虚拟地址;它不会做映射来配置缓冲。虚拟地址只对调用进程有效。这里是一个用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE来定义一个IOCTL代码:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)现在使用一个DeviceIoControl调用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING,  NULL, // no input  注意,这里放的是包含有执行操作命令的字符串指针  0, FirmwareRev,      //这里是output串指针,存放从驱动程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize,  NULL // not overlapped I/O );如果输出缓冲足够大,设备拷贝串到里面并将拷贝的资结束设置到FirmwareRevSize中。在驱动程序中,代码看起来如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){  ULONG fwLength=0;  switch ( I.IoctlCode() )  {    case IOCTL_MYDEV_GET_FIRMWARE_REV:      fwLength = strlen(FIRMWARE_REV)+1;      if (I.IoctlOutputBufferSize() >= fwLength)      {        strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV);        I.Information() = fwLength;         return I.Complete(STATUS_SUCCESS);      }      else      {              }    case . . .   } }

    标签: 驱动程序 应用程序 接口

    上传时间: 2013-10-17

    上传用户:gai928943

  • 24c16读写驱动程序

    24c16读写驱动程序,//=-------------------------------------------------------------------------------/*模块调用:读数据:read(unsigned int address)写数据:write(unsigned int address,unsigned char dd)   dd为要写的 数据字节*///------------------------------------------------------------------------------ sbit sda=P3^0;sbit scl=P3^1; sbit a0=ACC^0;                  //定义ACC的位,利用ACC操作速度最快sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7; //------------------------------------------------------------------------------#pragma disablevoid s24(void)                 //起始函数{_nop_();    scl=0;     sda=1;    scl=1;    _nop_();    sda=0;    _nop_();    _nop_();    scl=0;     _nop_();    _nop_();    sda=1;} //------------------------------------------------------------------------------#pragma disablevoid p24(void)                 //停止函数{sda=0;    scl=1;    _nop_();    _nop_();    sda=1;} //-----------------------------------------------------------------------------#pragma disableunsigned char rd24(void) /////////////////从24c16读一字节数据{       ACC=0x00;sda=1;scl=1;a7=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a6=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a5=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a4=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a3=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a2=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a1=sda;_nop_();_nop_();_nop_();_nop_();scl=0;scl=1;a0=sda;_nop_();_nop_();_nop_();_nop_();scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0; /// ///////////////24c16的一位回答位。return(ACC);}//------------------------------------------------------------------------------#pragma disablevoid wd24(unsigned char dd) ////////////////向24c16写一字节数据{      sda=1;ACC=dd;sda=a7;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a6;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a5;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a4;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a3;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a2;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=a0;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;sda=0;scl=1;//scl=0;(在下面程序中)}//---------------------------------------------------------------------------#pragma disableunsigned char read(unsigned int address){unsigned char dd;    s24();                        ////////////////////////开始条件    wd24(0xa0);                /////////////////////////写器件地址(写命令)     _nop_();_nop_();_nop_();_nop_();      scl=0;                        ///////////////////////////////////接收器件地址确认信号    wd24(address);                //////////////////////////// 写数据地址    _nop_();_nop_();_nop_();_nop_();    scl=0;s24();                             ///////////////////////////////////开始条件    wd24(0xa1);                 /////////////////////////////写器件地址(读命令)    scl=0;    dd=rd24();              //////////////////////////////////读 一字节    p24();                   ////////////////////////////////////停止条件    return(dd);}//------------------------------------------------------------------------------#pragma disablevoid write(unsigned int address,unsigned char dd){s24();                        /////////////////开始条件    wd24(0xa0);            ////////////////////////写器件地址;    scl=0;     wd24(address);              /////////////////////写数据地址    scl=0;    wd24(dd);                  //////////////////////////写dd数据    scl=0;    p24();                      /////////////////////////停止条件;  }          

    标签: 24c16 读写 驱动程序

    上传时间: 2013-11-18

    上传用户:墙角有棵树

  • LCD为LCM161(HD44780驱动器)字符显示器驱动程

    LCD为LCM161(HD44780驱动器)字符显示器驱动程序       ;说明:本LCD为LCM161(HD44780驱动器)字符显示器.      ;接线:LCD D0-D8(PIN7-14) 对映用户板P0.0--P0.7      ;      LCD VSS(PIN1) 接 GND,VDD(PIN2)接+5V,LCD驱动电源V0(PIN3)接可调电阻ADJ,调节亮度      ;      LCD寄存器选择RS(PIN4)接P2.0,读写选择R/W(PIN5)接P2.1,使能端EN(PIN6)接P2.2(高电平有效)      ;本程序采用I/O口模仿总线时序,故无需做任何硬件扩展.屏幕显示:"I'm SuperICES! ",

    标签: 44780 LCD 161 LCM

    上传时间: 2013-10-17

    上传用户:ssz1990

  • 6位8段数码管驱动电路及C语言驱动程序

    6位LED显示接口说明:P0.0---P0.7  通过7406 驱动LED的8个段;P2.0---P2.5  通过UN2003驱动6个LED 的公共端

    标签: 8段数码管 驱动电路 C语言 驱动程序

    上传时间: 2013-10-26

    上传用户:VRMMO

  • 51单片机驱动步进电机(含电路图和C语言源程序代码)

    51单片机驱动步进电机(含电路图和源程序代码) 源程序:stepper.c stepper.hex /* * STEPPER.C * sweeping stepper's rotor cw and cww 400 steps * Copyright (c) 1999 by W.Sirichote */ #i nclude c:\mc5151io.h /* include i/o header file */ #i nclude c:\mc5151reg.h register unsigned char j,flag1,temp; register unsigned int cw_n,ccw_n; unsigned char step[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90} #define n 400 /* flag1 mask byte 0x01 run cw() 0x02 run ccw() */

    标签: 51单片机 驱动 步进电机 C语言

    上传时间: 2013-11-09

    上传用户:钓鳌牧马

  • I2C总线驱动程序

    1 /**————————————————————2 〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)3 包括100Khz(T=10us)的标准模式(慢速模式)选择,4 和400Khz(T=2.5us)的快速模式选择,5 默认11.0592Mhz的晶振。6 〖文件〗PCF8563T.C ﹫2001/11/2 77 〖作者〗龙啸九天 c51@yeah.net http://www.c51bbs.co /8 〖修改〗修改建议请到论坛公布 http://www.c51bbs.co m9 〖版本〗V1.00A Build 080310 —————————————————————*/1112 #ifndef SDA13 #define SDA P0_014 #define SCL P0_115 #endif1617 extern uchar SystemError;1819 #define uchar unsigned char20 #define uint unsigned int21 #define Byte unsigned char22 #define Word unsigned int23 #define bool bit24 #define true 125 #define false 02627 #define SomeNOP(); _nop_();_nop_();_nop_();_nop_();2829 /**--------------------------------------------------------------------------------30 调用方式:void I2CStart(void) ﹫2001/07/0 431 函数说明:私有函数,I2C专用32 ---------------------------------------------------------------------------------*/33 void I2CStart(void)34 {35 EA=0;36 SDA=1; SCL=1; SomeNOP();//INI37 SDA=0; SomeNOP(); //START38 SCL=0;39 }4041 /**--------------------------------------------------------------------------------42 调用方式:void I2CStop(void) ﹫2001/07/0 443 函数说明:私有函数,I2C专用44 ---------------------------------------------------------------------------------*/45 void I2CStop(void)46 {47 SCL=0; SDA=0; SomeNOP(); //INI48 SCL=1; SomeNOP(); SDA=1; //STOP49 EA=1;50 }5152 /**--------------------------------------------------------------------------------53 调用方式:bit I2CAck(void) ﹫2001/07/0 454 函数说明:私有函数,I2C专用,等待从器件接收方的应答55 ---------------------------------------------------------------------------------*/56 bool WaitAck(void)57 {58 uchar errtime=255;//因故障接收方无ACK,超时值为255。59 SDA=1;SomeNOP();60 SCL=1;SomeNOP();61 while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}}62 SCL=0;63 return true;

    标签: I2C 总线 驱动程序

    上传时间: 2014-04-11

    上传用户:xg262122

  • tft-lcd驱动电路设计

    薄膜晶体管液晶显示器(TFT-LCD)具有重量轻、平板化、低功耗、无辐射、显示品质优良等特点,其应用领域正在逐步扩大,已经从音像制品、笔记本电脑等显示器发展到台式计算机、工程工作站(EWS)用监视器。对液晶显示器的要求也正在向高分辨率、高彩色化发展。 由于CRT显示器和液晶屏具有不同的显示特性,两者的显示信号参数也不同,因此在计算机(或MCU)和液晶屏之间设计液晶显示器的驱动电路是必需的,其主要功能是通过调制输出到LCD电极上的电位信号、峰值、频率等参数来建立交流驱动电场。 本文实现了将VGA接口信号转换到模拟液晶屏上显示的驱动电路,采用ADI公司的高性能DSP芯片ADSP-21160来实现驱动电路的主要功能。

    标签: tft-lcd 驱动 电路设计

    上传时间: 2013-10-30

    上传用户:hongmo