?? 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時鐘信號 */
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 + -