打印
[应用方案]

NV32F100FD401驱动TM1638按键和数码管显示模块

[复制链接]
1895|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lerbang|  楼主 | 2018-6-30 15:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lerbang 于 2018-6-30 18:05 编辑

FD401638A1.rar (1.53 MB) 下图是用NV32F100FD401做的试验板。
驱动TM1638按键和数码管显示模块主程序如下:
/****************************************************************
2018年2月14日
文件名:main.c(FD401638A1.c)
****************************************************************/
#include "common.h"
#include "gpio.h"
#include "sysinit.h"
#include "start.h"
#include "TM1638.h"


void gpio_Init(void);

int main(void)
{

        u8 key_value;
        sysinit();
        cpu_identify();               
        gpio_Init();
        GPIO_PinSet(GPIO_PTE7); //PTE7 置 1
        init_TM1638();
        Display(12045608);
        Delayms(2000);

        LedDisplay(10,11,12,13,14,15,16,17,0x02,0xff);  
        Delayms(2000);

        LedDisplay(18,19,20,21,22,23,24,25,0xff,0xff);  


        while(1)
        {

        key_value=Read_key();

        if(key_value>=1)
        {
        Display(key_value);
       GPIO_PinClear(GPIO_PTE7); //PTE7 置 0,有按键值,蜂鸣器响。
        Delayms(800);
        GPIO_PinSet(GPIO_PTE7); //PTE7 置 1
        Delayus(10);

        }
                        
        }
}

void gpio_Init(void)
{

        GPIO_Init(GPIOA, GPIO_PTA0_MASK, GPIO_PinOutput);    // TM1638_DIO P26
        GPIO_Init(GPIOA, GPIO_PTA1_MASK, GPIO_PinOutput);   // TM1638_CLK  P25
        GPIO_Init(GPIOB, GPIO_PTH2_MASK, GPIO_PinOutput);   // TM1638_STB  P39
        GPIO_Init(GPIOB, GPIO_PTE7_MASK, GPIO_PinOutput);   //FMQ          P38 接蜂鸣器控制三极管基极。
}



/****************************************************************************************
本程序运行后
1、显示12045608和相关字母。
即运行了以下程序:
Display(12045608);
        Delayms(2000);

        LedDisplay(10,11,12,13,14,15,16,17,0x02,0xff);  
        Delayms(2000);

        LedDisplay(18,19,20,21,22,23,24,25,0xff,0xff);  
2、按键显示相应的数字1到16,按键后蜂鸣器一声响。


****************************************************************************************/
TM1638.c和TM1638.H文件如下:

/*******************************************************************************
* 日  期:2018年2月13日
* 文件名:TM1638.c
* 软件内名容:        3线IO口控制8位数码管

*********************************************************************************/
#include "gpio.h"
#include"TM1638.h"
#include"typedef.h"
//******************************************************************************************
//u8  tab[]数码管码表值
//******************************************************************************************
u8  tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,
                  0x76,0x38,0x54,0x5C,0x73,0x67,0x50,0x3E,0x00};
u8  writedata0,writedata1,writedata2,writedata3,writedata4,writedata5,writedata6;
u8  writedata7;
void Delayms(u32 i)
{
   u32 j;
   while (i-->0)
   {
     for (j=0;j<3000;j++){;}
   }
}

void Delayus(u32 i)
{        
        for(;i != 0; i--);        
}


void TM1638_Write(u8  DATA)                        //写数据函数
{
u8 i;
GPIO_Init(GPIOA, GPIO_PTA0_MASK, GPIO_PinOutput);


        for(i=0;i<8;i++)
        {
                TM1638_CLK_L;
                if(DATA&0x01)
                        TM1638_DIO_H ;
                else
                         TM1638_DIO_L ;
                DATA>>=1;
                TM1638_CLK_H;
        }
}
u8 TM1638_Read(void)                                //读数据函数
{
u8 i, temp=0;
GPIO_Init(GPIOA, GPIO_PTA0_MASK, GPIO_PinInput);
        

         


       TM1638_DIO_H ;


        Delayus(10);        

        for(i=0;i<8;i++)
        {


                temp>>=1;
                TM1638_CLK_L;
                Delayus(10);
                if(GPIO_BitRead(GPIO_PTA0))

                        temp|=0x80;
                TM1638_CLK_H;
        }         


        return temp;

}               
void Write_COM(u8 cmd)                          //发送命令字
{
        TM1638_STB_L;
        TM1638_Write(cmd);
        TM1638_STB_H;
}

