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

📄 main.c

📁 凌阳SPMC75F2413A的实现四位数码管显示的例子
💻 C
字号:
//================================================================================================
//Project Name: SPMC75F2413A EVM V1.2 
//              演示程序13-4X4矩阵键盘的识别,与12不同的是,A~F显示成10-16
//hardware: SPMC75F2413A EVM v1.2开发板
//Function Description:   4X4矩阵键盘按键,数码管显示相应的内容                
//Hardware Resources:   IOC0-7 IOB11-13 
//I/O Led Status:     
//Attention!     
//================================================================================================
//作者:陈元虎
//EMAIL:chenyuanhu2@163.com
//日期:2007年12月28日
//================================================================================================
//================================================================================================
//Note:  此程序做调试之用。
//================================================================================================


#include "Spmc75_regs.h" 
//定义寄存器的头文件
#include "unspmacro.h"
//定义中断开关等的头文件
#include "spmc_typedef.h"

#define SER P_IOB_Buffer->B.bit13
#define SRCLK P_IOB_Buffer->B.bit11
#define RCLK P_IOB_Buffer->B.bit12

#define Time_2mS 0x2ee0;
//================================================================================================
//系统变量声明(全局变量在此声明)
//================================================================================================
unsigned int PutKEY_Flag;//键盘按下标志
unsigned int TMR2_Count = 0;//计数标志
unsigned int KEY_Value;//键盘识别值
unsigned int LED_TAB[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA7,0xA1,0x86,0x8E};
//================================================================================================
//系统函数声明
//================================================================================================
void main()
{
  Disable_FIQ_IRQ();
  System_Init();
  INT_IRQ();
  while(1)
  {
  	
  }
}
//================================================================================================
//Name: void System_Init()
//================================================================================================
void System_Init()
{
	//TMR2定时器初始化
	TMR2_Init();
	//IOC0-3位行扫描。IOC4-7位列扫描
	P_IOC_Dir->W = 0x000f;
	P_IOC_Attrib->W = 0x000f;
	P_IOC_Data->W = 0x000f;//IOC0-3位同相输出,IOC4-7位下拉输入。
	//IOB
	P_IOB_Dir->W = 0x3800;
	P_IOB_Attrib->W = 0x3800;
	P_IOB_Data->W = 0x0000;
}
//================================================================================================
//Name: void TNR2_Init()
//================================================================================================
void TMR2_Init()
{
	P_TMR2_Ctrl->B.MODE = CB_TMR2_MODE_Normal; //P_TMR2_Ctrl Init
    P_TMR2_Ctrl->B.CCLS = CB_TMR2_CCLS_TPR;
    P_TMR2_Ctrl->B.CKEGS = CB_TMR2_CKEGS_Rising;
    P_TMR2_Ctrl->B.TMRPS = CB_TMR2_TMRPS_FCKdiv4;
    P_TMR2_TPR->W = Time_2mS;//Timer Period interrupt Enable
    P_TMR2_INT->B.TPRIE = CB_TMR2_TPRIE_Enable;
    P_TMR_Start->B.TMR2ST = CB_TMR_TMR2ST_Start; //Timer 2 RUN
}
//================================================================================================
//Name: usnigned int KEY_Scan()
//================================================================================================
unsigned int KEY_Scan()
{
	//扫描的原理是看列扫描的端口有没有哪个端口变成高电平了。	
	PutKEY_Flag = (P_IOC_Data->W) & 0x00f0;//如果IOC4-7哪个口变成高电平之后,与操作之后应该能
	                                     //能得到1,其他位是与0相与,不影响结果。 
	return PutKEY_Flag;                                     
}
//================================================================================================
//Name: unsined int KEY_Identify()
//================================================================================================
unsigned int KEY_Identify()
{
	//识别是哪个键按下
	unsigned int i; 
	P_IOC_Data->W = 0x0001;//从IOC0开始扫描
	for(i = 0; i < 4;i++)
	{
	  KEY_Value = P_IOC_Data->W & 0x00f0;
	  if(KEY_Value != 0)
	  {
	  	KEY_Value += P_IOC_Data->W & 0x000f;
	  }
	  else
	  P_IOC_Data->W <<= 1;
	}
	switch(KEY_Value)
	{
		case 0x11: KEY_Value = 1;
		           break;
		case 0x21: KEY_Value = 2;
		           break;
		case 0x41: KEY_Value = 3;
		           break;
		case 0x81: KEY_Value = 4;
		           break;
		case 0x12: KEY_Value = 5;
		           break;
		case 0x22: KEY_Value = 6;
		           break;
		case 0x42: KEY_Value = 7;
		           break;
		case 0x82: KEY_Value = 8;
		           break;
		case 0x14: KEY_Value = 9;
		           break;
		case 0x24: KEY_Value = 10;
		           break;
		case 0x44: KEY_Value = 11;
		           break;
		case 0x84: KEY_Value = 12;
		           break;
		case 0x18: KEY_Value = 13;
		           break;
		case 0x28: KEY_Value = 14;
		           break;
		case 0x48: KEY_Value = 15;
		           break;
		case 0x88: KEY_Value = 16;
		           break;
		default: KEY_Value = 0;
		         break;                                                                                                                      
	}
	return KEY_Value;
}
//=========================================================================================
//Name: void LED_Display(unsigned int code)
//=========================================================================================
void LED_Display(unsigned int code,unsigned int point_IE,unsigned int Choice)
{
	//code位数码管显示的数字,point_IE位小数点使能位,Choice是选择哪位数码管的选择位
   unsigned int i;
   unsigned int k;
   unsigned int SEG;//位码
   unsigned int Number;//Number是合成好后应发送的数据
   switch(Choice)
   {
   	//Choice的含义:1表示选择低位的数码管,及最左边的此时位码应该是1110
   	 case 1: SEG = 0x0e00;
   	         break;
   	 case 2: SEG = 0x0d00;
   	         break;
   	 case 3: SEG = 0x0b00;
   	         break;
   	 case 4:  SEG = 0x0700;
   	         break;
   	 default: break;                                
   }
   if(point_IE == 1)
   {
   	Number = (SEG + code)& 0xff7f;  
   }
   else Number = SEG + code;
   
   k = 0x0800;
   for(i = 0;i < 12 ;i++)
   {
   	if((Number&k) == 0)
   	{
   		SER = 0;
   		SRCLK = 1;
   		SRCLK = 0;
   	}
   	else
   	{
   		SER = 1;
   		SRCLK = 1;
   		SRCLK = 0;
   	}
   	k >>= 1;
   }
   RCLK = 1;
   RCLK = 0;
}
//================================================================================================
//ISR
//================================================================================================
//================================================================================================
//IRQ4
//================================================================================================
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
  if(P_TMR2_Status->B.TPRIF)
  {
    P_TMR2_Status->B.TPRIF = 1;//写1清除标志
  }
  KEY_Scan();//4*4键盘扫描看是否有键盘按下。
  if(PutKEY_Flag != 0 )
  {
  	TMR2_Count += 1;
  }
  if(TMR2_Count == 5)
  {
  	TMR2_Count = 0;
  	KEY_Identify();
  }
  if(KEY_Value > 9)
  {
  	KEY_Value -= 10;
  	while(KEY_Scan())
  	{
  		LED_Display(LED_TAB[1],0,3);
  	    LED_Display(LED_TAB[KEY_Value],0,4);
  	}
  }
  else 
  {
  	LED_Display(LED_TAB[KEY_Value],0,4);
  }
  P_IOC_Data->W = 0x000f;
}

⌨️ 快捷键说明

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