📄 课程设计.c
字号:
ocmj_write(y1);
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
x1+=incx;
}
if( yerr > distance )
{
yerr-=distance;
y1+=incy;
}
}
}
/**********************************************/
/* 键盘子程序 */
/**********************************************/
unsigned char scan_key(void)
{
unsigned char i;
DDRB=0x0f; //列接低位,输出
PORTB=0xff;
for(i=0;i<4;i++)
{
PORTB=~(1<<i); //键盘线扫描
delay_ms(20); //等待低电平稳定
temp1=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
if (temp1!=0xf0)//如果有键按下,延时10ms消抖
{ //本程序用display代替10ms延时,
delay_ms(30); //可消除显示抖动
temp1=PINB&0xf0;//再读键盘
if (temp1!=0xf0)
{
temp1&=0xf0;
switch(temp1) //计算键值
{
case 0x70:temp1=15-(3-i)*4;break;
case 0xb0:temp1=14-(3-i)*4;break;
case 0xd0:temp1=13-(3-i)*4;break;
case 0xe0:temp1=12-(3-i)*4;break;
default:break;
}
return temp1;
}
}
}
return 0x00;//无键按下
}
/**********************************************/
/*查键盘*/
/**********************************************/
unsigned char ks(void)
{
unsigned char m,n;
DDRB=0x0f;
PORTB=0xff;
for(n=0;n<4;n++)
{
PORTB=~(1<<n);
delay_ms(10);
m=PINB&0xf0;
if(m!=0xf0)
return 0xff;
}
return 0x00;
}
//*********************************************************//
//******************************************************** //
#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++;
}
}
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 computer(void)
{
if((scan_key()<=9)&&(scan_key()>=0))
{
write_ASCII(0xf9,jy,16,table1[scan_key()]);
jy++;
//count_comp++;
putchar0(jy);
/* switch(jy)
{
case 1:value=scan_key();break;
case 2:value=scan_key()*10+scan_key();break;
case 3:value=scan_key()*10+scan_key();break;
case 4:value=scan_key()*10+scan_key();break;
case 5:value=scan_key()*10+scan_key();break;
case 6:value=scan_key()*10+scan_key();break;
case 7:value=scan_key()*10+scan_key();break;
case 8:value=scan_key()*10+scan_key();break;
default:break;
}*/
}
if(scan_key()==10)//A
{valuefirst=value;value=0;flag_add=1;count_comp=0;jy=0;ocmj_write(0xf4);} //'+',
if((ks()==0xff)&&(scan_key()==11))//B
{valuefirst=value;value=0;flag_sub=1;count_comp=0;jy=0;ocmj_write(0xf4);} // -
if((ks()==0xff)&&(scan_key()==12))//c
{valuefirst=value;value=0;flag_mul=1;count_comp=0;jy=0;ocmj_write(0xf4);}// *
if((ks()==0xff)&&(scan_key()==13))//D
{valuefirst=value;value=0;flag_mod=1;count_comp=0;jy=0;ocmj_write(0xf4);}// /
if(scan_key()==14)//E
{
if(flag_add==1) {rezult=valuefirst+value;count_comp=0;flag_add=0;ocmj_write(0xf4);jy=0;
write_ASCII(0xf9,6,32,table1[rezult/100]);
write_ASCII(0xf9,7,32,table1[rezult%100/10]);
write_ASCII(0xf9,8,32,table1[rezult%10]);
}
if(flag_sub==1) {rezult=valuefirst-value;count_comp=0;flag_sub=0;ocmj_write(0xf4);jy=0; write_ASCII(0xf9,6,32,table1[rezult/100]);
write_ASCII(0xf9,7,32,table1[rezult%100/10]);
write_ASCII(0xf9,8,32,table1[rezult%10]);}
if(flag_mul==1) {rezult=valuefirst*value;count_comp=0;flag_mul=0;ocmj_write(0xf4);jy=0;write_ASCII(0xf9,6,32,table1[rezult/100]);
write_ASCII(0xf9,7,32,table1[rezult%100/10]);
write_ASCII(0xf9,8,32,table1[rezult%10]); }
if(flag_mod==1) {rezult=valuefirst/value;count_comp=0;flag_mod=0; }
}
}
/********************电压采集**********************/
void test_v(void)
{
hz_tran(1,1,"你爱你");
}
/**************主函数**********************************/
void main(void)
{
uart0_init();//串口初始化
timer0_init();//T0初始
initail_ocmj();
ocmj_write(0xf4);
initial_Exinterup();
TIMSK=0X01;
SREG|=0X80;
while(1)
{
initial_Exinterup();
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; }//开中断
EIMSK=0X10;
flag=0;//打开外部中断
computer();
if(data==0x76) {ocmj_write(0xf4);flag_computer=0;rezult=0;break;}
}
}
/**********************************************/
/*电压采集*/
/***********************************************/
if(flag_test_v)//电压采集
{
ocmj_write(0xf4);
for(;;)
{
EIMSK=0X10;
flag=0;
test_v();
if(data==0x76) {ocmj_write(0xf4);flag_test_v=0;break;}
}
}
}
}
/* if (flag)
Decode(data);
else
EIMSK=0X10; //开中断
} while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -