?? 設(shè)計(jì)最后._c
字號(hào):
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
x1+=incx;
}
if( yerr > distance )
{
yerr-=distance;
y1+=incy;
}
}
}
void datechuli(void)
{write_ASCII(0xf9,4,32,61);//=
write_ASCII(0xf9,6,32,table1[rezult/1000000000]);
write_ASCII(0xf9,7,32,table1[rezult%1000000000/100000000]);
write_ASCII(0xf9,8,32,table1[rezult%100000000/10000000]);
write_ASCII(0xf9,9,32,table1[rezult%10000000/1000000]);
write_ASCII(0xf9,10,32,table1[rezult%1000000/100000]);
write_ASCII(0xf9,11,32,table1[rezult%100000/10000]);
write_ASCII(0xf9,12,32,table1[rezult%10000/1000]);
write_ASCII(0xf9,13,32,table1[rezult%1000/100]);
write_ASCII(0xf9,14,32,table1[rezult%100/10]);
write_ASCII(0xf9,15,32,table1[rezult%10]);
}
//*********************************************************//
/*PS2鍵盤(pán)中斷處理*/
//******************************************************** //
#pragma interrupt_handler PS2_KEY:6
void PS2_KEY(void)
{
if((count_jiema>0)&&(count_jiema<9))
{
data=data>>1;
if(PINE&DATA1)
data|=0x80;
}
count_jiema++;
while(!(PINE&0X10)); //
if(count_jiema>10)
{
// putchar0(data);//測(cè)試鍵盤(pán)碼用
count_jiema=0;
flag=1;
EIMSK=0x00;
}
}
//*********************************************************//
/*譯碼*/
//******************************************************** //
void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說(shuō)shift的通碼+G的通碼+shift的斷碼+G的斷碼
{
unsigned char TempCyc;
if (!Key_UP) //
{
switch (ScanCode)
{
case 0xF0 : // 當(dāng)收到0xF0,Key_UP置1表示斷碼開(kāi)始,把Shift = 1;解鎖。否則下次總是顯示大寫(xiě)字母
Key_UP = 1;
break;
case 0x12 : // 左 SHIFT
Shift = 1;
break;
case 0x58 : Shift=~Shift;break;
case 0x59 : // 右 SHIFT
Shift = 1;
break;
case 0x66 : //DEL鍵
if (DisNumx==-1)
{
DisNumy=DisNumy-8;
DisNumx=15;
}
else
{
write_asiic(DisNumx, DisNumy, UnShifted[40][1]);
DisNumx--;
}
break;
default:
if (DisNumx > 15)
{
DisNumy=DisNumy+8;
if( DisNumy==64)DisNumy=0;
DisplayListChar(0, DisNumy);//清LCD第二行
DisNumx=0;
}
if(!Shift) //如果SHIFT沒(méi)按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<71); TempCyc++); //查表顯示
if (UnShifted[TempCyc][0] == ScanCode)
{ write_asiic(DisNumx, DisNumy, UnShifted[TempCyc][1]);
DisNumx++;
if((ScanCode==0x70)||(ScanCode==0x69)||(ScanCode==0x72)||(ScanCode==0x7A)||(ScanCode==0x6B)||
(ScanCode==0x73)||(ScanCode==0x74)||(ScanCode==0x6C)||(ScanCode==0x75)||(ScanCode==0x7D))
{DisNumx1++;
switch(ScanCode)
{
case 0x70: keytemp=0;break;//小鍵盤(pán)
case 0x69: keytemp=1;break;
case 0x72: keytemp=2;break;
case 0x7A: keytemp=3;break;
case 0x6B: keytemp=4;break;
case 0x73: keytemp=5;break;
case 0x74: keytemp=6;break;
case 0x6C: keytemp=7;break;
case 0x75: keytemp=8;break;
case 0x7D: keytemp=9;break;
default:break;
}
switch(DisNumx1)
{
case 1:value=keytemp;break;
case 2:value=value*10+keytemp;break;
case 3:value=value*10+keytemp;break;
case 4:value=value*10+keytemp;break;
case 5:value=value*10+keytemp;break;
case 6:value=value*10+keytemp;break;
case 7:value=value*10+keytemp;break;
case 8:value=value*10+keytemp;break;
default:break;
}
}
if(ScanCode==0x79)//+
{
valuefirst=value;value=0;
flag_add=1;DisNumx1=0;
}
if(ScanCode==0x7B)//-
{
valuefirst=value;value=0;
flag_sub=1;DisNumx1=0;
}
if(ScanCode==0x7c)//*
{
valuefirst=value;value=0;
flag_mul=1;DisNumx1=0;
}
if(ScanCode==0x4a)///
{
valuefirst=value;value=0;
flag_mod=1;DisNumx1=0;
}
if(ScanCode==0x5a)//enter
{
if(flag_add==1)
{
rezult=valuefirst+value;DisNumx1=0;
flag_add=0;
datechuli();
}
if(flag_sub==1)
{
rezult=valuefirst-value;DisNumx1=0;
flag_sub=0;
datechuli();
}
if(flag_mul==1)
{
rezult=valuefirst*value;DisNumx1=0;
flag_mul=0;
datechuli();
}
if(flag_mod==1)
{
rezult=(float)valuefirst/value;DisNumx1=0;
flag_mod=0;
datechuli();
}
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (Shifted[TempCyc][0] == ScanCode)
{ write_asiic(DisNumx, DisNumy, Shifted[TempCyc][1]);
DisNumx++;
}
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //當(dāng)鍵松開(kāi)時(shí)不處理斷碼,SHIFT+G為12H 34H F0H 34H F0H 12H,按下(12H 34H),松開(kāi)(F0H 34H F0H 12H)
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
flag = 0; //標(biāo)識(shí)字符處理完了
}
//**************************************************//
/*初始化****/
//**************************************************//
void initial_Exinterup(void)
{
DDRE&=~BIT(4);
DDRE&=~BIT(5);//輸入
PORTE|=BIT(4);
PORTE|=BIT(5);//都置高
MCUCR=0X00;
EICRB=0X00;
EIMSK=0X10; //INT4標(biāo)志
}
/*********************計(jì)算機(jī)通訊***********************/
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8bit+1bit stop
UBRR0L=(fosc/16/(BAUD+1))%256;
UBRR0H=(fosc/16/(BAUD+1))/256;
UCSR0B =(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//RXCEN TXCEN
}
void putchar0(unsigned char c)
{
UDR0=c;
while (!(UCSR0A&(1<<UDRE0)));
}
void puts0(char *s)
{
while (*s)
{
putchar0(*s);
s++;
}
putchar0(0x0a);
putchar0(0x0d);
}
unsigned char getchar0(void)
{
while(!(UCSR0A& (1<<RXC0)));
return UDR0;
}
void delay_us(int time)
{
do
{
time--;
}
while (time>1);
}
void delay_ms(unsigned int time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
/********************計(jì)算機(jī)通訊*********************/
void Incomm(void)
{
puts0("Hello!It is my first expriment.If there is some error,please tell me,And I will do better!");
delay_nms(20);
}
/**************主函數(shù)**********************************/
void main(void)
{
uart0_init();//串口初始化
timer0_init();//T0初始
initail_ocmj();
ocmj_write(0xf4);
initial_Exinterup();
TIMSK=0X01;
SREG|=0X80;
while(1)
{
initial_Exinterup();
hz_tran(1,0,"電子計(jì)算器");
hz_tran(0,1,"開(kāi)發(fā)者");
write_ASCII(0xf9,9,16,58);//:
hz_tran(4,1,"李");
hz_tran(6,1,"偉");
hz_tran(1,2,"潘良才");
hz_tran(5,2,"陳杰彪");
write_ASCII(0xf9,4,16,49);//E
write_ASCII(0xf9,5,16,46);//N
write_ASCII(0xf9,4,32,50);//T
write_ASCII(0xf9,5,32,46);//E
write_ASCII(0xf9,4,48,51);//R
hz_tran(6,3,"進(jìn)入");
write_ASCII(0xf9,4,16,49);//1
write_ASCII(0xf9,5,16,46);//.
write_ASCII(0xf9,4,32,50);//2
write_ASCII(0xf9,5,32,46);//.
write_ASCII(0xf9,4,48,51);//3
write_ASCII(0xf9,5,48,46);//.
hz_tran(3,0,"主菜單");
hz_tran(1,1,"電子時(shí)鐘");
hz_tran(1,2,"電子計(jì)算器");
hz_tran(1,3,"電壓采集");
switch(data)
{
case 0x16:
case 0x69: flag_time=1; break;
case 0x1E:
case 0x72: flag_computer=1;ocmj_write(0xf4);flag=0;break;
case 0x7A: flag_test_v=1 ; ocmj_write(0xf4);break;
default:break;
}
/**********************************************/
/*電子時(shí)鐘*/
/***********************************************/
if(flag_time)
{
ocmj_write(0xf4);
for(;;)
{
EIMSK=0X10;
flag=0;//打開(kāi)外部中斷
time();
if(data==0x76) {ocmj_write(0xf4);flag_time=0;break;}
if(data==0x05)
{ocmj_write(0xf4);
for(;;)
{
EIMSK=0X10;
flag=0;//打開(kāi)外部中斷
instruction();//說(shuō)明書(shū)
if(data==0x76) {ocmj_write(0xf4);break;}
}
}
}
}
/**********************************************/
/*電子計(jì)算器*/
/***********************************************/
if(flag_computer)
{
ocmj_write(0xf4);
for(;;)
{
if (flag)
{
Decode(data);
}
else
{EIMSK=0X10; }//開(kāi)中斷
if(data==0x76) {ocmj_write(0xf4);flag_computer=0;rezult=0;DisNumx=0;DisNumy=0;break;}
}
}
/**********************************************/
/*計(jì)算機(jī)串口通訊*/
/***********************************************/
if(flag_test_v)//
{
ocmj_write(0xf4);
for(;;)
{
EIMSK=0X10;
flag=0;
Incomm();
if(data==0x76) {ocmj_write(0xf4);flag_test_v=0;break;}
}
}
} //while(1)對(duì)應(yīng)
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -