⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 凌阳IDE中写的一个LED键盘模组制程序
💻 C
字号:
//===============================================================
//
//        The information contained herein is the exclusive property of
//      Sunplus Technology Co. And shall not be distributed, reproduced,
//      or disclosed in whole in part without prior written permission.
//
//            (C) COPYRIGHT 2001   SUNPLUS TECHNOLOGY CO.
//                           ALL RIGHTS RESERVED
//
//    The entire notice above must be reproduced on all authorized copies.
//
//==============================================================
//============================================================
//  工程名称: checkled.scs
//  功能描述:  LED模组自检程序
//  文件来源:《61板实验教程》"LED模组自检程序"
//  硬件连接: IOA低8位接至SEG接口控制LED的导通,IOA高8位接至1*8接口获取键盘的状态值
//             IOB低8位连至DIG通过ULN2003A控制8个LED的共阴极电平状态和数码管驱动
//             1*8KEY中ROW1直接连至gnd,2*4KEY中D_DP接高电平
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.0
//
//  涉及的库:
//  组成文件:
//    	main.c
//
//  日期:  2004/8/23
//===============================================
//*****************************************************************************/
// 文件名称: main.c
// 实现功能: 用C实现LED模组自检功能 
//            发光二极管循回点亮并数码管计数(LED巡回闪烁,同时数码管从左至右显示0~8,
//                                  全部显示完成后,LED停止闪烁,数码管全亮,之后全灭)
//            之后人为按8个按键,顺序自选,按键相对应的数码管将点亮,8次检测结束后,二极管全亮
//            以上功能完成说明LED模组功能完全正常
// 日期: 2004/8/23
//*****************************************************************************/
#define P_IOA_Data			(volatile unsigned int *)0x7000
#define P_IOA_Buffer		(volatile unsigned int *)0x7001
#define P_IOA_Dir			(volatile unsigned int *)0x7002
#define P_IOA_Attrib		(volatile unsigned int *)0x7003
#define P_IOB_Data			(volatile unsigned int *)0x7005
#define P_IOB_Buffer		(volatile unsigned int *)0x7006
#define P_IOB_Dir			(volatile unsigned int *)0x7007
#define P_IOB_Attrib		(volatile unsigned int *)0x7008
#define P_Watchdog_Clear 	(volatile unsigned int *)0x7012

#define KEY_ALL 0xff00		

int Led_Disp(unsigned int Led, unsigned int Loop);
unsigned int GetKey(void);
	                                                        //显示段码存放区
int DispTbl[10] = { 0x003F,0x0006,0x005B,0x004F,0x0066,		//0,1,2,3,4
			        0x006D,0x007D,0x0007,0x007F,0x00FF};	//5,6,7,8,全亮
	
unsigned int LedControl = 0x0001;     	
//============================================================= 
// 函数名称:    int main()  
// 日期:		20040823
// 功能描述:    LED键盘模组自检程序
// 语法格式:    int main() 
// 入口参数:    无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
int main()
{
	int Loop_Numb = 0x0000;        //循环次数
	int Led_Numb = 0x0000;         //显示数字个数	
	unsigned int Key = 0x0000;
	int  time = 0;
	int i=0;
		
    *P_IOA_Dir = 0x00ff;           //设置A口低8位为同向低输出,控制LED和数码管的显示状态
	*P_IOA_Attrib = 0x00ff;        //设置A口高8位为同向高输入,获取按键的状态值
	*P_IOA_Data = 0xff00;
    *P_IOB_Dir = 0x00ff;           //设置B0~B7口为同相低电平输出,LED和数码管的片选
	*P_IOB_Attrib = 0x00ff;
	*P_IOB_Data = 0x0000;
		
	for (Loop_Numb = 0; Loop_Numb < 6; Loop_Numb++)
	{
	      *P_IOB_Data = LedControl << Loop_Numb; //对应数码管显示0
	      *P_IOA_Data = DispTbl[0];    
	      Delay();
	      
	      for (Led_Numb = 0; Led_Numb<8; Led_Numb++)
	      {
	          Led_Disp(Led_Numb, Loop_Numb);     //点亮发光二极管并显示数字1~8	      
	      }
	}
	
	*P_IOB_Data = 0x00bf;                        //数码管全亮
	*P_IOA_Data = DispTbl[9]; 
	  
    Delay();
    
    *P_IOB_Data = 0x00bf;                        //数码管全灭
	*P_IOA_Data = 0x0000;   
    Delay();  
    
    *P_IOB_Data = 0x0040;                
    for(time = 0; time < 8; time++)              //按键点亮发光二极管
	{
	    Key = GetKey();                          //取键值
	    Key = Key >> 4;                          //取发光二极管显示值
	    Key = Key >> 4;                     
        *P_IOA_Data = Key;                       //发光二极管点亮并延时
        i++;
        Delay();
        Delay();
	}  

	*P_IOA_Data &= 0xff00;                       //发光二极管全灭
	Delay();
	*P_IOA_Data |= 0x00ff;                       //发光二极管全亮
	while(1)
	    Delay();
}

//============================================================= 
// 函数名称:    void Delay()  
// 日期:		20040819		
// 功能描述:    延时并清看门狗
//=============================================================
int Delay() 
{
    int DelayValue = 0;
    
    for (DelayValue = 0; DelayValue < 0x2000; DelayValue++)
        *P_Watchdog_Clear = 1;
}
//============================================================= 
// 函数名称:    void Led_Disp()  
// 日期:		20040819		
// 功能描述:    发光二极管循回点亮并数码管计数
// 入口参数:    Led 点亮的发光二极管号码,Loop 显示对应数字的数码管号码
//=============================================================
int Led_Disp(unsigned int Led, unsigned int Loop) 
{
	*P_IOB_Data = 0x0040;               //LED点亮
	*P_IOA_Data = LedControl << Led;    
	Delay();
	
	*P_IOB_Data = LedControl << Loop;   //对应数字显示在数码管上
	*P_IOA_Data = DispTbl[Led + 1];    
	Delay();
}

//============================================================= 
//	函数名称:   GetKey()
//	日期:		20040816
//	功能描述:	等待直到有键按下并抬起,返回键值,没有去抖处理
//	输入:		无
//	输出:		返回16位键值
//=============================================================
unsigned int GetKey(void)          //使用IOA8~IOA15作为键盘输入口
{
	unsigned KeyValue=0;

	//初始化IOA的相应端口为上拉输入
	*P_IOA_Dir &= ~KEY_ALL;
	*P_IOA_Attrib &= ~KEY_ALL;
	*P_IOA_Buffer |= KEY_ALL;
	
	//等待有键按下,即有端口变为0
	//while(!(((*P_IOA_Data) & KEY_ALL) ^ KEY_ALL))
	//{	
	//	*P_Watchdog_Clear=1;		//清看门狗
	//}
	
	while(KeyValue==0)
	{
		KeyValue=(*P_IOA_Data & KEY_ALL)^KEY_ALL;
		*P_Watchdog_Clear=1;
	}
	
	KeyValue = ((*P_IOA_Data) & KEY_ALL) ^ KEY_ALL;
	//等待按键抬起
	while(((*P_IOA_Data)&KEY_ALL)^KEY_ALL)
	{
		*P_Watchdog_Clear=1;
	}
	return KeyValue;
}
//============================================================= 
// main.c 结束
//=============================================================	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -