📄 main.c.bak
字号:
/****************************************Copyright (c)**************************************************/
/**
;** 西南科技大学计算机科学学院
;**
;** http://www.cs.suswt.edu.cn
;**
;** 日期: 2007/
;** 描述:
;** 作者:
;**
;**--------------*.*文件
;**------------------------------------------------------------------------------------------------------*/
/**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/************************************************
* Header File *
***********************************************/
#include"config.h"
/************************************************
* Macros *
***********************************************/
//数码管相关宏定义
#define LED_NUMBER 0x08
#define LED_RCLK 0x00100000 //P0.20 RCLK 遇到同步发送脉冲rclk时,将多位数据一次发送到寄存器中,形成一个相当于8位或多位的并行数据
#define LED_SRCLK 0x00020000 //P0.17 SRCLK srclk的高电平发出移位信号,每位数据都移动到下一个移位寄存器中
#define LED_SER 0x00040000 //P0.18 SER
#define LED_PINSEL 0xfffffcc3 //110011000011
#define LED_KEY 0x00080000
//键盘相关宏定义
#define KEY_PINSEL 0xffff00ff
#define KEY_SRCLK 0X00000010
#define KEY_SI 0x00000040
#define KEY_RCLK 0x00000080
#define KEY_KEY 0x00000020
/************************************************
* Globale variable *
***********************************************/
//数码管相关变量 //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;
uint8 led_dis_pos = 0xfe;
//键盘相关变量
uint8 key_data=0x0f;//键盘初始状态
uint8 tmp = 0x00;
/************************************************
* Function declaration *
***********************************************/
//数码管相关函数
void LEDInit(void); //数码管初始化设置
void LEDSendData(uint8 disdata,uint8 dispos); //数码管片选信息和数据信息输入
void LEDScan(void); //数码管扫描函数
void LEDPrint(uint32 disdata); //数码管显示函数
//键盘相关函数
void KEYShift(uint8 mode); //数据移位函数
uint8 KEYScan(void); //键盘轮转扫描函数
void KEYInit(void); //键盘初始化设置
//系统初始化程序
void DeviceInit(void); //系统初始化
int main(void)
{
DeviceInit();
LEDPrint(0x2007f1fa);
while(1)
{
LEDScan();
LEDPrint(KEYScan());
}
}
/*******************************************************************************
Function Name: void KEYShift(uint8 mode) *
Function Description : 进行轮转扫描时进行数据移位操作 *
*******************************************************************************/
void DeviceInit(void)
{
LEDInit();
KEYInit();
}
//**------------------------- 键盘扫描部分 -------------------------------**/
//** **/
/*******************************************************************************
Function Name: void KEYShift(uint8 mode) *
Function Description : 进行轮转扫描时进行数据移位操作 *
*******************************************************************************/
void KEYShift(uint8 mode) //如果mode是0就将KEY_SI置零 如果mode是1就将KEY_SI置1
{
IO0CLR=KEY_RCLK; //RCLK=0x00
IO0CLR=KEY_SRCLK; //SRCLK=0
if((mode&0x01)==0x00) //该位为0
{
IO0CLR = KEY_SI;
}
else
{
IO0SET = KEY_SI;
}
IO0SET=KEY_SRCLK; //SLK=1
IO0SET=KEY_RCLK; //RCK=0x00
}
/*******************************************************************************
Function Name: uint8 KEYScan(void) *
Function Description : 键盘扫描函数,进行轮转扫描 *
*******************************************************************************/
uint8 KEYScan(void)
{
//KeyData变化范围为0x00----0x0f
//扫描过程
//先进行键盘判断上次键盘的判断
if((IO0PIN&KEY_KEY)==0) //有键按下(IO0PIN&KEY_KEY)== 0,即key位为0
{
tmp = key_data;
return key_data;
} //如果有键盘按下,连续对该键进行扫描,返回该键键值。
else
{
if(key_data==0x0f)
{
key_data=0x00;
KEYShift(0);
}
else
{
key_data++;
KEYShift(1);
}
return tmp;//0x10;
} //没有键盘按下,进行扫描轮转。
}
/*******************************************************************************
Function Name : void KEYInit(void) *
Function Description : 键盘的初始化程序,包括设置引脚链接模块,引脚输入输出设置*
*******************************************************************************/
void KEYInit(void)
{
PINSEL0&=KEY_PINSEL; //端口选择,这里选择P0.4~P0.7实现GPIO功能
IO0DIR|=KEY_SRCLK; //方向输出
IO0DIR|=KEY_RCLK; //方向输出
IO0DIR|=KEY_SI; //方向输出
IO0DIR&=(KEY_KEY^0XFFFFFFFF); //方向输入
}
//**-------------------------------------------------------------------------------**/
// 数码管部分 //
/*******************************************************************************
Function Name : void LEDInit(void) *
Function Description : LED灯初始化设置,包括引脚连接模块和输入输出设置 *
*******************************************************************************/
void LEDInit(void)
{
PINSEL1 &= LED_PINSEL; //端口选择,这里选择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) *
Function Description : 串行发送数据,发送8为数据位,8位片选位 *
*******************************************************************************/
void LEDSendData(uint8 disdata,uint8 dispos)
{
uint16 datatmp = 0x0000;
uint8 tmp = 0x00;
datatmp = ((datatmp|disdata)<<8)|dispos; //先发送8位片选位
IO0CLR = LED_RCLK ;
for(tmp = 0x00;tmp<0x10;tmp++)
{
IO0CLR = LED_SRCLK;
if(datatmp&0x01==0x01)
{
IO0SET = LED_SER;
}
else
{
IO0CLR = LED_SER;
}
datatmp = datatmp>>1;
IO0SET = LED_SRCLK;
}
IO0SET = LED_RCLK;
}
/*******************************************************************************
Function Name : void LEDScan(void) *
Function Description : 数码管扫描程序 *
*******************************************************************************/
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) *
Function Description : 数码管显示程序,让缓存区的数据在数码管上面显示。入口参 *
数是一个32位的数据,使用时以0x的形式,即十六进制的形式 *
传参。 *
*******************************************************************************/
void LEDPrint(uint32 disdata)
{
uint8 tmp;
for(tmp=0x00;tmp<0x08;tmp++)
{
led_dis_mem[tmp] = led_dis_content[disdata&0x0000000f];
disdata = disdata>>4;
}
}
/*****************************************************************************
* End of Entire File *
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -