📄 led.c
字号:
/****************************************Copyright (c)**************************************************/
/**
;** 西南科技大学计算机科学学院
;**
;** http://www.cs.suswt.edu.cn
;**
;** 日期: 2006.4.1
;** 描述: DataLedDriver.c 西南科技大学计算机学院CS-II型实验板数码管工作程序,控制
;** 数码管底层显示功能,负责将数据传输到目标,并控制595对数码管键盘进行扫描,
;** 完成键盘工作的功能,该文件给DataLed.c提供底层接口
;** 作者:
;**
;**--------------LedDriver.c文件
;**------------------------------------------------------------------------------------------------------*/
/**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _LED_C_
#ifdef _LED_C_
/************************************************
* Header File *
***********************************************/
#include "config.h"
#include "LED.h"
/************************************************
* Globale variable *
***********************************************/
uint8 gc_ledbuffer[LEDSIZE]; //数码管数据缓冲区
//数码管的数字编码(依次为0~f)
const uint8 LEDNUMCODE[16]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管的位数编码(分别为第0~7位)
const uint8 LEDBITCODE[8]=
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//数码管当前扫描的位选指针
//uint8 gc_displaybit = 0;
uint8 gc_displaybit = 0;
/*************************************************
名称: LEDInit
功能: 数码初使化(设置端口功能,方向)
**************************************************/
void LEDInit(void)
{
PINSEL1 &= 0xfffffc03; //设置P0.17~P0.20为IO口
IO0DIR |= LEDRCK; //设置输出
IO0DIR |= LEDSI;
IO0DIR |= LEDSCK;
IO0DIR &= (LEDREKEY ^ 0xffffffff); //设置输入
}
/*******************************************************
名称: LEDSendData(uint8 leddata,uint8 ledbit)
功能: 把要显示的一位数据及相应的位置通过74HC595送到数码管
********************************************************/
void LEDSendData(uint8 leddata,uint8 ledbit)
{
uint8 temp;
uint16 tempdata = 0;
tempdata = 0x0000 | ledbit; //实验箱应该是两个74HC595极连,一次可以把串行数据转换成16位的并行数据
tempdata = tempdata << 8; // 注:这里是地址在前,数据在后.
tempdata = tempdata | leddata;
IO0CLR = LEDRCK; //把LEDRCK清零(P0.20)
for(temp = 0; temp < 16; temp++)
{
IO0CLR = LEDSCK; //LEDSCK清零(P0.17)
if((tempdata & 0x8000) == 0) //把数据打入到74HC595中去
{
IO0CLR = LEDSI;
}
else
{
IO0SET = LEDSI;
}
tempdata = tempdata << 1;
IO0SET = LEDSCK; //LEDSCK置1,74HC595中的移位寄存器移位一次
}
IO0SET = LEDRCK; //LEDRCK置1,把16位的并行数据打入到数码管的相应引脚
}
/**************************************************
名称: LEDScan()
功能: 实现数码管的动态扫描
**************************************************/
void LEDScan(void)
{
LEDSendData(gc_ledbuffer[gc_displaybit],LEDBITCODE[gc_displaybit]); //把当前位的数据,地址传给数码管
gc_displaybit ++;
if(gc_displaybit == LEDSIZE)
{
gc_displaybit = 0;
}
}
/*************************************************
名称:LEDPrint(uint32 displaydata)
功能:把要显示的数据放入到缓冲区
*************************************************/
void LEDPrint(uint32 displaydata)
{
uint8 bufferbit = 0; //缓冲区数据地址指针
uint8 numbit = 0; //数码管编码指针
for(bufferbit =0; bufferbit < LEDSIZE; bufferbit++)
{
numbit = displaydata & 0x0f; //数码管显示的一位是十六进制,以要四位二进制,这里作用是取低四位
gc_ledbuffer[bufferbit] = LEDNUMCODE[numbit]; //更新数据缓冲区
displaydata = displaydata >> 4;
}
}
#endif
/*****************************************************************************
* End of Entire File *
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -