📄 system.c
字号:
#include "System.h"
//25ms定时器2计数值=0x10000-22.1184M/12/40
#define T2L_VAL 0x00
#define T2H_VAL 0x4C
unsigned char CheckKeyF=0; //键盘检测标志位
unsigned int counter=0; //T2计数器,25ms++
unsigned int Mycounter; //计数器,用于用户定时
unsigned char Myflag=0; //用户定时标志
//键盘数据结构
struct KeyStruct Key[8];
void delay(int n) //延时函数
{
int i=0;
while(i<n) i++;
}
#define XBARE 0x40 //ENABLE XBR, set XBR2.6 = 1
//配置交叉开关和I/O口
void PORT_INIT()
{
SFRPAGE = CONFIG_PAGE;
/* XBR0 control follow digital utils
uart0:xbr0.2->p0.0,p0.1
spi0:xbr0.1->p0.2,p0.3,p0.4,(p0.5)
smb0:xbr0.0->p0.6,p0.7
*/
XBR0 = 0x07;
/*XBR2 control follows
UART1:xbr2.2->p1.0,p1.1
*/
XBR2 = 0x4;
// set P1MDIN.2 to ADC2-in, skip p1.2 pin
P1MDIN = 0xFB;
/*XBR1 control follows
T0:XBR1.1->p1.3
INT0:XBR1.2->p1.4
*/
XBR1 = 0x06;
//for test
// P1MDOUT |= 0x10;
// XBR1 |= 0x82; //XBR1.7:sysclk->p1.4
//ENABLE switch
XBR2 |= XBARE;
P5MDOUT|=0x0F; //LCD控制信号
P6MDOUT|=0xFF; //LCD数据信号
P7MDOUT|=0x13; //背光,RES,HC157控制
P3MDOUT|=0x04; //KEY_EN
}
//系统时钟初始化
void SYSCLK_INIT() //使用外部晶阵22.1184M
{
SFRPAGE = CONFIG_PAGE;
OSCXCN |=0x67; //使能外部晶阵
while((OSCXCN & 0x80)==0) //延时,直至外部晶阵就绪
delay(100);
CLKSEL |=0x01; //切换到外部时钟
}
void Timer2_INIT() //16位自动重装模式,产成25ms中断
{
SFRPAGE = TMR2_PAGE;
TMR2L=T2L_VAL; //赋值
TMR2H=T2H_VAL;
RCAP2L=T2L_VAL;
RCAP2H=T2H_VAL;
TMR2CF |=0x01; //SYSCLK/12作为T2输入,向上计数
TMR2CN &=0xf4; //T2工作模式: 自动重装,计时器,忽略T2EX信号
ET2=1;
TR2=1;
}
void Timer2_ISR() interrupt 5 //T2 25ms中断
{
TF2=0;
counter++;
CheckKeyF=1; //键盘检测
if(Mycounter==counter)
Myflag=1; //用户定时到,置位
}
void CheckKey() //键盘检测.要求每次按键时间超过100ms;持续按键以每秒4次计算
{
unsigned char data i;
unsigned char data M=1;
SFRPAGE = CONFIG_PAGE;
OE=1; //关闭并口
Key_En=0; //使能键盘
P6MDOUT=0x00; //配置P6为数字输入 (数字输入=漏极开路+SFR写1)
P6=0xff;
delay(5);
for(i=0;i<8;i++) //依次检测各键
{
if((P6&M)==0) //当前第i位为0
{
if(Key[i].pressold==0) //前一次为0
{
Key[i].pressing++;
if(Key[i].pressing==4) Key[i].pressed=1;
if(Key[i].pressing==10) Key[i].pressing=0; //持续按键以每秒4次计算
}
else //前一次为1
{
Key[i].pressing=1;
}
Key[i].pressold=0;
}
else //当前第i位为1
{
if(Key[i].pressold==0) //前一次为0
{
Key[i].pressing=0;
}
else //前一次为1
{
}
Key[i].pressold=1;
}
M=M<<1;
}
CheckKeyF=0;
Key_En=1;
P6MDOUT=0xff; //P6置回输出状态
}
void Key_INIT()
{
int i;
for(i=0;i<8;i++)
{
Key[i].pressed=0;
Key[i].pressold=1;
Key[i].pressing=0;
}
}
void ClearKey()
{
int i;
for(i=0;i<8;i++)
{
Key[i].pressed=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -