|
楼主 |
发表于 2014-9-17 07:55:52
|
显示全部楼层
本帖最后由 lmhtz 于 2014-9-17 07:59 编辑
//包含文件
#ifndef TM1668_H_
#define TM1668_H_
#include "config.h"
#define TM1638_CLK PA6 //时钟线
#define TM1638_DIO PA7 //数据线
#define TM1638_STB PA5 //TM1668片选
//外部数据声明
//extern const unsigned char seg_code[];//数字段编码表
//extern unsigned char section2 play_buff[9];//显示内容寄存器
//extern unsigned char section2 key_data[4];//读取的按键数据
extern void display(void);//显示驱动
extern void key_scan(void);//键扫驱动
//
#endif
//****************************************************************
//写入数据
void indate(u8 input)
{
u8 i;
for (i=0; i<8; i++)
{
TM1638_CLK=0; //先将“CLK”清零
if ((input & 0x01) == 1) TM1638_DIO=1;
else TM1638_DIO=0;
TM1638_CLK=1; //送时钟的上升沿
input = input >> 1; //准备送下一个BIT
} //送完一个字节后退出循环
}
//****************************************************************
//读数据
u8 outdate(void)
{
u8 temp;
u8 i,dat = 0; //i—控制循环次数,dat—临时保存读到的数据
TM1638_DIO=1; //释放DIO为输入
PAT7 = 1; //输入输出状态
for (temp=0; temp < 100; temp++);
for (i=0; i<8; i++)
{
TM1638_CLK=0; //先将“CLK”清零
for (temp=0; temp < 100;temp++);
dat = dat >> 1;
if (TM1638_DIO == 1) dat = dat | 0x80; //读取数据
TM1638_CLK=1; //送时钟的上升沿
} //送完一个字节后退出循环
PAT7 = 0; //输入输出状态
return dat; //返回读到的1字节数据
}
void Write_COM(u8 cmd) //发送命令字
{
TM1638_STB=0;
indate(cmd);
TM1638_STB=1;
}
//===============================================
//键扫描程序
void key_scan(void)
{
u8 i,temp;
TM1638_STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态
indate(B0100_0010); //传数据设置命令,设置为读按键
for (i=0; i<4; i++)
{
temp = outdate();
key_data = temp;
}
TM1638_STB=1; //保证“STB”为低电平,程序不依赖于之前端口的状态
//-------------------------------
.........
读出的按键数据存于数组中,依据需要相应处理......
//===============================================
//****************************************************************
//显示处理
//显示内容预先放入 play_buff 中即可
void display(void)
{
TM1638_DIO=1; TM1638_CLK=1; TM1638_STB=1;
if (power == 1) Write_COM(B1000_1111); // 8f 开显示亮度最大
else Write_COM(B1000_0111); // 8f 开显示亮度最大
Write_COM(B0100_0000); //40 设置数据命令
TM1638_STB=0;
indate(B1100_0000); //c0 设置显示地址
//------------------------------
indate(seg_code[play_buff[0]]); indate(0);//0,1,时十位
indate(seg_code[play_buff[1]]); indate(0);//4,5,分十位
indate(seg_code[play_buff[2]]); indate(0);//6,7,分个位
indate(seg_code[play_buff[3]]); indate(0);//8,9,时个位
TM1638_STB=1;
}
|
|