一、前言
显示床位号使用到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