历史上的今天
今天是:2025年04月11日(星期五)
2020年04月11日 | TM1637数码管显示STC51单片机驱动程序
2020-04-11 来源:eefocus
/*
Coder : Farman
Date : 2018-01-02
参考了厂家的TM1637数据手册,在此表示感谢。
*/
#include #include "Delay.h" //////////////////////////////////////////////////////////////////////////// sbit I2C_SCL = P2^1; //定义模拟IIC总线的时钟线 sbit I2C_SDA = P2^0; //定义模拟IIC总线的数据线 #define TM1637_BRIGHTNESS 7 // 0 - 7 //////////////////////////////////////////////////////////////////////////// void I2C_delay() { nop_(); } void I2C_start() { I2C_SCL = 1; I2C_SDA = 1; I2C_delay(); I2C_SDA = 0; // 时钟线设置为常态,低电平。 } /* I2C 总线写1个字节 不包含应答位的检测 */ void I2C_write_byte(char byte_to_write) { unsigned char i; for(i=0; i<8; i++) { I2C_SCL = 0; I2C_SDA = byte_to_write & 0x01; I2C_delay(); I2C_SCL = 1; I2C_delay(); I2C_SCL = 0; I2C_delay(); byte_to_write >>= 1; } return; } void I2C_check_ack() { // I2C 检查应答位,实际未检查,只发送了应答位时钟,认为TM1637工作正常 I2C_SCL = 0; I2C_delay();//在第八个时钟下降沿之后延时5us,开始判断ACK 信号 while(I2C_SDA) { ; } I2C_SCL = 1; I2C_delay(); I2C_SCL=0; } void I2C_send_ack() { I2C_SDA = 0; I2C_delay(); I2C_SCL = 1; I2C_delay(); I2C_SCL = 0; I2C_delay(); I2C_SDA = 1; I2C_delay(); } void I2C_stop() { I2C_SCL = 0; I2C_delay(); I2C_SDA = 0; I2C_delay(); I2C_SCL = 1; I2C_delay(); I2C_SDA = 1; } /////////////////////////////////////////////////////////////////////////// // // TM1637模块操作函数 // ////////////////////////////////////////////////////////////////////////// void TM1637_write_command_byte(unsigned char command) { I2C_start(); I2C_write_byte(command); I2C_check_ack(); I2C_stop(); } // bright : 0 - 7 void TM1637_display_switch_and_bright(bit enable_display, unsigned char bright) { TM1637_write_command_byte(0x80 + (enable_display ? 0x08 : 0x00) + bright); } void TM1637_write_display_bytes(unsigned char first_addr, unsigned char bytes_to_write[], unsigned char num_of_bytes) { unsigned char i; I2C_start(); I2C_write_byte(0x40); I2C_check_ack(); I2C_stop(); I2C_start(); I2C_write_byte(0xC0 + first_addr); I2C_check_ack(); for(i=0; i I2C_write_byte(bytes_to_write[i]); I2C_check_ack(); } I2C_stop(); } // addr: 0 - 5 void TM1637_write_display_byte(unsigned char addr, unsigned char segments) { I2C_start(); I2C_write_byte(0x40 + addr); I2C_check_ack(); I2C_stop(); I2C_start(); I2C_write_byte(0xC0 + addr); I2C_check_ack(); I2C_write_byte(segments); I2C_check_ack(); I2C_stop(); } code unsigned char TM1637_SEG_TAB[] = { 0x3F // 00111111 0 ,0x06 // 00000110 1 ,0x5B // 01011011 2 ,0x4F // 01001111 3 ,0x66 // 01100110 4 ,0x6d // 01101101 5 ,0x7d // 01111101 6 ,0x07 // 00000111 7 ,0x7F // 01111111 8 ,0x6F // 01101111 9 ,0x77 // 01110111 A ,0x7C // 01111100 b ,0x39 // 00111001 C ,0x5E // 01011110 d ,0x79 // 01111001 E ,0x71 // 01110001 F }; void TM1637_show_digit(unsigned char pos, unsigned char digit, bit with_dot) { TM1637_write_display_byte(pos, TM1637_SEG_TAB[digit] | (with_dot ? 0x20 : 0x00)); } void TM1637_init() { unsigned char i; TM1637_display_switch_and_bright(1, TM1637_BRIGHTNESS); for(i=0; i<6; i++) { TM1637_write_display_byte(i, 0xFF); } Delay200ms(); for(i=0; i<6; i++) { TM1637_write_display_byte(i, 0x00); } Delay200ms(); for(i=0; i<6; i++) { TM1637_write_display_byte(i, 0xFF); } Delay200ms(); for(i=0; i<6; i++) { TM1637_write_display_byte(i, 0x00); } Delay200ms(); } void TM1637() { unsigned char seg; unsigned char i, j; TM1637_init(); while(1) { for(i=0; i<16; i++) { for(j=0; j<6; j++) { TM1637_show_digit(j, i, 0); } Delay1s(); } } }
下一篇:89C51单片机数码管显示
史海拾趣
|
Spartan-6 and Virtex-6 FPGA Embedded Kit FAQ 1. Where can I purchase an Embedded kit? 2. How much do the Spartan-6 and Virtex-6 FPGA Embedded Kits cost? 3. When will I get my kit? 4. What are included in the Embedded Kits? 5. What expansion ports are avail ...… 查看全部问答> |
|
我的多国语言用ini文件的方式来实现,在记事本中写好了多国语言后,保存为unicode编码。 在读取这个ini文件时查看内存中读出的S为 53 00 00 00,而在程序中自己定义的宽字节S在内存中则为53 00。 看起来读的unicode的ini文件中的字符好像多了2个 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:38 编辑 请大家帮忙,在C64x的EMIF在SDRAM接口中,如何通过BE[7:0]实现8bit、16bit、32bit、64bit的寻址方式? … 查看全部问答> |
|
利用6517A对惰性气体或高真空中的小型晶体高值电阻测量的典型误差来源 屏蔽与防护 为了降低静电干扰,利用具有地电位的导体包围样本和线缆(屏蔽)。 为了防止漏电流影响测量,利用具有同样电势的导体对至静电计[1]输入端的连接进行包围(防护)。测量电流时,需要将防护装置连接至电压源的LO端。 在高真空系统( ...… 查看全部问答> |
|
用51单片机设计频率计并用lcd显示,我用加载了hex文件但是lcd没显示内容。解决者立... 用51单片机设计频率计并用lcd显示,我加载了hex文件但是lcd没显示内容。我用proteus仿真时用的是AT89c51,没有问题,结果也正确。实际硬件电路用的是STC89c52,结果不出来。该怎么解决啊/ 能完美解决者定当重谢,… 查看全部问答> |




