#include <reg51.h>
#include <intrins.h>
#define TM1638_STB P1_2
#define TM1638_DIO P1_0
#define TM1638_CLK P1_1
#define TM1638_CMD_DATA 0x40
#define TM1638_CMD_ADDRESS 0xC0
#define TM1638_CMD_DISPLAY 0x80
#define TM1638_DISPLAY_ON 0x08
#define TM1638_DISPLAY_OFF 0x00
static unsigned char code SEG_PATTERN[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
void TM1638_Init() {
TM1638_STB = 1;
TM1638_SendCommand(TM1638_CMD_DISPLAY | TM1638_DISPLAY_ON);
}
void TM1638_SendByte(unsigned char data) {
unsigned char i;
for (i = 0; i < 8; i++) {
TM1638_CLK = 0;
_nop_();
TM1638_DIO = data & 0x01;
data >>= 1;
_nop_();
TM1638_CLK = 1;
_nop_();
}
}
void TM1638_SendCommand(unsigned char cmd) {
TM1638_STB = 0;
_nop_();
TM1638_SendByte(cmd);
TM1638_STB = 1;
_nop_();
}
void TM1638_DisplayDigit(unsigned char digit, unsigned char num) {
TM1638_SendCommand(TM1638_CMD_ADDRESS | (digit << 1));
TM1638_STB = 0;
_nop_();
TM1638_SendByte(TM1638_CMD_DATA);
TM1638_SendByte(SEG_PATTERN[num % 10]);
TM1638_STB = 1;
}
void Delay50ms() {
unsigned char i, j;
for (i = 0; i < 90; i++) {
for (j = 0; j < 163; j++);
}
}
void main() {
unsigned int count = 0;
unsigned char btn_status = 0;
TM1638_Init();
while (1) {
TM1638_DisplayDigit(0, count % 10);
TM1638_DisplayDigit(1, (count / 10) % 10);
TM1638_DisplayDigit(2, (count / 100) % 10);
TM1638_DisplayDigit(3, (count / 1000) % 10);
btn_status = TM1638_ReadButtons();
if (btn_status & 0x01) {
Delay50ms();
while (btn_status & 0x01);
Delay50ms();
count++;
}
if (btn_status & 0x02) {
Delay50ms();
while (btn_status & 0x02);
Delay50ms();
count--;
}
Delay50ms();
}
}
unsigned char TM1638_ReadButtons() {
unsigned char i, btns = 0;
TM1638_SendCommand(TM1638_CMD_ADDRESS | 0x02);
TM1638_STB = 0;
_nop_();
TM1638_SendByte(0x42);
_nop_();
for (i = 0; i < 4; i++) {
btns |= TM1638_DIO << i;
TM1638_CLK = 0;
_nop_();
TM1638_CLK = 1;
_nop_();
}
TM1638_STB = 1;
return btns;
}
|