u8 Read_key(void)
{
        u8 c[4],i,key_value=0;
        TM1638_STB_L;
        TM1638_Write(0x42);
        Delayus(50);
        c[0]=0;c[1]=0;c[2]=0;c[3]=0;
        for(i=0;i<4;i++)
           {
              c=TM1638_Read();
           }
        TM1638_STB_H;                                        //4个字节数据合成一个字节
        if(c[0]==0x04) key_value=1;
        if(c[0]==0x40) key_value=2;
        if(c[1]==0x04) key_value=3;
        if(c[1]==0x40) key_value=4;
        if(c[2]==0x04) key_value=5;
        if(c[2]==0x40) key_value=6;
        if(c[3]==0x04) key_value=7;
        if(c[3]==0x40) key_value=8;
        if(c[0]==0x02) key_value=9;
        if(c[0]==0x20) key_value=10;
        if(c[1]==0x02) key_value=11;
        if(c[1]==0x20) key_value=12;
        if(c[2]==0x02) key_value=13;
        if(c[2]==0x20) key_value=14;
        if(c[3]==0x02) key_value=15;
        if(c[3]==0x20) key_value=16;
        return (key_value);
}

void init_TM1638(void)
{
        u8 i;
        TM1638_DIO_H;
        TM1638_CLK_H;
        TM1638_STB_H;
        Write_COM(0x8a);//亮度
        Write_COM(0x40); //写 数据命令
        TM1638_STB_L;
        TM1638_Write(0xc0);                //写地址命令
        for(i=0;i<16;i++)        
        TM1638_Write(0xff);
        TM1638_STB_H;
}

//*********************************************************************************************
//8个数码管显示函数,x 为小数点显示位,x=0x00 8个数码管小数点全熄灭,x=0xff 8个数码管小数点全亮。
//                   y 为数码管显示位,y=0x00 8个数码管全熄灭,y=0xff 8个数码管全亮。
//*********************************************************************************************
void LedDisplay(u8 data0,u8 data1,u8 data2,u8 data3,
               u8 data4,u8 data5,u8 data6,u8 data7,u8 x,u8 y)

{
         
        writedata0=(tab[data0]&0x01)+((tab[data1]&0x01)<<1)+((tab[data2]&0x01)<<2)+((tab[data3]&0x01)<<3)+((tab[data4]&0x01)<<4)
                +((tab[data5]&0x01)<<5)+((tab[data6]&0x01)<<6)+((tab[data7]&0x01)<<7);

        writedata1=((tab[data0]&0x02)>>1)+((tab[data1]&0x02))+((tab[data2]&0x02)<<1)+((tab[data3]&0x02)<<2)+((tab[data4]&0x02)<<3)
                +((tab[data5]&0x02)<<4)+((tab[data6]&0x02)<<5)+((tab[data7]&0x02)<<6);

        writedata2=((tab[data0]&0x04)>>2)+((tab[data1]&0x04)>>1)+((tab[data2]&0x04))+((tab[data3]&0x04)<<1)+((tab[data4]&0x04)<<2)
                +((tab[data5]&0x04)<<3)+((tab[data6]&0x04)<<4)+((tab[data7]&0x04)<<5);

        writedata3=((tab[data0]&0x08)>>3)+((tab[data1]&0x08)>>2)+((tab[data2]&0x08)>>1)+((tab[data3]&0x08))+((tab[data4]&0x08)<<1)
                +((tab[data5]&0x08)<<2)+((tab[data6]&0x08)<<3)+((tab[data7]&0x08)<<4);

        writedata4=((tab[data0]&0x10)>>4)+((tab[data1]&0x10)>>3)+((tab[data2]&0x10)>>2)+((tab[data3]&0x10)>>1)+((tab[data4]&0x10))
                +((tab[data5]&0x10)<<1)+((tab[data6]&0x10)<<2)+((tab[data7]&0x10)<<3);

        writedata5=((tab[data0]&0x20)>>5)+((tab[data1]&0x20)>>4)+((tab[data2]&0x20)>>3)+((tab[data3]&0x20)>>2)+((tab[data4]&0x20)>>1)
                +((tab[data5]&0x20))+((tab[data6]&0x20)<<1)+((tab[data7]&0x20)<<2);

        writedata6=((tab[data0]&0x40)>>6)+((tab[data1]&0x40)>>5)+((tab[data2]&0x40)>>4)+((tab[data3]&0x40)>>3)+((tab[data4]&0x40)>>2)
                +((tab[data5]&0x40)>>1)+((tab[data6]&0x40))+((tab[data7]&0x40)<<1);


        Write_COM(0x8a);//亮度
        Write_COM(0x40); //写 数据命令
        TM1638_STB_L;
        TM1638_Write(0xc0);                //写地址命令
        
        TM1638_Write(writedata0&y);     //写8个数码管A段。
        TM1638_Write(0x00);

        TM1638_Write(writedata1&y);     //写8个数码管B段。
        TM1638_Write(0x00);

        TM1638_Write(writedata2&y);     //写8个数码管C段。
        TM1638_Write(0x00);
        TM1638_Write(writedata3&y);     //写8个数码管D段。
        TM1638_Write(0x00);

        TM1638_Write(writedata4&y);     //写8个数码管E段。
        TM1638_Write(0x00);
        TM1638_Write(writedata5&y);     //写8个数码管F段。
        TM1638_Write(0x00);

        TM1638_Write(writedata6&y);     //写8个数码管G段。
        TM1638_Write(0x00);

        TM1638_Write(writedata7|x);     //写8个数码管小数点段。
        TM1638_Write(0x00);
        TM1638_STB_H;


}

