Arduino 驱动TM1638显示十位的共阳数码管
2018-12-03 13:14
656 查看
Arduino 驱动TM1638显示十位的共阳数码管
二话不说先上图:
这个是电路图,下面我在上传TM1638的手册
哈哈太乱了先凑合着看吧!效果是实现了,画了板还没有发过来。
我也不多说什么了上代码(基于Arduino)
#include "tm1638.h" //库的头文件 #include "Timers.h" // 看门狗定时器 String comdata = ""; String str = ""; boolean MD = 0; //看门狗标记 void setup() { pinMode(STB, OUTPUT); //让三个脚都是输出状态 pinMode(CLK, OUTPUT); pinMode(DIO, OUTPUT); pinMode(13, OUTPUT); //初始化外部看门狗引脚 Serial.begin(115200); //初始化串口 delay(2); TCs.AddFunc(0, WDT, 200); //看门狗200MS一次 init_TM1638(); //初始化数码管 } void loop() { comdata = ""; int a; while (Serial.available()) //时刻读取硬件串口数据 { comdata += char(Serial.read()); delay(2); } while (Serial.read() >= 0) {} //清除串口缓存 if (comdata.length() > 0) { if (comdata.startsWith("@") && comdata.endsWith("\r\n")) { displaySrest (); //清屏 a = comdata.length(); str = comdata.substring(1, a); a = str.length(); str = str.substring(0, a - 2); displayString(str); str = ""; comdata = ""; } } } //看门狗函数 void WDT () { MD = !MD; if (MD) digitalWrite(13, 1); else digitalWrite(13, 0); } void displayString (String number) { byte a, j = 0; char c; number.trim(); //清空空格 lastIndexOf(S) a = number.length(); //字符长度 if (a > 0 && number.lastIndexOf('.') >= 0) { j = 1; //判断有无点 } if (j == 0) { //无小数点的时候 for (int i = 0; i < a; i++) { c = number[a - (1 + i)]; displaySS(c, 1 + i, 0); } } if (j != 0) { for (int i = 0; i < a; i++) { c = number[a - (1 + i)]; if (c == '.') { c = number[a - (1 + i) - 1]; a--; displaySS(c, 1 + i, 1); } else { displaySS(c, 1 + i, 0); } } } } void displaySrest() //清空显示 { byte a, j = 0; char c; String number = " "; a = number.length(); for (int i = 0; i < a; i++) { c = number[i]; displaySS(c, 1 + i, 0); } } void displaySS(unsigned char number, unsigned char cnt1, bool glf) { if (glf == 1) { NE_C(ss[number] | 0x80, cnt1); //数据变换 } else { NE_C(ss[number], cnt1); } send_command(0x40); //设置数据命令:普通模式、地址自增1,写数据到显存 send_command(0xc0); //设置显示地址命令:从00H开始 Write_String(BCD_LABLE_anode, 16); //连续写入 16个字节 因为1629系列总共有16个显存 digitalWrite(STB, 1); send_command(cmd_dis_mode); } /***************发送8bit数据,从低位开始**************/ void send_8bit(unsigned char DATA) //写数据函数 { unsigned char i; for (i = 0; i < 8; i++) { digitalWrite(CLK, LOW); if (DATA & 0X01) digitalWrite(DIO, HIGH); else digitalWrite(DIO, LOW); digitalWrite(CLK, HIGH); DATA >>= 1; } digitalWrite(CLK, LOW); digitalWrite(DIO, LOW); } /******************发送控制命令***********************/ void send_command(unsigned char word) { digitalWrite(STB, 1); digitalWrite(STB, 0); send_8bit(word); } void Write_String(unsigned char *p, unsigned char cnt) //cnt最大14byte { unsigned char i; for (i = 0; i < cnt; i++) //连续写入数据 { send_8bit(*p++); } } /*************************************************** 8段数码显示的共阴数据到共阳数据的转换 外加数码位移 -- 实质是一个数组的转置 并且只改变位 ****************************************************/ void NE_C(unsigned char ydata, unsigned char cnt) { char i = 0, j = 0; if (cnt > 0) { if (cnt > 8) { //myflag |= 0x01; cnt = cnt - 9; for (i = 1; i < 16; i = i + 2) { if (ydata & 0x01 == 0x01) { BCD_LABLE_anode[i] |= (0x01 << cnt); } else { BCD_LABLE_anode[i] &= ~(0x01 << cnt); //清零 } ydata = (ydata >> 1); } } else { cnt = cnt - 1; for (i = 0; i < 16; i = i + 2) { if ((ydata & 0x01) == 0x01) { BCD_LABLE_anode[i] |= (0x01 << cnt); } else { BCD_LABLE_anode[i] &= ~(0x01 << cnt); //清零 } ydata = (ydata >> 1); } } } } /************************************************************************************ 按照SEG1-SEG8 分别表示1-8位数码管,函数参数含义如下: cnt1 :表示第cnt1个数码管; number: 表示要显示的数据,如number=1 显示数字1; display(0,1): 表示在第1位数码管上显示0. BCD_LABLE_ALL[0]:表示0x3f, 即共阴极数据0,客户可以根据需要建立数组填入自己所需数据即可 ************************************************************************************/ void display(unsigned char number, unsigned char cnt1) { NE_C(BCD_LABLE_ALL[number], cnt1); //数据变换 send_command(0x40); //设置数据命令:普通模式、地址自增1,写数据到显存 send_command(0xc0); //设置显示地址命令:从00H开始 Write_String(BCD_LABLE_anode, 16); //连续写入 16个字节 因为1629系列总共有16个显存 digitalWrite(STB, 1); send_command(cmd_dis_mode); } void display_fixedadd(unsigned char number, unsigned char cnt1) { NE_C(BCD_LABLE_ALL[number], cnt1); send_command(0x44); //设置数据命令:普通模式、地址固定模式,写数据到显存 send_command(0xc2); send_8bit(0x00);//在02地址写00 digitalWrite(STB, 0); send_command(cmd_dis_mode); digitalWrite(STB, 0); } //TM1638初始化函数 void init_TM1638(void) { unsigned char i; send_command(0x8f); //亮度 (0x88-0x8f)8级亮度可调 send_command(0x40); //采用地址自动加1 digitalWrite(STB, LOW); // send_8bit(0xc0); //设置起始地址00H for (i = 0; i < 16; i++) //传送16个字节的数据 send_8bit(0x00); digitalWrite(STB, HIGH); }
第一次写多多见谅!有意见望各位网友提出。
相关文章推荐
- 因特尔Edison第1站--arduino打不开和驱动安装成功后驱动管理器没有显示端口号
- Arduino Uno 驱动OLED进阶 显示图片
- Arduino使用TM1637四位数码管显示模块
- 解决测试Arduino使用TM1637四位数码管显示模块问题
- Arduino Uno 驱动OLED进阶 显示几何动画
- Arduino + 四位LED数码管显示当前环境温度
- 最新 Arduino 驱动 12接口/户外 LED显示屏/LED点阵屏/LED单元板
- XCTU与Arduino上的xbee显示连接不上的解决办法
- U盘在其他的电脑能读但是在自己的电脑中不能显示,反复安装卸载驱动都不行的问题解决
- Solaris 9/10 Vmware显示驱动的安装方法
- 显示驱动调试问题
- QCom MSM MDP显示驱动一些点的简记
- Arduino 数码管LED驱动 数组法
- kvm 中的 windows 使用 Vmware 的显示驱动
- MTK LCM显示驱动源码分析(一)
- 领域驱动设计系列(1)通过现实例子显示领域驱动设计的威力
- 移植树莓派中的fbtft显示驱动到Linux开发板下(一)
- arduino之旅——L298N驱动小车前进后退
- QCom MSM MDP显示驱动一些点的简记
- Linux LCD驱动(三)--图形显示