资料详见:http://www.51hei.com/bbs/dpj-240321-1.html
TM1637.h程序文件:
- #ifndef __TM1637_H__
- #define __TM1637_H__
- #include <STC8H.H>
- //定义端口
- sbit clk = P1^0;
- sbit dio = P3^7;
- extern unsigned char xdata smg_hc[4]; //数码管缓存
- extern unsigned char shu;
-
- void SmgDisplay(unsigned char *p,char L); //指定数组显示。*p:数码管段码 L:0-9亮度
- void Smg_ctrl_dot(bit dot); //控制小数点亮灭。0:小数点熄灭,1:小数点亮起
- void Smg_ctrl_bit(unsigned char i,unsigned char dat); //控制单独数码管。i:要控制的数码管位 dat:要写入的数据:0~9; 10为熄灭该数码管
- void Smg_ctrl_lum(unsigned char R); //亮度控制。亮度等级:1~8;0为熄灭
- void Smg_ctrl_all(unsigned char a,unsigned char b,unsigned char c,unsigned char d,bit t,char R);
- //数码管,a,b,c,d为4位显示数字,t:小数点0|1,R亮度:0~8
- void Fnshu(unsigned int a); //指定4位数拆份并显示
- void ZUDisplay(unsigned char *p);
- #endif
复制代码
TM1637.c程序:
- #include <TM1637.H>
- #include <intrins.h>
-
- static unsigned char data t_display[]={ //标准字库
- // 0 1 2 3 4 5 6 7 8 9 black
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
- unsigned char xdata smg_hc[4]; //数码管缓存
- unsigned char luminance=0; //亮度存储
- unsigned char shu;
- bit dot_f=0; //小数点标志位
-
- void Delay1us() //@24.000MHz
- {
- unsigned long i;
-
- _nop_();
- _nop_();
- _nop_();
- i = 4UL;
- while (i) i--;
- }
-
- /*******************************************************************************
- * 函 数 名: Delay_us
- * 函数功能: 延时接口
- * 输 入: 微秒延时
- * 输 出: 无
- *******************************************************************************/
- void Delay_us(unsigned int i)
- {
- for(;i>0;i--)
- { //延时接口
- Delay1us();
- }
- }
- /*******************************************************************************
- * 函 数 名: TM1637_Start
- * 函数功能: 1637起始信号
- * 输 入: 无
- * 输 出: 无
- *******************************************************************************/
- void TM1637_Start(void)
- {
- clk = 1;
- dio = 1;
- Delay_us(2);
- dio = 0;
- }
- /*******************************************************************************
- * 函 数 名: TM1637_ask
- * 函数功能: 1637 应答信号
- * 输 入: 无
- * 输 出: 无
- *******************************************************************************/
- void TM1637_ask(void)
- {
- clk = 0;
- Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号
- while(dio);
- clk = 1;
- Delay_us(2);
- clk=0;
- }
- /*******************************************************************************
- * 函 数 名: TM1637_Stop
- * 函数功能: 1637 停止信号
- * 输 入: 无
- * 输 出: 无
- *******************************************************************************/
- void TM1637_Stop(void)
- {
- clk = 0;
- Delay_us(2);
- dio = 0;
- Delay_us(2);
- clk = 1;
- Delay_us(2);
- dio = 1;
- }
- /*******************************************************************************
- * 函 数 名: TM1637_WrByte
- * 函数功能: 写一个字节
- * 输 入: char数据
- * 输 出: 无
- *******************************************************************************/
- void TM1637_WrByte(unsigned char oneByte)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- { clk = 0;
- if(oneByte&0x01) //低位在前
- {
- dio = 1;
- }
- else
- {
- dio = 0;
- }
- Delay_us(3);
- oneByte=oneByte>>1;
- clk=1;
- Delay_us(3);
- }
- }
- /*******************************************************************************
- * 函 数 名: SmgDisplay
- * 函数功能: 写显示寄存器
- * 输 入: *p:数码管段码 L:0-9亮度
- * 输 出: 无
- *******************************************************************************/
- void SmgDisplay(unsigned char *p,char L)
- {
- unsigned char i;
- TM1637_Start();
- TM1637_WrByte(0x40); // 40H 地址自动加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
- TM1637_ask();
- TM1637_Stop();
- TM1637_Start();
- TM1637_WrByte(0xc0); //设置首地址,
- TM1637_ask();
-
- for(i=0;i<6;i++) //地址自加,不必每次都写地址
- {
- TM1637_WrByte(*p++); //送数据
- TM1637_ask();
- }
-
- TM1637_Stop();
- TM1637_Start();
- if((L>0)&&(L<9)) TM1637_WrByte((unsigned char)(0x88+(L-1))); //开显示 ,最大亮度
- else TM1637_WrByte(0x80);
-
- TM1637_ask();
- TM1637_Stop();
- }
- /*******************************************************************************
- * 函 数 名: Smg_ctrl_dot
- * 函数功能: 控制小数点亮灭
- * 输 入: 0:小数点熄灭1:小数点亮起
- * 输 出: 无
- *******************************************************************************/
- void Smg_ctrl_dot(bit dot)
- {
- if(dot) smg_hc[1]-=0x80;
- SmgDisplay(smg_hc,luminance);
- }
- /*******************************************************************************
- * 函 数 名: Smg_ctrl_bit
- * 函数功能: 控制单独数码管
- * 输 入: i:要控制的数码管位 dat:要写入的数据:0~9; 10为熄灭该数码管
- * 输 出: 无
- *******************************************************************************/
- void Smg_ctrl_bit(unsigned char i,unsigned char dat)
- {
- smg_hc[i+1]=t_display[dat];
- SmgDisplay(smg_hc,luminance);
- }
- /*******************************************************************************
- * 函 数 名: Smg_ctrl_lum
- * 函数功能: 数码管亮度控制
- * 输 入: 亮度等级:1~8; 0为熄灭
- * 输 出: 无
- *******************************************************************************/
- void Smg_ctrl_lum(unsigned char R)
- {
- luminance=R;
- SmgDisplay(smg_hc,luminance);
- }
- /*******************************************************************************
- * 函 数 名: Smg_ctrl_all
- * 函数功能: 数码管全部资源控制
- * 输 入: a:第一位数码管 0~9
- b:第二位数码管 0~9
- c:第三位数码管 0~9
- d:第四位数码管 0~9
- t:小数点 0|1
- R:亮度 0~8
- * 输 出: 无
- *******************************************************************************/
- void Smg_ctrl_all(unsigned char a,unsigned char b,unsigned char c,unsigned char d,bit t,char R)
- {
- smg_hc[0]=t_display[a]; //将标准字库赋于数码管缓存
- smg_hc[1]=t_display[b];
- dot_f=t;
- if(t) smg_hc[1]-=0x80;
- smg_hc[2]=t_display[c];
- smg_hc[3]=t_display[d];
- luminance=R;
- SmgDisplay(smg_hc,luminance);
- }
- /*******************************************************************************
- * 函 数 名: Fnshu
- * 函数功能: 将接收到的自然数拆份并显示
- * 输 入: a:值的范围0-65535
- luminance:亮度 0~8
- * 输 出: 无
- *******************************************************************************/
- void Fnshu(unsigned int a)
- {
- smg_hc[3] = t_display[a%10]; //个
- smg_hc[2] = t_display[a/10%10]; //十
- smg_hc[1] = t_display[a/100%10]; //百
- smg_hc[0] = t_display[a/1000%10]; //千
- luminance=1;
- SmgDisplay(smg_hc,luminance);
- }
- /*******************************************************************************
- * 函 数 名: Fnshu
- * 函数功能: 显示指定数组
- * 输 入: a:值的范围0-65535
- luminance:亮度 0~8
- * 输 出: 无
- *******************************************************************************/
- void ZUDisplay(unsigned char *p)
- {
- unsigned char i;
- for(i=0;i<4;i++)
- {
- smg_hc[i] = t_display[*p];
- p++; //个
- }
-
- luminance=1;
- SmgDisplay(smg_hc,luminance);
- }
复制代码
|