📄 clcd.c
字号:
//------------ 主程序 ------------//
void main(void)
{
// Declare your local variables here
unsigned int i,j;
// Input/Output Ports initialization
// Port A initialization
// Func0=Out Func1=Out Func2=Out Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=0 State1=0 State2=0 State3=T State4=T State5=T State6=T State7=T
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=1 State1=1 State2=1 State3=1 State4=1 State5=1 State6=1 State7=1
PORTB=0xFF;
DDRB=0x7F;
// Port C initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=1 State1=1 State2=1 State3=1 State4=1 State5=1 State6=1 State7=1
PORTC=0xFF;
DDRC=0xFF;
// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=P State1=P State2=P State3=P State4=P State5=P State6=P State7=P
PORTD=0xFF;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz
// 溢出中断周期: 4ms
TCCR0=0x03;
TCNT0=0x05;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GICR=0x00;
// GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1
// Analog Comparator Output: Off
ACSR=0x80;
// Global enable interrupts : Off
// #asm("sei") //开总中断
old_Key=PIND;
oldcru=0;
Crusor=0;
hMenu=0;
CS2=1;
CS1=1;
E=0;
delay_ms(200);
for(i=0;i<8;i++)
{
tset[i]=E_Time[i];
temp=tset[i]&0x000F;
if (temp>9)
{
tset[i]=tset[i]&0x0FF9;
E_Time[i]=tset[i];
}
temp=tset[i]&0x00F0;
if (temp>0x0090)
{
tset[i]=tset[i]&0x0F9F;
E_Time[i]=tset[i];
}
temp=tset[i]&0x0F00;
if (temp>0x0900)
{
tset[i]=tset[i]&0x09FF;
E_Time[i]=tset[i];
}
temp=tset[i]&0xF000;
if (temp>0x0000)
{
tset[i]=tset[i]&0x0FFF;
E_Time[i]=tset[i];
}
Timeset[i]=tset[i];
Time[i]=0;
}
/********************** 测试功能 ***********************
开机时按下,且仅按下 "确定"和"右"键时,进入测试模式
测试模式中的LCD显示:
第一行: 显示"提示"字样,后面显示提示按键,根据所提示的按键,
每按一次,执行步骤加1 .
(注:此步骤号与方案中的流程号不同)
提示键主要有四个:上、下、左、红(红即是确定键)
其代表的含义分别是:
上: 托盘上升到顶点
下: 托盘下降到底点
左; 延时时间执行完毕
红(确定):托盘转动到下一个位置
第二行: 显示从RD0到RD9的状态,打开状态时,数字没有下划线
关闭状态,数字有下划线,数字代表,RD0到RD9
第三行: 显示当前执行的步骤号
第四行: 显示"按取消键退出",在执行模式中,按下取消键,
就会退出测试模式,进入到程序正常的执行模式中.
注: 当第三行显示“21”时,此时全部测试已经完成,
提示按键没有刷新,此时需按下“取消键退出测试模式。
其它按键没有响应。若要重新进入测试模式,需要再次开机。
**********************************************************/
test=0;
if (!(PIND&0x82))
{
delay_ms(1000);
if (!(PIND&0x82))
{
test=1;
// old_Step=0xff;
Step=0xFF;
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
for(i=0;i<2;i++) LCD_WrCHr16x16(0,i*2,i+25); //第1行显示"提示"
for(i=0;i<6;i++) LCD_WrCHr16x16(6,i*2,i+18); //第4行显示"按取消键退出"
}
else
test=0;
}
while(test)
{
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
KT2=KeyTemp>>8;
KT2=KT1&KT2; //键按下
if(KT2&0x10) //上
{
s_up=1;
}
if(KT2&0x20) //下
{
s_down=1;
}
if(KT2&0x40) //左
{
for(i=0;i<8;i++)
{
Time[i]=0;
}
}
if(KT2&0x80) //右
{
}
if(KT2&0x02) //确认
{
s_sp=1;
}
if(KT2&0x01) //取消
{
test=0;
}
execute();
j=0;
for (i=0;i<7;i++)
{
if (Time[i])
{
LCD_WrCHr16x16(0,6,29);
j=1;
}
}
if (j==0)
{
LCD_WrCHr8x16(0,6,0);
LCD_WrCHr8x16(0,7,0);
}
switch(roll)
{
case 0:
case 1:
LCD_WrCHr16x16(0,10,28) ;
break;
case 2:
case 3:
LCD_WrCHr16x16(0,10,30) ;
break;
case 4:
case 5:
case 10:
LCD_WrCHr16x16(0,10,27);
break;
default:
break;
}
for (i=0;i<10;i++)
{
j=1<<i;
j=j&RD;
if(j)
{
LCD_WrCHr6x16(2,i*8,10+i);
}
else
{
LCD_WrCHr6x16(2,i*8,i);
}
}
DispStep();
// old_Step=Step;
}
//------------ 测试结束 ------------//
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
for(i=0;i<3;i++) LCD_WrCHr16x16(0,i*2+6,i); //第1行显示"主菜单"
Time[8]=0;
R_OFF();
/*
delay_ms(20);
#asm("sei") //开总中断
MotoIni();
#asm("cli") //关总中断
*/
while (1)
{
// 定义按键: Kcancle,Kok,Kup,Kdown,Kleft,Kright key0..5
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
KT2=KeyTemp>>8;
KT2=KT1&KT2; //键按下
/*
//
for(j=0;j<8;j++)
{
LCD_Write_ComL(0xb8|j); //页PAGE(j) 设置指令
LCD_Write_ComL(0x40); //列地址Y(0) Address 设置指令
LCD_Write_ComR(0xb8|j);
LCD_Write_ComR(0x40);
for(i=0;i<64;i++) //64列清0
{
LCD_Write_DatL(0xFF);
LCD_Write_DatR(0xFF);
}
}
delay_ms(1000);
*/
/*
// dubug
error=Err_Msg;
mm=hMenu;
cc=Crusor;
kkkk=KeyTemp;
*/
/***************************************************************************
主 菜 单
***************************************************************************/
if (hMenu==0)
{
#asm("cli") //关总中断
if(oldcru != Crusor) //显示光标
{
LCD_WrCHr8x16(oldcru<<1,0,0);
LCD_WrCHr8x16(Crusor<<1,0,1);
oldcru=Crusor;
}
if(Crusor==0)
{
R_OFF();
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
Crusor=1;
oldcru=0;
for(i=0;i<3;i++) LCD_WrCHr16x16(0,i*2+6,i); //第1行显示"主菜单"
for(i=0;i<2;i++) LCD_WrCHr16x16(2,i*2+4,i+3); //第2行显示"执行"
for(i=0;i<2;i++) LCD_WrCHr16x16(4,i*2+4,i+6); //第3行显示"显示"
for(i=0;i<4;i++) LCD_WrCHr16x16(4,i*2+8,i+10); //第3行显示"工作参数"
for(i=0;i<6;i++) LCD_WrCHr16x16(6,i*2+4,i+8); //第4行显示"工作参数"
for(i=1;i<4;i++) LCD_WrCHr6x16(i*2,8,i); //显示"123"
for(i=1;i<4;i++) LCD_WrCHr4x16(i*2,16,1); //显示"..."
}
if(KT2&0x10)//上
{
//RD7=0;
oldcru=Crusor;
if(Crusor==2)
Crusor=1;
else if(Crusor==3)
Crusor=2;
}
if(KT2&0x20)//下
{
//RD6=0;
oldcru=Crusor;
if(Crusor==1)
Crusor=2;
else if(Crusor==2)
Crusor=3;
}
if(KT2&0x02)//确认
{
hMenu=Crusor;
if (Crusor==3)
{
M3Done=1;
}
Crusor=0;
oldcru=0;
// RD5=0;
}
}
/***************************************************************************
执 行 菜 单
***************************************************************************/
else if(hMenu==1)
{
#asm("sei") //开总中断
if(Crusor==1)
{
execute();
// DispStep();
}
if (Crusor==0)
{
Crusor=1;
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
for(i=0;i<3;i++) LCD_WrCHr16x16(0,i*2+4,i+3); //第1行显示"执行中"
for(i=0;i<4;i++) LCD_WrCHr16x16(2,i*2,i+14); //第2行显示"处理溶液"
for(i=0;i<6;i++) LCD_WrCHr16x16(6,i*2,i+18); //第4行显示"按取消键退出"
MotoIni();
roll=0;
}
else if (roll==9) //执行结束
{
hMenu=0;
Err_Msg=0;
Crusor=0;
oldcru=0;
R_OFF();
roll=0;
}
/* else if(Step>=0x80)
{
MotoIni();
}
*/
if(old_Step!=Step)
{
// Time[8]=0x0500; //每步执行时间上限128秒,超时有误
DispStep();
switch(Step)
{
case 1:
LCD_WrCHr8x16(2,10,2); //显示A
break;
case 4 :
LCD_WrCHr8x16(2,10,3); //显示B
break;
case 6 :
LCD_WrCHr8x16(2,10,4); //显示C
break;
case 8 :
LCD_WrCHr8x16(2,10,5); //显示D
break;
default:
break;
}
}
if (roll==8)
{
Err_Msg=Step|0x80;
hMenu=0;
Crusor=0;
oldcru=0;
R_OFF();
}
if(KT2&0x01)//取消
{
hMenu=0;
Crusor=0;
oldcru=0;
}
old_Step=Step;
}
/***************************************************************************
显 示 参 数 菜 单
***************************************************************************/
else if (hMenu==2)
{
if (Crusor==0)
{
R_OFF();
Crusor=1;
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
for(i=0;i<8;i++)
{
tset[i]=Timeset[i];
}
//初始参数显示
DispFrame();
for(i=0;i<24;i++)
{
DispTime(i,0);
}
}
if(KT2&0x01)//取消
{
hMenu=0;
Crusor=0;
}
}
/***************************************************************************
设 置 参 数 菜 单
***************************************************************************/
else if (hMenu==3)
{
if(oldcru != Crusor) //刷新显示光标
{
DispTime(oldcru,0);
DispTime(Crusor,10);
oldcru=Crusor;
}
if(M3Done==1)
{
M3Done=0;
oldcru=0;
for(i=0;i<8;i++)
{
tset[i]=Timeset[i];
}
//初始参数显示
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
DispFrame();
DispTime(0,10);
for(i=1;i<24;i++)
{
DispTime(i,0);
}
// MotoKey();
// R_OFF();
}
if(KT2&0x10) //上
{
F_TimeSet(Crusor,1);
DispTime(Crusor,10); //显示刷新
j=250;
while((KT1&0x10)&&j)
{
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
j--;
delay_ms(2);
}
j=9;
delay_ms(3);
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
while((KT1&0x10)&&j)
{
delay_ms(300);
F_TimeSet(Crusor,1);
DispTime(Crusor,10); //显示刷新
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
j--;
}
}
if(KT2&0x20) //下
{
F_TimeSet(Crusor,0);
DispTime(Crusor,10); //显示刷新
j=250;
while((KT1&0x20)&&j)
{
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
delay_ms(2);
j--;
}
j=9;
delay_ms(3);
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
while((KT1&0x20)&&j)
{
delay_ms(300);
F_TimeSet(Crusor,0);
DispTime(Crusor,10); //显示刷新
KeyTemp=keyscan();
KT1= KeyTemp; //键状态
j--;
}
}
if(KT2&0x40) //左
{
if((Crusor-(ceil(Crusor/3-0.5))*3)>0)
{
oldcru=Crusor;
Crusor--;
}
}
if(KT2&0x80) //右
{
if((Crusor-(ceil(Crusor/3-0.5))*3)<2)
{
oldcru=Crusor;
Crusor++;
}
}
if(KT2&0x02) //确认
{
if (Crusor>20)
{
oldcru=Crusor;
Crusor=0;
}
else
{
oldcru=Crusor;
Crusor=(ceil(Crusor/3+0.5))*3;
}
}
if(KT2&0x01)//取消
{
hMenu=0;
Crusor=0;
oldcru=0;
for(i=0;i<8;i++)
{
if (Timeset[i]!=tset[i])
{
Timeset[i]=tset[i];
E_Time[i]=tset[i];
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -