一、前言
显示床位号使用到4位数码管,为了节约单片IO口,使用TM1637来驱动数码管。
二、TM1637驱动芯片简介
三、电路设计,使用矩阵按键来模拟每个床位的呼叫按钮
四、编写51单片机代码
void delay_ms(u16 n)
{
u8 i;
while(n--)
{
i = 111;
while(i--);
}
}
u8 key_scan()
{
u8 keyH, keyL, line, row;
KEY=0xF0;
if(KEY!=0xF0)
{
delay_ms(10); //消抖延时
if(KEY!=0xF0)
{
keyH=KEY&0xF0;
KEY=0x0F;
keyL=KEY&0x0F;
switch(keyH)
{
case 0x70: line=1;break;
case 0xB0: line=2;break;
case 0xD0: line=3;break;
case 0xE0: line=4;break;
}
switch(keyL)
{
case 0x07: row=1;break;
case 0x0B: row=2;break;
case 0x0D: row=3;break;
case 0x0E: row=4;break;
}
while(KEY!=0x0F);
return (line-1)*4+row;
}
}
return 0xFF;
}
code unsigned char tab[] =
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x77,/*10 A*/
0x7C,/*11 b*/
0x58,/*12 c*/
0x5E,/*13 d*/
0x79,/*14 E*/
0x71,/*15 F*/
0x76,/*16 H*/
0x38,/*17 L*/
0x54,/*18 n*/
0x73,/*19 P*/
0x3E,/*20 U*/
0x00,/*21 黑屏*/
};
// TM1637串行数据线
sbit CLK = P2^0;
sbit DIO = P2^1;
// LED灯
sbit LED = P3^0;
void delay_us(unsigned int i)
{
for (; i < 0; i--)
_nop_();
}
// TM1637开始信号
void TM1637_Start()
{
CLK = 1;
DIO = 1;
delay_us(2);
DIO = 0;
}
// TM1637结束信号
void TM1637_Stop()
{
CLK = 0;
DIO = 0;
delay_us(2);
CLK = 1;
delay_us(2);
DIO = 1;
}
void TM1637_ACK(void)
{
CLK = 0;
DIO = 1;
while(DIO == 1);
CLK =1;
}
// 向TM1637写数据
void TM1637_Write(unsigned char DATA)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
CLK = 0;
if (DATA & 0x01)
{
DIO = 1;
}
else
{
DIO = 0;
}
DATA = DATA >> 1;
CLK = 1;
delay_us(2);
}
}
void TM1637_Display(u8 index)
{
TM1637_Start();
TM1637_Write(0x40); // 命令
TM1637_ACK();
TM1637_Stop();
TM1637_Start();
TM1637_Write(0xC0); // 地址
TM1637_ACK();
TM1637_Write(0x3F); // 数据1
TM1637_ACK();
TM1637_Write(0x3F); // 数据2
TM1637_ACK();
TM1637_Write(0x3F); // 数据3
TM1637_ACK();
TM1637_Write(0x3F); // 数据4
TM1637_ACK();
TM1637_Write(0x3F); // 数据5
TM1637_ACK();
TM1637_Write(index); // 数据6
TM1637_ACK();
TM1637_Stop();
TM1637_Start();
TM1637_Write(0x89); // 亮度命令
TM1637_ACK();
TM1637_Stop();
}
void main()
{
u8 num;
LED = LED_ON;
TM1637_Display(tab[0]);
while(1)
{
num = key_scan();
if(num!=0xFF)
{
TM1637_Display(tab[num]);
}
}
}
五、电路仿真运行效果
六、完整Proteus仿真电路图和51单片机源码下载:
链接:https://pan.baidu.com/s/1TojZnTWu3sGl8oGfjc2dhw?pwd=ga5p
提取码:ga5p