📄 rem_main.c
字号:
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /***************************/
Delay_us(5); /* 第9个时钟产生NO ACK信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /***************************/
Delay_us(5);
EDIS;
}
if((m & 1)==0) *p=reg*256; /* 接收的数据存入表的高8位 */
else *p=*p+reg,p++; /* 接收的数据存入表的低8位 */
}
*GPFDAT=*GPFDAT & 0xFFBF; /* 即SDA输出0 */ /**************************/
Delay_us(5); /* 第10个时钟产生STOP信号 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /**************************/
Delay_us(5);
*GPFDAT=*GPFDAT | 0x40; /* 即SDA输出1 */
}
/**** Write EEPROM Function ****/
void Write_eeprom(unsigned int x,unsigned int y,unsigned int z) /* 该函数用于将table[z]起始的数据存入以起始地址为x的,长度为y的EEPROM存储块中 */
{ unsigned int shift,device_address;
int n;
int *p=&table[z];
device_address=0xA0; /* 第0位为0,表示写 */
shift=0x80;
*GPFDAT=*GPFDAT & 0xFFBF; /* 设置24C08的SDA脚为低电平 */ /*****************/
Delay_us(5); /* 产生START信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /*****************/
Delay_us(5);
for(n=7;n>=0;n--) /* 发送device_address */
{if((device_address & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* GPIO F9,即DAT输出0 */
else *GPFDAT=*GPFDAT | 0x40; /* GPIO F9,即DAT输出1 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /*******************/
Delay_us(5); /* 产生CLK时钟信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /*******************/
Delay_us(5);
shift=shift/2; /* 即使移位控制位右移1位 */
}
EALLOW; /* 允许访问 EALLOW 保护区域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 设置DSP的I/O脚为输入,准备接收ACK信号 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /************************/
Delay_us(5); /* 第9个时钟产生ACK信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /************************/
Delay_us(5);
*GPFDIR=*GPFDIR | 0x40; /* 设置DSP的I/O脚为输出 */
EDIS;
shift=0x80;
for(n=7;n>=0;n--) /* 发送word_address */
{if((x & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* GPIO F9,即DAT输出0 */
else *GPFDAT=*GPFDAT | 0x40; /* GPIO F9,即DAT输出1 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /*******************/
Delay_us(5); /* 产生CLK时钟信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /*******************/
Delay_us(5);
shift=shift/2; /* 即使移位控制位右移1位 */
}
EALLOW; /* 允许访问 EALLOW 保护区域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 设置DSP的I/O脚为输入,准备接收ACK信号 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /************************/
Delay_us(5); /* 第9个时钟产生ACK信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /************************/
Delay_us(5);
*GPFDIR=*GPFDIR | 0x40; /* 设置DSP的I/O脚为输出 */
EDIS;
for(;y>0;y--)
{if((y & 1)==0)
{shift=0x8000;
for(n=7;n>=0;n--) /* 发送DATA */
{if((*p & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* SDA输出0 */
else *GPFDAT=*GPFDAT | 0x40; /* SDA输出1 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /*******************/
Delay_us(5); /* 产生CLK时钟信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /*******************/
Delay_us(5);
shift=shift/2; /* 即使移位控制位右移1位 */
}
EALLOW; /* 允许访问 EALLOW 保护区域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 设置DSP的I/O脚为输入,准备接收ACK信号 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /************************/
Delay_us(5); /* 第9个时钟产生ACK信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /************************/
Delay_us(5);
*GPFDIR=*GPFDIR | 0x40; /* 设置DSP的I/O脚为输出 */
EDIS;
}
else
{shift=0x80;
for(n=7;n>=0;n--) /* 发送DATA */
{if((*p++ & shift)==0)
*GPFDAT=*GPFDAT & 0xFFBF; /* SDA输出0 */
else *GPFDAT=*GPFDAT | 0x40; /* SDA输出1 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /*******************/
Delay_us(5); /* 产生CLK时钟信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /*******************/
Delay_us(5);
shift=shift/2; /* 即使移位控制位右移1位 */
}
EALLOW; /* 允许访问 EALLOW 保护区域 */
*GPFDIR=*GPFDIR & 0xFFBF; /* 设置DSP的I/O脚为输入,准备接收ACK信号 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /************************/
Delay_us(5); /* 第9个时钟产生ACK信号 */
*GPFDAT=*GPFDAT & 0xFF7F; /* 设置24C08的SCL脚为低电平 */ /************************/
Delay_us(5);
*GPFDIR=*GPFDIR | 0x40; /* 设置DSP的I/O脚为输出 */
EDIS;
}
}
*GPFDAT=*GPFDAT & 0xFFBF; /* 即SDA输出0 */ /**************************/
Delay_us(5); /* 第10个时钟产生STOP信号 */
*GPFDAT=*GPFDAT | 0x80; /* 设置24C08的SCL脚为高电平 */ /**************************/
Delay_us(5);
*GPFDAT=*GPFDAT | 0x40; /* 即SDA输出1 */
}
/**** Setup System Function ****/
void Set_system(void)
{ asm(" SETC INTM"); /* 关闭所有可屏蔽中断 */
Vector_Table_Copy(); /* 将中断向量表拷贝进PIE向量区 */
EALLOW; /* 允许访问 EALLOW 保护区域 */
*PCLKCR=0x40;
*SCSR=0x03;
*PLLCR=0xA; /* OSCCLK=25M,CLKIN=SYSCLKOUT=(OSCCLK×10)/2=125M *//* OSCCLK=30M,CLKIN=SYSCLKOUT=(OSCCLK×10)/2=150M */
*GPFMUX=0x0; /* 设置GPIO F为数字IO口 */
*GPFDIR=0x7FFF; /* 设置GPIO F为输出口,GPIO F6是24C08的SDA脚,F7是24C08的SCL脚,GPIO F8是HD7279A的CLK,GPIO F9是DAT,GPIO F10,F11,F12,F13是CS */
*GPFDAT=*GPFDAT | 0xFFFF; /* 设置GPIO F输出高电平 */
*HISPCP=0x04;
// Section secureRamFuncs contains user defined code that runs from CSM secured RAM
memcpy(&secureRamFuncs_runstart,
&secureRamFuncs_loadstart,
&secureRamFuncs_loadend - &secureRamFuncs_loadstart);
// Initialize the FLASH
Flash_Reg_Modify();
// *FOPT=0x1; /* Flash流水线模式激活 */ /******************************************/
// *FSTDBYWAIT=0x1FF; /* 设置Flash从休眠到待机等待1个SYSCLKOUT周期 */ /* 对Flash寄存器的设置不能在Flash内部运行 */
// *FACTIVEWAIT=0x1FF; /* 设置Flash从待机到激活等待1个SYSCLKOUT周期 */ /* 而应该装载在Flash中,在RAM中运行!!!!!!! */
// *FBANKWAIT=*FBANKWAIT | 0x0505; /* 设置Flash页读等待1个SYSCLKOUT周期,随机读操作等待1个SYSCLKOUT周期 */ /******************************************/
*TIMER0TCR=0x8030; /* 定时器0停止,中断不使能,清中断标志 */
*TIMER0TPR=0; /* 定时器0预定标计数器设置为0,即使定时器0的时钟源周期=SYSCLKOUT */
*TIMER0TPRH=0;
*TIMER0PRD=TIMER0L; /* 将定时器0的定时周期值赋给定时器0定时周期寄存器 */
*TIMER0PRDH=TIMER0H; /* 定时时间为100us */
*TIMER0TCR=0xC020; /* 将定时周期值装入,启动计数器计数,清中断标志,使能定时器0中断 */
*PIEACK=0x0FFF;
*PIEIFR1=0x0; /* 清PIE组1中断标志寄存器 */
*PIEIER1=0x40; /* 使能定时器0中断对应的PIE中断 */
*PIECTRL=0x01; /* 使能PIE向量 */
asm(" OR IER,#0x01"); /* 使能CPU级中断的INT1 */
asm(" AND IFR,#0x0"); /* 清CPU级中断的INT1 */
asm(" CLRC INTM"); /* 开所有可屏蔽中断 */
Read_eeprom();
msec=0;
programcyc=0;
t0int_flag=0;
keyin_tf=0;
led_bit=0;
az_object=1111110;
el_object=111110;
all_R0=0;
all_R1=0;
EDIS; /* 禁止访问 EALLOW 保护区域 */
}
/**** Check Key Input Function ****/
int Key_in(void) /* 该函数用来与HD7279A通信,求按键的键值 */
{ unsigned int readkey,shift; /* readkey是读键缓存,shift是移位控制 */
int n;
readkey=0x15; /* 读键指令存入 */
shift=0x80; /* 移位控制初值存入,指向发送命令最高位 */
key_flag=key_flag+1; /* 按键计数标志寄存器计数 */
*GPFDAT=*GPFDAT & 0xFAFF; /* 设置CS和CLK为低电平 */
Delay_us(25); /* 延时25us */
for(n=7;n>=0;n--) /* 向HD7279A发送读键命令开始 */
{if((readkey & shift)==0)
*GPFDAT=*GPFDAT & 0xFDFF; /* GPIO F9,即DAT输出0 */
else *GPFDAT=*GPFDAT | 0x200; /* GPIO F9,即DAT输出1 */
*GPFDAT=*GPFDAT | 0x100; /* GPIO F8,即CLK输出高电平 */
Delay_us(5); /* 延时5us */
*GPFDAT=*GPFDAT & 0xFEFF; /* GPIO F8,即CLK输出低电平 */
Delay_us(5); /* 延时5us,这4条指令用以产生传送读键命令所需的CLK */
shift=shift/2; /* 即使移位控制位右移1位 */
} /* 向HD7279A发送读键命令结束,下面准备接收键值 */
EALLOW; /* 允许访问 EALLOW 保护区域 */
*GPFDIR=*GPFDIR & 0xFDFF; /* 改变GPIO F9脚即DAT脚为输入,准备接收键值 */
EDIS;
Delay_us(15); /* 延时15us */
readkey=0;
for(n=7;n>=0;n--)
{*GPFDAT=*GPFDAT | 0x100; /* GPIO F8,即CLK输出高电平 */
Delay_us(5); /* 延时5us */
readkey=readkey*2; /* 即使readkey每次循环左移1位 */
if((*GPFDAT & 0x0200)>0)
readkey=readkey+1; /* 将收到的键值按位存入readkey */
*GPFDAT=*GPFDAT & 0xFEFF; /* GPIO F8,即CLK输出低电平 */
Delay_us(5); /* 延时5us */
}
EALLOW;
*GPFDIR=*GPFDIR | 0x200; /* 改变GPIO F9脚即DAT脚为输出 */
*GPFDAT=*GPFDAT | 0x400; /* 改变GPIO F10脚即CS脚为高电平,结束读键 */
EDIS;
if(readkey==0x0FF)
key_flag=0; /* 如readkey=0x0FF,说明无键按下,按键计数标志寄存器清0 */
else
{readkey=readkey & 0x7; /* 说明有键按下,将键值修正为0~7的整数 */
if((key_flag & 0x8000)==0) /* 判断该键是否第1次按下 */
key_flag=0x8000; /* 该键第1次按下,标记该键已按下1次 */
else
{if((key_flag & 0x4000)==0) /* 该键已按下1次,判断该键是否连续按下2次以上 */
{n=key_flag & 0x3FFF;
if(n<50) readkey=0x0FF; /* 该键连续第1次和第2次按下的间隔小于500ms,则这次按下按键无效 */
else key_flag=0xC000; /* 标记该
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -