数码管按键驱动芯片

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//位使能
#define DIG0 0xc0
#define DIG1 0xc2
#define DIG2 0xc4
#define DIG3 0xc6
#define DIG4 0xc8
#define DIG5 0xca
#define DIG6 0xcc
#define DIG7 0xce
//显示亮度级别
#define LEVEL_OFF 0x80
BIT16 *bitPort_Att1639 = (BIT16*)P_IOA_Attrib;
//端口设置,根据情况修改端口位
#define DIO WRB0(bitPort1639)
#define DIO_DIR WRB0(bitPort_Dir1639)
#define DIO_ATT WRB0(bitPort_Att1639)
indate(data); //保持“STB”=“0”,传1BYTE显示数据
STB=1; //传完显示数据后将“STB”置“1”
}
*/
/****************************************************************
初始IC三个端口
DIO,CLK,STB全部设置成不带反相器高电平输出
****************************************************************/
void InitTM1639()
{
CLK_DIR = 1;
CLK_ATT = 1;
CLK = 1;
STB_DIR = 1;
STB_ATT = 1;
STB = 1;
DIO_DIR = 1;
{
int i;
//通讯开始前通讯端口全部初始化为“1”
DIO=1;
CLK=1;
STB=1;
indate(MD_AUTO); //传数据设置命令,设置采用地址自动加1方式写显示数据,
STB=1; //数据设置命令传完后需要将“STB”置“1”
indate(starAddr); //传起始地址
//关键部分(数据分两次传递到两个地址里面去)
//输入8BIT数据
//在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据
//----------------------------------------------------------------
void indate(unsigned char input)
{
unsigned int i;
for(i = 0;i < len;++i) {
indate(*data & 0x0f); //低地址
indate(*data >> 4 & 0x0f); //高地址
++data;
}
STB=1; //传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
indate(level);
STB=1; //显示控制命令传完后将“STB”置“1”
#define CLK WRB1(bitPort1639)
#define CLK_DIR WRB1(bitPort_Dir1639)
#define CLK_ATT WRB1(bitPort_Att1639)
#define STB WRB2(bitPort1639)
#define STB_DIR WRB2(bitPort_Dir1639)
//DIO设为输出
DIO_DIR = 1;
DIO_ATT = 1;
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态
//保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++) {
CLK=0; //先将“CLK”清零
if((input & 0x01)!=0)
DIO=1; //需要传送的数据的低位为“1”,则把“DIO”清零
DIO_ATT = 1;
DIO = 1;
}
/****************************************************************
连续传递数据,数据最多16byte
statAddr:起始地址
data:连续写入数据的起始数据地址
len:连续写入数据的长度,len*2+DIG0 < DIG7
//********************************************************************************************************************************
#ifndef _TM1639_H
#define _TM1639_H
void OneByteInData(unsigned char starAddr,unsigned char *data,unsigned char level);
//清楚所有显示数据
void ClearAll();
//读取按键键值
void KeyRead(int *key);
//测试模式,内部使用,检验硬件完整性
//写入输入1个字节(8bit)到LED_IC程序开始
//从LED_IC读入1个字节(8bit)程序开始
//输出8BIT数据
//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
//----------------------------------------------------------------
#include "BitOpt.h"
#include "TM1639.h"
#include "spce061a.h"
//端口位操作全局变量,根据情况修改端口
BIT16 *bitPort1639 = (BIT16*)P_IOA_Data;
BIT16 *bitPort_Dir1639 = (BIT16*)P_IOA_Dir;
****************************************************************/
void OneByteInData(unsigned char starAddr,unsigned char *data,unsigned char level)
{
DIO=1;
unsigned char outdate()
{
unsigned char i,out=0;
//DIDIO_ATT = 0;
DIO = 1;
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态
//保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++) {
}
return(out); //返回读到的1字节数据
}
//****************************************************************
//采用固定地址方式传输地址和数据开始
//采用固定地址方式
//----------------------------------------------------------------
else
DIO=0; //需要传送的数据的低位为“0”,则把“DIO”置高
CLK=1; //送时钟的上升沿
input=input>>1; //准备送下一个BIT
} //送完一个字节后退出循环
}
//****************************************************************
#define STB_ATT WRB2(bitPort_Att1639)
//工作模式,可以进行|组合
#define MD_WRITE 0x40 //采用地址自动加一方式写显存
#define MD_AUTO MD_WRITE
#define MD_NORMAL MD_WRITE
#define MD_READKEY 0x42 //读按键命令
//初始化IC端口
void InitTM1639();
//连续传送多个数据
void SeriesInData (unsigned char starAddr,unsigned char *data,unsigned char loop,unsigned char level);
//传送一个数据(本质是连续模式)
void ICTest();
#endif
//********************************************************************************************************************************
CLK=0; //先将“CLK”清零
out=out>>1;
if(DIO == 0)
out=out & 0x7f; //如果“DIO”为低电平,则把out的最高位清“0”,其他各位保持不变
else //如果“DIO”为高电平,则把out的最高位置“1”,其他各位保持不变
out=out | 0x80;
CLK=1; //送时钟的上升沿
}
/****************************************************************
连续一位数码管数据
statAddr:起始地址
data:连续写入数据的起始数据地址
leve:亮度级别
注:本质上这个函数也是使用连续模式写入的,非连续模式我写不进去。
这个函数可以防止由于使用SeriesInData函数导致写入长度越界
//TM1639.C
//数码管和按键驱动芯片TM1639函数代码
//********************************************************************************************************************************
//********************************************************************************************************************************
//TM1639.h
//数码管和按键驱动芯片TM1639函数借口和芯片操作相关宏定义
#define MD_FIX 0x44 //采用固定地址方式写显存
#define MD_TEST 0x48 //测试模式
//****************************************************************
//写入输入1个字节(8bit)到LED_IC程序开始
#define LEVEL_1 0x88
#define LEVEL_2 0x89
#define LEVEL_4 0x8a
#define LEVEL_10 0x8b
#define LEVEL_11 0x8c
#define LEVEL_12 0x8d
#define LEVEL_13 0x8e
#define LEVEL_14 0x8f
leve:亮度级别
注:如果len*2+DIG0地址>DIG7那么,多出来的地址返回到DIG0,如此循环。
本函数可以防止上电后马上传显示数据,会出现乱码。
****************************************************************/
void SeriesInData(unsigned char starAddr,unsigned char *data,unsigned char len,unsigned char level)
CLK=1;
STB=1; //通讯开始前通讯端口全部初始化为“1”
indate(MD_AUTO); //传数据设置命令,设置采用地址自动加1方式写显示数据,
STB=1; //数据设置命令传完后需要将“STB”置“1”
indate(starAddr); //传起始地址
//关键部分(数据分两次传递到两个地址里面去)
/*
void display2(unsigned char adress,unsigned char data)
{
DIO=1;
CLK=1;
STB=1; //通讯开始前通讯端口全部初始化为“1”
indate(MD_FIX); //数据设置命令
STB=1;
indate(adress); //传显示数据对应的地址
相关文档
最新文档