/*****************************************************************************
*版权信息:深圳天微电子有限公司
*文 件 名:TM1637-V1.0
*当前版本:V1.0
*MCU 型号:STC12C5608AD
*开发环境:Keil uVision4
*晶震频率:11.0592MHZ
*完成日期:2013-07-19
*程序功能:数码管驱动和按键:驱动8段6位LED共阳数码管显示,当对应按键按下时显示1~7,原理图请参考TM1637规格书;
*免责声明:1.此程序为TM1637驱动共阳LED数码管和按键演示程序,仅作参考之用。
2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任
********************************************************************************/
#include <reg52.h> //头文件
#include "intrins.h" //包含_nop_()指令头文件 #define nop _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /********************定义控制端口**********************/
sbit CLK=P2^; //定义CLK
sbit DIO=P2^; //定义DIO /********************定义数据*************************/
unsigned char code CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳显示数据0-F
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f*/
unsigned char code TAB[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//数码管不显示 /********************延时函数,延时nms******************/
void delay_nms(unsigned int n)
{
unsigned int i;
while(n--)
for(i=;i<;i++);
} /********************Start函数*************************/
void I2CStart()
{
DIO=;
CLK=;
nop;
DIO=;
nop;
DIO=;
nop;
CLK=;
} /********************Stop函数*************************/
void I2CStop()
{
CLK=;
nop;
nop;
DIO=;
nop;
nop;
CLK=;
nop;
nop;
nop;
DIO=;
nop;
CLK=;
DIO=;
} /***************发送8bit数据,从低位开始**************/
void I2CWritebyte(unsigned char oneByte)
{
unsigned char i;
for(i=;i<;i++)
{
CLK=;
if(oneByte&0x01)
DIO=;
else
DIO=;
nop;
CLK=;
oneByte=oneByte>>;
}
//8位数据传送完
CLK = ; //判断芯片发过来的ACK应答信号
nop;
while(DIO==);
nop;
CLK = ;
nop;
} /***************读按键程序**************/
unsigned char read_key()
{
unsigned char rekey,i;
I2CStart();
I2CWritebyte(0x42); //写读键指令0x42
DIO=;
for(i=;i<;i++)
{
CLK=;
nop;
nop;
rekey=rekey>>; //先读低位
nop;
nop;
CLK=;
if(DIO)
rekey=rekey|0x80;
else
rekey=rekey|0x00;
nop;
}
CLK = ; //判断芯片发过来的ACK应答信号
nop;
nop;
while(DIO==);
nop;
nop;
CLK = ;
nop;
nop;
I2CStop(); return rekey;
} /************显示函数,地址自加一************/
void disp0(unsigned char *p)
{
unsigned char i;
I2CStart();
I2CWritebyte(0x40); //数据命令设置:地址自动加1,写数据到显示寄存器
I2CStop(); I2CStart();
I2CWritebyte(0xc0); //地址命令设置:初始地址为00H
for(i=;i<;i++) //发送4字节数据到显存
{
I2CWritebyte(*p);
p++;
}
I2CStop(); I2CStart();
I2CWritebyte(0x8C); //显示控制命令:开显示,脉冲宽度为11/16.
I2CStop(); } /************显示函数,固定地址写数据************/
void disp(unsigned char add, unsigned char value)
{
I2CStart();
I2CWritebyte(0x44); //数据命令设置:固定地址,写数据到显示寄存器
I2CStop(); I2CStart();
I2CWritebyte(add); //地址命令设置:写入add对应地址 I2CWritebyte(CODE[value]); //给add地址写数据
I2CStop(); I2CStart();
I2CWritebyte(0x8C); //显示控制命令:开显示,脉冲宽度为11/16.
I2CStop(); } /************按键处理函数,按键数据低位在前高位在后************/
void key_process()
{
unsigned char temp;
temp=read_key(); //读取按键返回值
if(temp!=0xff)
{
disp0(TAB); //清屏
switch(temp)
{
case 0xf7 : disp(0xc0,);break; //K1与SG1对应按键按下,显示1
case 0xf6 : disp(0xc1,);break; //K1与SG2对应按键按下,显示2
case 0xf5 : disp(0xc2,);break; //K1与SG3对应按键按下,显示3
case 0xf4 : disp(0xc3,);break; //K1与SG4对应按键按下,显示4
case 0xef : disp(0xc4,);break; //K2与SG1对应按键按下,显示5
case 0xee : disp(0xc5,);break; //K2与SG2对应按键按下,显示6
case 0xed : disp(0xc0,);break; //K2与SG3对应按键按下,显示7
default : break;
}
}
} void main()
{
  disp0(CODE); //上电数码管显示0~5
  delay_nms();
  while() //按键后显示按键内容
  {
    key_process();
    delay_nms();
  }
}

TM1637驱动程序的更多相关文章

  1. 常用数据库的驱动程序和Url地址

    常用数据库的驱动程序及JDBC URL: Oracle数据库: 驱动程序包名:ojdbc6.jar 驱动类的名字:oracle.jdbc.driver.OracleDriver JDBC URL:jd ...

  2. linux网络设备驱动程序

    4.linux网络设备驱动程序体系结构 -------------------------------------- | 数据包发送 | 数据包接收 | ----->网络协议接口层 | dev_ ...

  3. nandflash驱动程序编写

    NAND FLASH是一个存储芯片 那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A" 问1. 原理图上NAND FLASH和S3C2440之间只有数据线, 怎么传输地 ...

  4. 嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序

    基于DM9000C的原厂代码修改dm9000c的驱动程序. 首先确认内存的基地址 iobase. 确定中断号码. 打开模块的初始化函数定义. 配置内存控制器的相应时序(结合DM9000C.C的手册). ...

  5. 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序

    一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...

  6. 嵌入式Linux驱动学习之路(二十四)Nor Flash驱动程序

    Nor Flash和Nand Flash的不同: 类型 NOR Flash  Nand Flash  接口 RAM-like,引脚多 引脚少 容量 小(1M.2M...) 大(512M.1G) 读 简 ...

  7. 18.tty驱动程序框架

    tty驱动程序框架 一.TTY概念解析 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备. 1.1串口终端(/dev/ttyS*) 串口终端是使用计算机 ...

  8. 15.linux按键驱动程序(二)

    linux按键驱动程序 包含内容定时器延时去抖动,阻塞型设备驱动设计 一.定时器延时去抖 按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,开关不会马上稳定地接通或断开.因而 ...

  9. 14.linux按键驱动程序(一)

    按键驱动程序 本文学习主要包含按键硬件的实现.中断分层管理.按键定时器去抖.阻塞性驱动程序设计.这里面需要使用到混杂设备驱动和中断处理程序的内容. 一.创建按键混杂设备驱动模型 int key_ope ...

随机推荐

  1. html-jquery/js引用外部图片时遇到看不了或出现403情况解决方法

    <script type="text/javascript"> function showImg(url) { var frameid = 'frameimg' + M ...

  2. SQL查找TCar表中同一辆车前后两条记录的CarId,两条记录中有多个字段值一样

    查询同一个表中某一字段值相同的记录 select * from 表名 where 字段 in(select 字段 from 表名 group by 字段 having count(1)>1) s ...

  3. ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用

    早在2010年年底,牛魔王中王在其博客空间牛魔王的作坊中对ArcGIS 10中推出的紧凑型缓存格式进行了详细的解读,详见<ArcGIS 切片缓存紧凑文件格式分析与使用>.紧随着的4年时间里 ...

  4. kmem_alloc

    http://www.lehman.cuny.edu/cgi-bin/man-cgi?kmem_alloc+9

  5. POJ 3311 Hie with the Pie (状压DP)

    题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...

  6. 在openSUSE 13.1上用gem安装rails无反应: gem install rails

    解决方案: gem install rails -V ....其实他本身在后台运行,白白的给他中断好多次,用-V这个选项就可以直接回显信息了

  7. URAL 2027 URCAPL, Episode 1 (模拟)

    题意:给你一个HxW的矩阵,每个点是一个指令,根据指令进行一系列操作. 题解:模拟 #include<cstdio> #include<algorithm> using nam ...

  8. Codeforces Round #313 (Div. 2) A.B,C,D,E Currency System in Geraldion Gerald is into Art Gerald's Hexagon Equivalent Strings

    A题,超级大水题,根据有没有1输出-1和1就行了.我沙茶,把%d写成了%n. B题,也水,两个矩形的长和宽分别加一下,剩下的两个取大的那个,看看是否框得下. C题,其实也很简单,题目保证了小三角形是正 ...

  9. Spark Job调优(Part 2)

    原文链接:https://wongxingjun.github.io/2016/05/11/Spark-Job%E8%B0%83%E4%BC%98-Part-2/ 这篇文章将会完成Part 1中留下的 ...

  10. BigDecimal and double

    BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...