本帖最后由 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
|
|