📄 设计最后.c
字号:
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键盘中断处理*/
//******************************************************** //
#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);//测试键盘码用
count_jiema=0;
flag=1;
EIMSK=0x00;
}
}
//*********************************************************//
/*译码*/
//******************************************************** //
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
unsigned char TempCyc;
if (!Key_UP) //
{
switch (ScanCode)
{
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始,把Shift = 1;解锁。否则下次总是显示大写字母
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没按下
{
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;//小键盘
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) //当键松开时不处理断码,SHIFT+G为12H 34H F0H 34H F0H 12H,按下(12H 34H),松开(F0H 34H F0H 12H)
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
flag = 0; //标识字符处理完了
}
//**************************************************//
/*初始化****/
//**************************************************//
void initial_Exinterup(void)
{
DDRE&=~BIT(4);
DDRE&=~BIT(5);//输入
PORTE|=BIT(4);
PORTE|=BIT(5);//都置高
MCUCR=0X00;
EICRB=0X00;
EIMSK=0X10; //INT4标志
}
/*********************计算机通讯***********************/
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--;
}
}
/********************计算机通讯*********************/
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);
}
/**************主函数**********************************/
void main(void)
{
uart0_init();//串口初始化
timer0_init();//T0初始
initail_ocmj();
ocmj_write(0xf4);
initial_Exinterup();
TIMSK=0X01;
SREG|=0X80;
initial_Exinterup();
hz_tran(1,0,"电子计算器");
hz_tran(0,1,"开发者");
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,12,48,69);//E
write_ASCII(0xf9,13,48,110);//N
write_ASCII(0xf9,14,48,116);//T
write_ASCII(0xf9,15,48,101);//E
write_ASCII(0xf9,16,48,114);//R
hz_tran(6,3,"进入");
while(1)
{
if(data==0x5a)
{
ocmj_write(0xf4);
hz_tran(0,0,"请输入密码");
write_ASCII(0xf9,9,14,58);//:
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,"电子时钟");
hz_tran(1,2,"电子计算器");
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;
}
/**********************************************/
/*电子时钟*/
/***********************************************/
if(flag_time)
{
ocmj_write(0xf4);
for(;;)
{
EIMSK=0X10;
flag=0;//打开外部中断
time();
if(data==0x76) {ocmj_write(0xf4);flag_time=0;break;}
if(data==0x05)
{ocmj_write(0xf4);
for(;;)
{
EIMSK=0X10;
flag=0;//打开外部中断
instruction();//说明书
if(data==0x76) {ocmj_write(0xf4);break;}
}
}
}
}
/**********************************************/
/*电子计算器*/
/***********************************************/
if(flag_computer)
{
ocmj_write(0xf4);
for(;;)
{
if (flag)
{
Decode(data);
}
else
{EIMSK=0X10; }//开中断
if(data==0x76) {ocmj_write(0xf4);flag_computer=0;rezult=0;DisNumx=0;DisNumy=0;break;}
}
}
/**********************************************/
/*计算机串口通讯*/
/***********************************************/
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)对应
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -