📄 led.c
字号:
/****************************************Copyright (c)**************************************************/
/**
;** 西南科技大学计算机科学学院
;**
;** http://www.cs.suswt.edu.cn
;**
;** 日期: 2007/08/09
;** 描述: 西南科技大学计算机学院CS-II型实验板LED灯驱动工作程序
;** 作者:
;**
;**--------------led.c文件
;**------------------------------------------------------------------------------------------------------*/
/**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _LED_C
#ifdef _LED_C
/******************************
* Head File *
*****************************/
#include"led.h"
/******************************
* Global Variable *
*****************************/
/******************************
* Const Segment *
*****************************/
//0 1 2 3 4 5 6 7 8 9
const uint8 led_dis_content[0x10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6,
//a b c d e f
0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
uint8 led_dis_mem[LED_NUMBER] ; //显示缓存
uint8 led_dis_bit = 0x00; //扫描函数中用于显示哪一个数据,做led_dis_content[]的参数
uint8 led_dis_pos = 0xfe; //片选位
/******************************
* Function Implement *
*****************************/
/*******************************************************************************
Function Name: void LEDInit(void) *
Description : LED初始化设置,主要设置引脚连接模块和输入输出方向 *
*******************************************************************************/
void LEDInit(void)
{
PINSEL1 &= LED_MAT; //引脚连接模块设置,选择P0.17 P0.18 P0.20做GPIO
IO0DIR |= LED_SRCLK; //方向输出
IO0DIR |= LED_RCLK;
IO0DIR |= LED_SER;
IO0DIR &= LED_KEY^0xffffffff; //方向为输入
}
/*******************************************************************************
Function Name: void LEDSendData(uint8 disdata,uint8 dispos) *
Description : LED数据传输,包括8位片选位和8位显示数据位。采用串行传输,其中 *
硬件连接中涉及到了74HC595芯片,编程中涉及到RCK,SRCK,SI。 *
*******************************************************************************/
void LEDSendData(uint8 disdata,uint8 dispos)
{
uint16 datatmp = 0x0000;
uint8 tmp = 0x00;
datatmp = ((datatmp|disdata)<<8)|dispos;
IO0CLR = LED_RCLK ;
for(tmp = 0x00;tmp<0x10;tmp++)
{
IO0CLR = LED_SRCLK;
if(datatmp&0x01==0x01)
{
IO0SET = LED_SER; // 通过SI口接收每位数据
}
else
{
IO0CLR = LED_SER;
}
datatmp = datatmp>>1;
IO0SET = LED_SRCLK; //SCK的高电平发出移位信号,每位数据都移动到下一个移位寄存器中
}
IO0SET = LED_RCLK; //遇到同步发送脉冲RCK时,将多位数据一次发送到寄存器中,形成一多位的并行数据。
}
/*******************************************************************************
Function Name: void LEDScan(void) *
Description : LED扫描函数,常规的数码管扫描方法。 *
*******************************************************************************/
void LEDScan(void)
{
LEDSendData(led_dis_mem[led_dis_bit],led_dis_pos); //某一行显示某种数据
led_dis_bit++; //下一行需要的数据
led_dis_pos = (led_dis_pos<<1)|0x01; //选中下一行
if(led_dis_bit == LED_NUMBER)
{
led_dis_bit = 0x00;
led_dis_pos = 0xfe;
}
}
/*******************************************************************************
Function Name: void LEDPrint(uint32 disdata) *
Description : LED显示函数。形参为32位的disdata。在使用实参时用0x的方式进行输 *
入,如0x2007f1fa可得到2007f1fa的直接显示。根据前面设置的显示范 *
围为0-9,a-f,这里可以直接输出存在缓存中的这些数字。
*******************************************************************************/
void LEDPrint(uint32 disdata)
{
uint8 tmp;
for(tmp=0x00;tmp<0x08;tmp++)
{
led_dis_mem[tmp] = led_dis_content[disdata&0x0000000f];
disdata = disdata>>4;
}
}
#endif
/*******************************************************************************
* The end of the entire file *
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -