- /*
- * TM1652.h
- *
- * Created on: Apr 18, 2023
- * Author: Administrator
- */
-
- #ifndef __TM1650_H_
- #define __TM1650_H_
- #include "config.h"
- //#include<reg52.h> //MCU头文件
- #include<intrins.h> //包含nop指令头文件
- #define uint unsigned int //数据类型宏定义
- #define uchar unsigned char //数据类型宏定义
-
- #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义
-
-
-
- #define smg1 0x68
- #define smg2 0x6a
- #define smg3 0x6c
- #define smg4 0x6e
-
- #define L_Du01 0x11 // 亮度1级
- #define L_Du02 0x21 // 亮度2级
- #define L_Du03 0x31 // 亮度3级
- #define L_Du04 0x41 // 亮度4级
- #define L_Du05 0x51 // 亮度5级
- #define L_Du06 0x61 // 亮度6级
- #define L_Du07 0x71 // 亮度7级
- #define L_Du08 0x81 // 亮度8级
-
- extern code unsigned char DispCode[17];
-
- extern void delay(uint n);
- extern void TM1650_SystemCmd(uchar light,uchar segMod, uchar WorkMod, uchar Onoff);
- extern void TM1650Disp(uchar sdate1, uchar sdate2, uchar sdate3, uchar sdate4);
- extern void TM1650ReadKey(void);
- extern void WH_display(unsigned char DATA1,unsigned char DATA2);
- extern unsigned char TM1650_read();
- #endif /* MYBSP_TM1652_H_ */
复制代码 这个是.H文件
- /*
- * TM1652.c
- *
- * Created on: Apr 18, 2023
- * Author: Administrator
- */
- #include "TM1650.h"
-
-
-
- //每一段显示编码
- code unsigned char perseg[8]={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
- //共阴驱动显示编码,0-F-灭
- code unsigned char DispCode[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
- //辉度调节指令,1-8级
- code unsigned char INTENS[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};
-
-
- u8 code tab_run0[30] =
- {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0X7f,0X6f,0X77,0X7C,0X39,0X5E,0X79,0X71,0x3d,0x76,0x30,0x38,0x71,0x78,0x50,0X23,0X1C,0X00,0X40,0X63,0X73,0X37};
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I L F T R 上 下 空白 横杠 O P N
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
-
- u8 code tab_run1[7] = {0X00,0x43,0x2C,0x0F,0x23,0x1C,0x40}; //外呼方向
- u8 code tab_run2[21] = {0x3F,0x80,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0X7f,0X6f,0X77,0X7C,0X39,0X5E,0X79,0X71,0x3F};
- //通讯端口定义,客户可以根据实际平台进行相应的配置;
- //sbit SCL=P7^6; //时钟线
- //sbit SDA=P7^5; //数据线
-
- sbit SCL=P3^6; //时钟线
- sbit SDA=P3^7;
- ////主板数码管显示端口
- //sbit DIO = P7^5;
- //sbit CLK = P7^6;
- ////外呼显示端口
- //sbit DIO2 = P3^7;
- //sbit CLK2 = P3^6;
-
- ////数码管显示端口
- //sbit DIO = P7^5;//主板数码管显示端口
- //sbit CLK = P7^6;
- //读取按键值存储
- uchar keya; //定义读出按键返回值
-
- /*************1ms延时*晶振11.0592M********************/
- void delay(uint n)
- {
- uint i;
- while(n--)
- for(i=0;i<550;i++);
- }
-
-
-
- /************ START信号*******************************/
- void TM1650_START()
- {
- SCL=1;
- SDA=1;
- nop;
- SDA=0;
- nop;
- SCL=0;
- }
-
- /******************** STOP信号************************/
- void TM1650_STOP()
- {
- SDA=0;
- nop;
- SCL=1;
- nop;
- SDA=1;
- nop;
- SCL=0;
- SDA=0;
- }
-
-
- /****************写1个字节给TM1650********************/
- void write_8bit( uchar dat)
- {
- uchar i;
- SCL=0;
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- {
- SDA=1;
- nop;
- nop;
- SCL=1;
- nop;
- nop;
- nop;
- nop;
- nop;
- SCL=0;
- }
- else
- {
- SDA=0;
- nop;
- nop;
- SCL=1;
- nop;
- nop;
- nop;
- nop;
- nop;
- SCL=0;
- }
- dat<<=1;
- }
- SDA=1; //ACK信号
- nop;
- nop;
- nop;
- nop;
- SCL=1;
- nop;
- nop;
- nop;
- nop;
- nop;
- SCL=0;
- nop;
- nop;
- }
-
-
- /****读8bit
- 注意:本程序采用双向IO口,对于需要配置端口特性的MCU需要注意
- 在发送指令时配置为输出模式;
- 接受ACK为输入模式;
- 读数据位输入模式;
- **************************/
- uchar read_8bit()
- {
- uchar dat,i;
- SDA=1;
- dat=0;
- for(i=0;i<8;i++)
- {
- SCL=1; //时钟上沿
- nop;
- nop;
- nop;
- dat<<=1;
- if(SDA)
- dat++;
- SCL=0;
- nop;
- nop;
- nop;
- nop;
- }
- SDA=0; //ACK信号
- nop;
- nop;
- nop;
- SCL=1;
- nop;
- nop;
- nop;
- nop;
- SCL=0;
- nop;
-
- return dat ;
- }
-
- /********发送显示数据*******/
- void TM1650_send(uchar saddr,uchar sdate)
- {
- TM1650_START();
- write_8bit(saddr);
- write_8bit(sdate);
- TM1650_STOP();
- }
-
- /**系统设置命令
- light -- 亮度级别(00H 8级亮度、10H为1级亮度。。。。。。70H为7级亮度)
- segMod -- 段模式设置(00H为8段模式,08H为7段模式)
- WorkMod -- 工作模式(00H为正常模式,04H为低功耗模式)
- Onoff -- 开关(00H为关显示,01H为开显示)
- 例如:1级亮度,7段模式,正常工作模式,开显示则函数为
- TM1650_SystemCmd(0x10, 0x08, 0x01, 0x01 );
- ***/
- void TM1650_SystemCmd(uchar light,uchar segMod, uchar WorkMod, uchar Onoff)
- {
- TM1650_START();
- write_8bit(0x48);
- write_8bit(light | segMod | WorkMod | Onoff );
- TM1650_STOP();
- }
-
- /**4位显示数据
- 0x68 对应DIG1
- 0x6A 对应DIG2
- 0x6C 对应DIG3
- 0x6E 对应DIG4
- 如果要DIG1-4显示0-3 则函数为TM1650Disp(DispCode[0],DispCode[1],DispCode[2],DispCode[3]);
- ***/
- void TM1650Disp(uchar sdate1, uchar sdate2, uchar sdate3, uchar sdate4)
- {
- TM1650_send(0X68,sdate1); //GID1-sdate1
- TM1650_send(0X6A,sdate2); //GID2-sdate2
- TM1650_send(0X6C,sdate3); //GID3-sdate3
- TM1650_send(0X6E,sdate4); //GID4-sdate4
- }
-
-
- void WH_display(unsigned char DATA1,unsigned char DATA2)
- {
- TM1650_send(0x48,L_Du07);
- switch(DATA1) //箭头显示
- {
- case 0: TM1650_send(smg2,tab_run1[0]);break; //
- case 1: TM1650_send(smg2,tab_run1[1]);break; //
- case 2: TM1650_send(smg2,tab_run1[2]);break; //
- case 3: TM1650_send(smg2,tab_run1[3]);break; //
- }
- switch(DATA2)//楼层信息显示
- {
- case 0: TM1650_send(smg1,tab_run2[0]);break; //楼层0
- case 1: TM1650_send(smg1,tab_run2[1]);break; //楼层1
- case 2: TM1650_send(smg1,tab_run2[2]);break; //楼层2
- case 3: TM1650_send(smg1,tab_run2[3]);break; //楼层3
- case 4: TM1650_send(smg1,tab_run2[4]);break; //楼层4
- case 5: TM1650_send(smg1,tab_run2[5]);break; //楼层5
- case 6: TM1650_send(smg1,tab_run2[6]);break; //楼层6
- case 7: TM1650_send(smg1,tab_run2[7]);break; //楼层7
- case 8: TM1650_send(smg1,tab_run2[8]);break; //楼层8
- case 9: TM1650_send(smg1,tab_run2[9]);break; //楼层9
- // case 10: tm1650_write_display2(smg1,tab_run2[7]);break; //楼层7
- }
- }
-
-
- /***TM1650上电清零操作
- 注意:对于关掉显示时,建议采用对所有显存进行清零操作,即4位显存发送0x00数据
- ***/
- //void TM1650Init(uchar light,uchar segMod, uchar DispMod, uchar Onoff)
- //{
- // TM1650_SystemCmd(light, segMod,DispMod, Onoff); //8级亮度+8段模式+正常工作模式+开显示
- // //数据清零
- // TM1650Disp(0x00,0x00,0x00,0x00);
- //}
-
-
- /***
- 逐段显示
- light为亮度等级(00H\10H\...70H)
- ***/
- //void TM1650PersegDisp(uchar light)
- //{
- // unsigned char i=0,j=0,Addr=0x68,fdate=0x01;
- // TM1650_SystemCmd(light, 0x00, 0x00, 0x01); //light亮度+8段模式+正常工作模式+开显示
- // for(j=0; j<4; j++)
- // {
- // for(i=0; i<9; i++)
- // {
- // TM1650_send(Addr, fdate);
- // fdate |= perseg[i];
- // delay(100);
- // }
- // Addr+=2;
- // fdate=perseg[0];
- // }
- //}
-
- /***显示1-99数据***/
- void TM1650Disp2Num(unsigned char snum)
- {
-
- TM1650Disp(0x00,0x00,DispCode[snum/10%10],DispCode[snum%10]); //显示1、2、3、4
- }
-
- /*******************读按键命令************************/
- uchar TM1650_read()
- {
- uchar key;
- TM1650_START();
- write_8bit(0x4F); //读按键指令
- key=read_8bit();
- TM1650_STOP();
- return key;
- }
-
-
- /***按键处理函数
- 注意:该程序未处理按键松开时的情况
- ***/
- void TM1650ReadKey(void)
- {
- unsigned char KeyDate=0x00;
- KeyDate = TM1650_read();
- switch(KeyDate)
- {
- /**单个按键**/
- case 0x06:WH_display(1,1);break; //KI1+DIG4 //KI3+DIG4
- case 0x0E:WH_display(1,2);break; //KI2+DIG4 //KI4+DIG4
- case 0x26:WH_display(1,3);break; //KI3+DIG4 //KI5+DIG4
- case 0x2E:WH_display(1,4);break; //KI4+DIG4 //KI6+DIG4
-
-
- case 0x47:WH_display(1,0);break; //KI1+DIG4
- case 0x4f:WH_display(1,0);break; //KI2+DIG4
- case 0x57:WH_display(1,0);break; //KI3+DIG4
- case 0x5f:WH_display(1,0);break; //KI4+DIG4
- case 0x67:WH_display(1,0);break; //KI5+DIG4
- case 0x6f:WH_display(1,0);break; //KI6+DIG4
- case 0x77:WH_display(1,0);break; //KI7+DIG4
-
-
- case 0x44:WH_display(1,0);break; //KI1+DIG1
- case 0x45:WH_display(1,0);break; //KI1+DIG2
- case 0x46:WH_display(1,0);break; //KI1+DIG3
-
-
- case 0x4C:WH_display(1,1);break; //KI2+DIG1
- case 0x4d:WH_display(1,1);break; //KI2+DIG2
- case 0x4e:WH_display(1,1);break; //KI2+DIG3
-
-
- case 0x54:WH_display(1,2);break; //KI3+DIG1
- case 0x55:WH_display(1,2);break; //KI3+DIG2
- case 0x56:WH_display(1,2);break; //KI3+DIG3
-
-
- case 0x5C:WH_display(1,3);break; //KI4+DIG1
- case 0x5d:WH_display(1,3);break; //KI4+DIG2
- case 0x5e:WH_display(1,3);break; //KI4+DIG3
-
-
- case 0x64:WH_display(1,4);break; //KI5+DIG1
- case 0x65:WH_display(1,4);break; //KI5+DIG2
- case 0x66:WH_display(1,4);break; //KI5+DIG3
-
-
- case 0x6C:WH_display(1,5);break; //KI6+DIG1
- case 0x6d:WH_display(1,5);break; //KI6+DIG2
- case 0x6e:WH_display(1,5);break; //KI6+DIG3
-
-
- case 0x74:WH_display(1,6);break; //KI7+DIG1
- case 0x75:WH_display(1,6);break; //KI7+DIG2
- case 0x76:WH_display(1,6);break; //KI7+DIG3
-
-
- /**组合按键**/
- case 0x7C:WH_display(1,7);break; //KI1_KI2+DIG1
- case 0x7d:WH_display(1,7);break; //KI1_KI2+DIG2
- case 0x7e:WH_display(1,7);break; //KI1_KI2+DIG3
- case 0x7f:WH_display(1,7);break; //KI1_KI2+DIG4
-
- default: break;
- }
- }
-
-
复制代码 这个是.C文件
- key001=TM1650_read();
- UART_Send_int(1,"按钮值 = ",key001,"\r\n"); //IO_GM elevator_weizhi
- // UART_Send_byte(1,key001);
- TM1650ReadKey();
- delay(50);
复制代码 这个是应用函数 其中读取按钮值的函数是为了完善应用函数中按钮的按钮值,测试发现不同的数码管数量以及布线,读出来的按钮值和说明书中的并不一致,不过这并不影响实际使用,只需要根据读取的值,更换库文件中的键值即可
|