📄 main.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 + -