实例介绍
【实例简介】
TM1640驱动程序
【实例截图】
【核心代码】
/**
TM1640驱动程序
**/
#include <INTRINS.H>
//#include "_sys.h"
/**=====================================================================
宏、类型、常量、变量定义
=====================================================================**/
/*TM1640的SRAM写数据格式-----------
B7 B6 0 0 - - - -
0 1 0 0 - - - - 寻址模式(1 Byte)
1 1 0 0 - - - - 显存地址(1 Byte)
data 1~N 数据传输(最多16 Byte) 固定地址时为一地址一数据
1 0 0 0 - - - - 显示控制(1 Byte)
指令类型:
B7 B6 - - - - - -
寻址模式: 0 1
显示控制: 1 0
显存地址: 1 1
---------------------------------*/
#define DATA_MODE_AUTO 0x40 //地址自动加1/普通模式
#define DATA_MODE_FIXED 0x44 //固定地址
//#define DATA_MODE_TEST 0x48 //测试模式
/*寻址模式-------------------------
自动地址 1: 01000000 0x40
固定地址 : 01000100 0x44
普通模式 : 01000000 0x40
测试模式 : 01001000 (内部使用) 0x48
---------------------------------*/
#define DIS_EN 0x8A //显示开
//#define DIS_DIS 0x80 //显示关
/*显示控制-------------------------
B7 B6 - - B3 B2 B1 B0 (脉冲宽度)
显示开关: 1 0 0 0 0 - - - 显示关 0x80
1 0 0 0 1 - - - 显示开 0x88
消光数量: 1 0 0 0 1 0 0 0 1/16 0x88
(即亮度) 1 0 0 0 1 0 0 1 2/16 0x89
1 0 0 0 1 0 1 0 4/16 0x8A
1 0 0 0 1 0 1 1 10/16 0x8B
1 0 0 0 1 1 0 0 11/16 0x8C
1 0 0 0 1 1 0 1 12/16 0x8D
1 0 0 0 1 1 1 0 13/16 0x8E
1 0 0 0 1 1 1 1 14/16 0x8F
---------------------------------*/
/*显存地址-------------------------
B7 B6 - - B3 B2 B1 B0 (显示单元)
0xC0 1 1 0 0 0 0 0 0 GRID1
0xC1 1 1 0 0 0 0 0 1 GRID2
0xC2 1 1 0 0 0 0 1 0 GRID3
0xC3 1 1 0 0 0 0 1 1 GRID4
0xC4 1 1 0 0 0 1 0 0 GRID5
0xC5 1 1 0 0 0 1 0 1 GRID6
0xC6 1 1 0 0 0 1 1 0 GRID7
0xC7 1 1 0 0 0 1 1 1 GRID8
0xC8 1 1 0 0 1 0 0 0 GRID9
0xC9 1 1 0 0 1 0 0 1 GRID10
0xCA 1 1 0 0 1 0 1 0 GRID11
0xCB 1 1 0 0 1 0 1 1 GRID12
0xCC 1 1 0 0 1 1 0 0 GRID13
0xCD 1 1 0 0 1 1 0 1 GRID14
0xCE 1 1 0 0 1 1 1 0 GRID15
0xCF 1 1 0 0 1 1 1 1 GRID16
---------------------------------*/
#define FIRST_ADDR 0xC0 //起始地址
/*======================================================================
函数/功能主题描述/端口及常量、变量定义
======================================================================*/
// 端口定义
sbit DisDIN = P3^0; //显示端口-数据端
sbit DisCLK = P3^1; //显示端口-时钟端
/*---------------------------------
DIN : 显示端口-数据端
DisCLK: 显示端口-时钟端
---------------------------------*/
u8 DisBuf[13]; //显示缓存
/*---------------------------------
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│No.│ E │ r │ - │ 8 │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
DisBuf[12] -LED-S
DisBuf[11] -No. , 开关编号
DisBuf[10] -'-' , 分隔符/错误符'E'
DisBuf[09] -sta , 开关状态(H/L/r)-高电平/低电平/错误符'r'
DisBuf[08] -'-' , 分隔符, 每秒闪一次(作MCU运行状态指示)
DisBuf[7~0]-cnt , 开关计数器
实际电路:
缓存地址 显存地址 引脚 功能
DisBuf[12] 0xCC 18 -S6 -sta , 开关状态(H/L/r)-高电平/低电平/错误符'r'
DisBuf[11] 0xCB 19 -S1 -'-' , 分隔符, 每秒闪一次(作MCU运行状态指示)
DisBuf[10] 0xCA 20 -S2 -cnt , 计数器-千万
DisBuf[ 9] 0xC9 21 -S4 -No. , 开关编号(1,2)
DisBuf[ 8] 0xC8 22 -S10-cnt , 计数器-十万
DisBuf[ 7] 0xC7 23 -S5 -'-' , 分隔符/错误符'E'
DisBuf[ 6] 0xC6 24 -LED-S
DisBuf[ 5] 0xC5 25 -S11-cnt , 计数器-万
DisBuf[ 4] 0xC4 26 -S12-cnt , 计数器-千
DisBuf[ 3] 0xC3 27 -S7 -cnt , 计数器-百
DisBuf[ 2] 0xC2 28 -S8 -cnt , 计数器-十
DisBuf[ 1] 0xC1 01 -S3 -cnt , 计数器-百万
DisBuf[ 0] 0xC0 02 -S9 -cnt , 计数器-个
显示位置:
S4 S5 S6 S1 S2 S3
┌───┬───┬───┬───┬───┬───┐
│No.│ E │ r │ - │ 8 │ 7 │
└───┴───┴───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┐
│ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │
└───┴───┴───┴───┴───┴───┘
S10 S11 S12 S7 S8 S9
---------------------------------*/
u8 code SegCode[]={
//0x3F, 0x06, 0x5B, 0x4F, 0x66, // 0~ 4: 0 1 2 3 4
//0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 5~ 9: 5 6 7 8 9
//0x77, 0x7C, 0x39, 0x5E, 0x79, // 10~14: A b C d E
//0x71, 0x76, 0x38, 0x50, 0x54, // 15~19: F H L r n
//0x1C, 0x73, 0x5C, 0x40, 0x00 // 20~24: u P o - null(熄灭)
/*实际顺序及编码---------------
7 6 5 4 3 2 1 0
d dp b a f c g e <- dp g f e d c b a 0=1011 1101=0xBD
-----------------------------*/
0xBD, 0x24, 0xB3, 0xB6, 0x2E, // 0~ 4: 0 1 2 3 4
0x9E, 0x9F, 0x34, 0xBF, 0xBE, // 5~ 9: 5 6 7 8 9
0x3F, 0x8F, 0x99, 0xA7, 0x9B, // 10~14: A b C d E
0x1B, 0x2F, 0x89, 0x03, 0x07, // 15~19: F H L r n
0x85, 0x3B, 0x8B, 0x02, 0x00 // 20~24: u P t - null(熄灭)
};
/**=====================================================================
驱动功能函数
SCLK: ──┐ SCLK: ┌──
└─ ─┘
DIN: ─┐ //开始 DIN: ┌─ //结束
└── ──┘
7 6 5 4 3 2 1 0
传输: ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─
──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘
┌───┐───┌───┐───┌───┐───┌───┐───┐ ┌
─┘───└───┘───└───┘───└───┘───└───┘─┘
7 6 5 4 3 2 1 0
=====================================================================**/
//开始-----------------------------
void start(void){ //首次开始前(初始化期间)先触发1次结束, 以使SCLK=1, DIN=1
DisDIN = 0; //DIN由H→L, 开始
DisCLK = 0; //置SCLK为L, 为发送DIN位作准备
}
//发送数据-------------------------
void Send_DisDat(u8 dx){
u8 i;
for(i=0; i<8; i ){ //开始时已置SCLK=0
DisDIN = (bit)(dx & 0x01); //发送位, 低位先传
DisCLK = 1; //位发送结束-DIN信号保持
dx >>= 1;
DisCLK = 0; //置SCLK=0, 为发送下一位/结束准备
}
//DisDIN = 0;
}
//结束-----------------------------
void stop(void){
DisDIN = 0;
DisCLK = 1; //置SCLK为H-结束准备
DisDIN = 1; //DIN由L→H, 结束, 为下一次开始准备
}
/**=====================================================================
函数名称: Update_DisDat
输 入: addrn-显存地址编号
功能描述: 更新dx指定的地址的数据
说 明:
=====================================================================**/
void Update_DisDat(u8 addrn){
start(); Send_DisDat(DATA_MODE_FIXED); stop(); //固定地址
start();
Send_DisDat(addrn 0xC0); //指定地址
Send_DisDat(DisBuf[addrn]); //数据传输-1字符
stop();
//start(); Send_DisDat(DIS_EN); stop(); //显示开
}
/**=====================================================================
函数名称: UpdateAllDisDat
输 入: 无
功能描述: 更新所有显示数据
说 明:
=====================================================================**/
/*void UpdateAllDisDat(void){
u8 i;
//start(); Send_DisDat(DIS_DIS); stop(); //显示关
start(); Send_DisDat(DATA_MODE_AUTO); stop(); //自动地址
start(); Send_DisDat(FIRST_ADDR); //起始地址
for(i=0; i<13; i ){ //数据传输开始-13字符
Send_DisDat(DisBuf[i]);
}
stop(); //数据传输结束
start(); Send_DisDat(DIS_EN); stop(); //显示开
}*/
/**=====================================================================
函数名称: DisStdCh
输 入: pn-闪烁位置
功能描述: 字符闪烁状态切换
说 明:
=====================================================================**/
void DisStdCh(u8 pn){
static u8 preScn;
static bit std = 0; //状态
if(std){ //显示
if(DisBuf[pn]==SegCode[24]){DisBuf[pn] = preScn;}
}else{
preScn = DisBuf[pn];
DisBuf[pn] = SegCode[24]; //熄灭
}
std = ~std; //切换状态
}
/**=====================================================================
函数名称: Dis_Init()
输 入: rn-开关编号, dat[]-计数器
功能描述: 错误时对应的编号闪烁
说 明:
=====================================================================**/
void DisBufInit(void){
stop(); //触发1次结束, 以使SCLK=1, DIN=1
start(); Send_DisDat(DATA_MODE_AUTO); stop(); //自动地址
start();
Send_DisDat(0xCD); //起始地址
Send_DisDat(SegCode[24]); //0xCD~0xCF熄灭
Send_DisDat(SegCode[24]);
Send_DisDat(SegCode[24]);
stop();
start(); Send_DisDat(DIS_EN); stop(); //显示开
}
标签: TM1640驱动程序
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论