本帖最后由 底色北路 于 2021-10-29 12:03 编辑
Haawking DSC2803X 经验贴
004 四位数码管实验(74hc595驱动方式)
一、说明:
作者:LiuZenglin
板卡版本:HX320F28034PT
IDE版本:Haawking IDE V0.5.3
编译器版本:HK100V1
二、硬件连接
* connect : 28034-----四位数码管模块(74HC595驱动)
* 0-----DIO
* 1-----RCLK
* 2-----SCLK
* 3.3-----vcc
* gnd-----gnd
三、程序编写 1.打开工程模板,新建工程模板的方法详见“经验贴001”
2.编写数码管相关函数
#include
#include "dsc_config.h"
#include "hx_rv32_dev.h"
#include "hx_rv32_type.h"
#include
#include "xcustom.h"
#include "IQmathLib.h"
#include "DSC28034_Device.h" // Headerfile Include File
/* 数码管显示内容对应表(共阳数码管)
位置 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
显示内容 0 1 2 3 4 5 6 7 8 9 A b C d E F
位置 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
显示内容 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. A. b. C. d. E. F.
位置 32 33
显示内容 空 - */
//共阳数码管码表
unsigned char TUBE_TABLE[] =
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x7f,0x8C,0xBF,0xC6,0xA1,0x86,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,
0xFF,0xbf
};
#define TUBE_NUM 4
//定义一个数码管的显示缓存
u8 Tube_Display[TUBE_NUM];
/*
* 函数名:TUBE_Init
* 入口参数:无
* 返回值:无
* 作用:数码管初始化配置
*/
void TUBE_Init(void)
{
EALLOW; // 打开寄存器写保护
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // Output
GpioDataRegs.GPASET.bit.GPIO0 = 1; // 输出高电平
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // Output
GpioDataRegs.GPASET.bit.GPIO1 = 1; // 输出高电平
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // Output
GpioDataRegs.GPASET.bit.GPIO2 = 1; // 输出高电平
EDIS; // 关闭寄存器写保护
}
/*
* 向75HC595输出数据
*/
void TUBE_74HC595_OUT(unsigned char dat)
{
unsigned char i;
for (i = 8; i >= 1; i--)
{
if (dat & 0x80)
{
GpioDataRegs.GPASET.bit.GPIO0 = 1; // 输出高电平
}
else
{
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // 输出低电平
}
dat <<= 1;
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1; // 输出低电平
GpioDataRegs.GPASET.bit.GPIO2 = 1; // 输出高电平
}
}
/*
* 数码管显示刷新函数
*/
void TUBE_DisplayRefresh(void)
{
EALLOW; // 打开寄存器写保护
unsigned char i;
//显示第1位
i = TUBE_TABLE[Tube_Display[0]];
TUBE_74HC595_OUT(i); //段选
TUBE_74HC595_OUT(0x08); //位选
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // 输出低电平
GpioDataRegs.GPASET.bit.GPIO1 = 1; // 输出高电平
//显示第2位
i = TUBE_TABLE[Tube_Display[1]];
TUBE_74HC595_OUT(i); //段选
TUBE_74HC595_OUT(0x04); //位选
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // 输出低电平
GpioDataRegs.GPASET.bit.GPIO1 = 1; // 输出高电平
//显示第3位
i = TUBE_TABLE[Tube_Display[2]];
TUBE_74HC595_OUT(i); //段选
TUBE_74HC595_OUT(0x02); //位选
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // 输出低电平
GpioDataRegs.GPASET.bit.GPIO1 = 1; // 输出高电平
//显示第4位
i = TUBE_TABLE[Tube_Display[3]];
TUBE_74HC595_OUT(i); //段选
TUBE_74HC595_OUT(0x01); //位选
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // 输出低电平
GpioDataRegs.GPASET.bit.GPIO1 = 1; // 输出高电平
}
int main(void)
{
volatile unsigned char i = 0;
volatile unsigned char j = 0;
DisableDog(); //Disable Watchdog
TUBE_Init();
EALLOW; // 打开寄存器写保护
for (j = 0; j <= 3; j++)
{
Tube_Display[j] = 8;
}
while(1)
{
TUBE_DisplayRefresh(); //调用数码管显示函数
//DELAY_US(500000);
}
return 0;
}
四、程序烧录
连接编译器及最小系统,程序调试烧录的方法详见“经验贴001”
五、程序现象 数码管显示8888,想更改显示的数据,可以更改Tube_Display数组中对应位置的值
|