void Display(s32 h)
{
  u8 i,j=0,k=0;
  u8 bb[8];
  s32 cc;
  for(i=0; i<8;i++)
  {
   ++j;
   cc=0;
   cc=h%10;
   bb=(u8)cc;
   Delayus(50);
   h/=10;
   if(h==0)
   break;
  }
  switch (j)
  {
    case 1: k=0x01;break;     //k数码管显示位,即long h是几位数。
    case 2: k=0x03;break;
    case 3: k=0x07;break;
    case 4: k=0x0f;break;
    case 5: k=0x1f;break;
    case 6: k=0x3f;break;
    case 7: k=0x7f;break;
    case 8: k=0xff;break;
  }

  LedDisplay(bb[0],bb[1],bb[2],bb[3],bb[4],bb[5],bb[6],bb[7],0x00,k);  
}


/*******************************************************************************        
* 日  期:2018年2月13日
* 文件名:TM1638.h
* 软件内容:                3线IO口控制8位数码管

********************************************************************************/

/*************** TM1638.H头文件 *******************/


#ifndef        _TM1638_H
#define        _TM1638_H
#include "gpio.h"
#include <stdio.h>
#include"typedef.h"



//TM1638_DIO代表的IO口操作函数
#define        TM1638_DIO_H    GPIO_PinSet(GPIO_PTA0)      //TM1638_DIO 置1。         
#define        TM1638_DIO_L    GPIO_PinClear(GPIO_PTA0)    //TM1638_DIO 置0。        


#define        TM1638_CLK_H    GPIO_PinSet(GPIO_PTA1)      //TM1638_CLK 置1。         
#define        TM1638_CLK_L    GPIO_PinClear(GPIO_PTA1)    //TM1638_CLK 置0。  

#define        TM1638_STB_H    GPIO_PinSet(GPIO_PTH2)      //TM1638_STB 置1。         
#define        TM1638_STB_L    GPIO_PinClear(GPIO_PTH2)    //TM1638_STB 置0。  










void Delayms(u32 i);
void Delayus(u32 i);
void TM1638_Write(u8        DATA);                        //写数据函数
u8 TM1638_Read(void);                           //读数据函数
u8 Read_key(void);                              //读键盘函数
void Write_COM(u8 cmd);                         //发送命令字
void init_TM1638(void);                         //TM1638初始化
void LedDisplay(u8 data0,u8 data1,u8 data2,u8 data3,
               u8 data4,u8 data5,u8 data6,u8 data7,u8 x,u8 y);    //8个数码管显示函数

void Display(s32 h);                           //数字分解函数

#endif






               
         















相关帖子

沙发
xyz549040622| | 2018-6-30 22:14 | 只看该作者
牛X,板子自己做的吗?

使用特权

评论回复
板凳
lerbang|  楼主 | 2018-7-3 08:55 | 只看该作者
xyz549040622 发表于 2018-6-30 22:14
牛X,板子自己做的吗?

谢谢!是自己做的。昨天没上网,回复晚了,抱歉。

使用特权

评论回复
地板
xyz549040622| | 2018-7-3 14:56 | 只看该作者
lerbang 发表于 2018-7-3 08:55
谢谢!是自己做的。昨天没上网,回复晚了,抱歉。

厉害,还以为没人搞这种手工板子了。

使用特权

评论回复
5
123ycli| | 2018-7-22 22:57 | 只看该作者
好古老的板子,发出去打样,也没多少钱的。

使用特权

评论回复
6
tang87633187| | 2018-8-1 14:44 | 只看该作者
   for(i=0;i<4;i++)
           {
              c=TM1638_Read();
           }
       C 好像有问题, 是不是c[i];

使用特权

评论回复
7
lerbang|  楼主 | 2018-8-2 08:21 | 只看该作者

for(i=0;i<4;i++)
           {
              c=TM1638_Read();
           }
这个for循环的目的是读取TM1638的按键值并存入c。TM1638_Read();这个函数是NV32F100系列芯片的库函数。整个工程是经过实物试验并且成功的,请放心。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

28

帖子

1

粉丝