|
制作出來的實物效果圖如下:
834728a8eadd1fc5ba4034ffeec507b.jpg (262.21 KB, 下載次數: 57)
下載附件
效果圖
2023-6-16 14:04 上傳
話不多說,上單片機代碼
//主函數
- #include <intrins.h>
- #include <TM1637.H>
-
- void main()
- {
-
- TM1637_init();
- TM1637_show_digit(0, 1, 0);
- TM1637_show_digit(1, 2, 1);
- TM1637_show_digit(2, 3, 0);
- TM1637_show_digit(3, 4, 0);
-
- while(1)
- {
-
- }
-
- }
復制代碼 1637.c
- #include <TM1637.H>
- 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 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<num_of_bytes; i++)
- {
- I2C_write_byte(bytes_to_write[i]);
- I2C_check_ack();
- }
-
-
- I2C_stop();
- }
-
-
-
- /**
- * @brief 顯示數據
- * @param 地址值 addr: 0 - 5
- * @param 數據
- * @param
- * @retval None
- */
- 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();
- }
-
-
-
-
-
-
- void TM1637_show_digit(unsigned char pos, unsigned char digit, bit with_dot)
- {
- TM1637_write_display_byte(pos, TM1637_SEG_TAB[digit] | (with_dot ? 0x80 : 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);
- }
-
- for(i=0; i<6; i++)
- {
- TM1637_write_display_byte(i, 0x00);
- }
- }
復制代碼
1637.h
- #ifndef __TM1637_H__
- #define __TM1637_H__
- #include"reg52.h"
- #include"intrins.h"
- sbit I2C_SCL = P2^0; //定義模擬IIC總線的時鐘線
- sbit I2C_SDA = P2^1; //定義模擬IIC總線的數據線
-
-
- #define TM1637_BRIGHTNESS 4 // 0 - 7 亮度
- void TM1637_show_digit(unsigned char pos, unsigned char digit, bit with_dot);
- void TM1637_init();
- #endif
復制代碼
Keil代碼下載:
AIP1637.zip
(40.3 KB, 下載次數: 30)
2023-6-16 14:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|