#include <SPCE061V004.h>
#include "hardware.h"
# define uchar unsigned char
# define uint unsigned int
void LCD_write_command(uchar command);//寫指令函數(shù)
void LCD_write_data(uchar dat);//寫數(shù)據(jù)函數(shù)
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某個屏幕位置上顯示一個字符,X(0-16),y(1-2)
void delay_n40us(uint n);//延時函數(shù)
unsigned char Key,fg1;
unsigned int fg2;
//
uchar DISP1[]={"TJPU Tongxin064 "};
uchar DISP2[]={" Gou Jinxing "};
uchar mode1[]={" In Short Mode"};
uchar mode2[]={" In Long Mode "};
uchar TIMER[]={" RUNTIME ERROR! "};
/
void LCD_write_command(uchar dat)
{uint k;
*P_IOA_Dir=0xfff0;
delay_n40us(2);
*P_IOA_Attrib=0xffff;
delay_n40us(2);
k=(uint)(dat<<8);
k=k&0xff00;
k=k|0x0020;
*P_IOA_Data=k;
k=k&0xff1f;
*P_IOA_Data=k;
delay_n40us(2);
}
//********寫數(shù)據(jù)函數(shù)*************
void LCD_write_data(uchar dat)
{uint k=0;
*P_IOA_Dir=0xfff0;
delay_n40us(2);
*P_IOA_Attrib=0xffff;
delay_n40us(2);
k=(uint)(dat<<8);
k=k&0xff00;
k=k|0x00a0;
*P_IOA_Data=k;
k=k&0xff8f;
*P_IOA_Data=k;
delay_n40us(2);
}
void LCD_init(void)
{
delay_n40us(37);
LCD_write_command(0x38);//設置8位格式,2行,5x7
delay_n40us(12);
LCD_write_command(0x38);//設置8位格式,2行,5x7
delay_n40us(12);
LCD_write_command(0x38);//設置8位格式,2行,5x7
LCD_write_command(0x0f);//整體顯示,關光標,不閃爍
LCD_write_command(0x06);//設定輸入方式,增量不移位
LCD_write_command(0x01);//清除屏幕顯示
delay_n40us(10);
}
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
address=(y<2)?(0x80+x):(0xC0+x);
LCD_write_command(address);
delay_n40us(20);//
if(dat>=0&&dat<10)
dat=dat+48;
LCD_write_data(dat);
delay_n40us(20);
}
//********************************
void IRQ3(void)
{ uint j;
float k;
uchar i,flag[]={" Successfully "},rst[16];
__asm("INT OFF");
*P_INT_Clear=0x2100;
*P_INT_Ctrl=*P_INT_Mask&(0x0000); //屏蔽定時器中斷
*P_TimerB_Ctrl=0x0006; //stop timer B;
LCD_write_command(0x01);
j=*P_TimerB_Data;
k=j*0.0097+8;
j=(uint)(k);
rst[0]=j/10000; //65536
rst[1]=j/1000%10;
rst[2]=j/100%10;
rst[3]=j/10%10;
rst[4]='.';
rst[5]=j%10;
rst[6]='c';
rst[7]='m';
rst[8]='T';
rst[9]='o';
rst[10]='n';
rst[11]='g';
rst[12]='x';
rst[13]='i';
rst[14]='n';
*P_TimerB_Data=0x0000;
for(i=0;i<15;i++)
LCD_disp_char(i,1,rst[i]),
LCD_disp_char(i,2,flag[i]);
delay(55500);
}
void FIQ(void)
{ uchar l;
__asm("INT OFF");
for(l=0;l<15;l++)
LCD_disp_char(l,1,TIMER[l]);
delay(1000);
*P_INT_Clear=0x0900;
}
void measure(uchar n)
{uint temp;
__asm("INT OFF");
*P_TimerB_Ctrl=0x0006; //stop timer B;
temp=*P_IOA_Buffer;
temp=temp|0x0010; //P—IOA4口輸出脈沖;
*P_SystemClock=0x004d; //32.768M,強震,32分頻,1us,1MHz
*P_INT_Mask=0x0000;
while(n--)
{*P_IOA_Data=temp;
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");
*P_IOA_Data=temp&0xffef;
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");__asm("nop");
__asm("nop");
}
delay_n40us(fg2);
*P_SystemClock=0x005c; //32.768/16=2.048MHz;
*P_TimerB_Data=0x0000; //count from zero,flow when full;
*P_TimerB_Ctrl=0x0030; //fosc/2;
*P_INT_Mask=0x0900; //Right ,interrupt mode on ,2100,for timerB
__asm("INT FIQ,IRQ"); //
delay(55000);
}
uchar Getkey(void)
{uint k0,k1,k;
*P_IOA_Dir=0xfff0;
*P_IOA_Attrib=0xffff;
k0=*P_IOA_Data;
delay(1);
k1=*P_IOA_Data;
if(k0==k1)
{ k0=k0&0x0007;
switch(k0)
{ case 1:k=1;
break;
case 2:k=2;
break;
case 4:k=3;
break;
default:k=0;break;}
return(k);}
}
int main()
{ uchar m;
for(m=0;m<15;m++)
LCD_disp_char(m,1,DISP1[m]),
LCD_disp_char(m,2,DISP2[m]);
while(1)
{ Key = Getkey(); //獲取鍵值
switch(Key)
{ case 1: LCD_init();measure(fg1); //KEY1:Start to measure
break;
case 2: // KEY2: Short mode
fg1=1;
fg2=1;
for(m=0;m<15;m++)
LCD_disp_char(m,1,mode1[m]);
delay(55000);
break;
case 3: //KEY3: Long mode
for(m=0;m<15;m++)
LCD_disp_char(m,1,mode2[m]);
delay(55000);
fg1=12;
fg2=50000;
measure(12);
break;
default:
break;
}
}
}