📄 leddisp.c
字号:
/*************************************** Copyright (c) *************************************************
*
* POLAR STAR
* 北天星国际贸易(深圳)有限公司
* http://www.po-star.com
*
* 文 件 名: LedDisp.c
* 文件描述:LED数码管显示。
* 通过I/O模拟同步串口与74HC595进行连接,控制74HC595驱动LED数管显示。
*
* 说 明:分别将跳线器JP7的中间管脚与SCK、MISO、MOSI、CS短接;
*
********************************************************************************************************/
#include "config.h"
#define SPI_CS 1<<7 /* P0.7 595的片选引脚*/
#define SPI_MOSI 1<<6 /* P0.6 SPI的数据输出*/
#define SPI_SCK 1<<4 /* P0.4 SPI的时钟输出*/
#define SPI_CTR (SPI_CS|SPI_MOSI|SPI_SCK) /* SPI接口的I/O设置字 */
/********************************************************************************************************
*
* 函数名称:Delay(uint32 count)
*
* 功能描述:软件延时。
*
* 入口参数:count
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void Delay(uint32 count)
{
uint32 tmp;
for(; count>0; count--)
for(tmp=0; tmp<50000; tmp++);
}
/********************************************************************************************************
*
* 函数名称:HC595_SendData(uint8 data)
*
* 功能描述:向74HC595发送一字节数据
*
* 入口参数:data 要发送的数据
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void SendData(uint8 data)
{
uint8 tmp;
IOCLR = SPI_CS; // SPI_CS = 0,准备锁存数据
for(tmp=0; tmp<8; tmp++) // 发送8位数据
{
IOCLR = SPI_SCK; // SPI_SCK = 0
/* 设置SPI的DATA输出值 */
if( (data&0x80)!=0 )
IOSET = SPI_MOSI; // 发送‘1’
else
IOCLR = SPI_MOSI; // 发送‘0’
data <<= 1;
IOSET = SPI_SCK; // SPI_SCK = 1
}
IOSET = SPI_CS; // SPI_CS = 1,输出显示数据
}
/********************************************************************************************************
*
* 函数名称:DataDisp(uint8 data)
*
* 功能描述:数据字符显示控制。显两位16进制数
*
* 入口参数:data 要显示的数据
* 出口参数:无
*
* 全局变量: 无
* 调用模块: HC595_SendData(uint8 data);
*
********************************************************************************************************/
/* 数据码显示控制对应表,如下:
a
-------
| |
f| |b
| g |
-------
| |
e| |c
| d |
------- 。h
Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 DAT HEX OUT
h f g e d c b a
0 0 1 1 1 1 1 1 0 3f C0
0 0 0 0 0 1 1 0 1 06 F9
0 1 0 1 1 0 1 1 2 5b A4
0 1 0 0 1 1 1 1 3 4f B0
0 1 1 0 0 1 1 0 4 66 99
0 1 1 0 1 1 0 1 5 6d 92
0 1 1 1 1 1 0 1 6 7d 82
0 0 0 0 0 1 1 1 7 07 F8
0 1 1 1 1 1 1 1 8 7f 80
0 1 1 0 1 1 1 1 9 6f 90
0 1 1 1 0 1 1 1 A 77 88
0 1 1 1 1 1 0 0 B 7c 83
0 1 0 1 1 0 0 1 C 59 C6
0 1 0 1 1 1 1 0 D 5e A1
0 1 1 1 1 0 0 1 E 79 86
0 1 1 1 0 0 0 1 F 71 8E
--注:请根据硬件的原理修改对应关系(Q0~Q7与a~h的关系)及输出值(OUT)
*/
void DataDisp(uint8 data)
{
const uint8 DISP_TAB[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };
SendData(DISP_TAB[(data>>4)&0xf]); // 显示高位
SendData(DISP_TAB[data&0x0f]); // 显示低位
}
/********************************************************************************************************
*
* 函数名称:main()
*
* 功能描述:控制LED数码管显示
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
int main(void)
{
uint8 tmp;
PINSEL0 = 0x00000000; // 设置所有管脚连接GPIO
PINSEL1 = 0x00000000;
IODIR = SPI_CTR; // 设置SPI控制口为输出
while(1)
{
for(tmp=0; tmp<0x100; tmp++)
{
DataDisp(tmp); // 输出LED显示数据
Delay(100); // 延时
}
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -