当前位置:文档之家› 基于51单片机的示波器和密码锁程序(部分)

基于51单片机的示波器和密码锁程序(部分)

#include
#include"gui.h" //GUI:TFT屏功能函数集头文件
#include"pcf8591.h" //pcf8591模数/数模转换芯片头文件

sbit FMQ=P1^5; //蜂鸣器端口
sbit LED3=P2^3; //键盘锁定指示灯

/***************DA转换按键****************/
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;

/***************脉冲计数值2分频***************/
sbit sbz2=P1^1;
sbit sbz4=P1^2;
sbit sbz8=P1^3;
uchar pz=1;

/***************测速参数******************/
uint mc1,mc2;

/***************TFT显示参数***************/
uchar kf,ii=36,qh;
uchar adNum[5]={0,0,0,0,75};
uint qz[7];
uint zhz[7];

/********密码锁参数,存放于外部RAM需软件归零********/
uchar xdata sd=0,ks=0,i=0,KeyState=0,KeyValue=0; //sd:键盘锁定 ks:开锁状态 KeyValue:键盘值 KeyState:键盘状态 i:通用参数
uint xdata js=0; //js:键盘锁定时间
uchar xdata SRZ[8]; //按键数值数组

void Delay1ms(uint c) //延时1ms ,6T方式运行
{
uchar a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=25;a>0;a--);
}

void FMQCX(void)//蜂鸣器程序
{
uchar d;
for(d=0;d<100;d++)
{
FMQ=0;
Delay1ms(2);
FMQ=1;
Delay1ms(2);
}
}

void AJSB(void) //按键识别
{
unsigned int an=0;
P1=0x0f;
if((P1!=0x0f)&&(sd<3)) //是否锁定键盘
{
Delay1ms(1);
if(P1!=0x0f)
{
KeyState=1;
P1=0X0F;
Delay1ms(1);
switch(P1)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
default: KeyValue=17;
}
P1=0XF0;
Delay1ms(1);
switch(P1)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
default: KeyValue=17;
}
while((an<500)&&(P1!=0xf0))
{
Delay1ms(1);
an++;
}
an=0;
}
}
}

void AJGN(void) //按键功能
{
if(KeyState==1)
{
if(KeyValue<10) //数字键,循环赋值
{
SRZ[7]=SRZ[6];
SRZ[6]=SRZ[5];
SRZ[5]=SRZ[4];
SRZ[4]=SRZ[3];
SRZ[3]=SRZ[2];
SRZ[2]=SRZ[1];
SRZ[1]=SRZ[0];
SRZ[0]=KeyValue;
}

else if(KeyValue==10) //确认键
{
if((SRZ[0]==1)&&(SRZ[1]==1)&&(SRZ[2]=1)&&(SRZ[3]==1)&&(SRZ[4]==2)&&(SRZ[5]==2)&&(SRZ[6]==2)&&(SRZ[7]==2))
{
ks=1; //开锁
GUI_Write14CnCharmin(60,180,"输入",RED,GREEN);
GUI_Write14CnCharmin(92,180,"正",RED,GREEN);
GUI_Write14CnCharmin(108,180,"确",RED,GREEN);
Delay1ms(2000);
}
else
{
sd++; //按键锁定参数增加,等于3则锁定键盘
GUI_Write14CnCharmin(60,180,"输入错误",RED,GREEN); //输入错误提示
for(i=0;i<2;i++)
{
FMQCX();
}
GUI_Box(50,180,130,200,BLACK); //清除输入错误提示
}
for(i=0;i<8;i++) //按键数值归零
{
SRZ[i]=10;
}
}

else if(KeyValue==11) //清除键
{
SRZ[0]=SRZ[1];
SRZ[1]=SRZ[2];
SRZ[2]=SRZ[3];
SRZ[3]=SRZ[4];
SRZ[4]=SRZ[5];
SRZ[5]=SRZ[6];
SRZ[6]=SRZ[7]

;
SRZ[7]=10;
}

else //错键提示
{
FMQCX();
}
KeyState=0;
}

}

void main (void)
{
TFT_Init(); //TFT显示屏初始化
GUI_ClearScreen(BLACK); //TFT刷屏,以黑色为底色

for(i=0;i<8;i++) //按键数值赋初值,显示xxxxxxxx
{
SRZ[i]=10;
}

GUI_Box(48,30,133,50,GREEN); //四个上部显示方框
GUI_Box(48,60,133,80,GREEN);
GUI_Box(48,92,133,112,GREEN);
GUI_Box(48,123,133,143,GREEN);
GUI_Write14CnCharmin(53,34,"请输入密码",RED,GREEN); //输入提示文字
GUI_Write14CnCharmin(56,64,"按",RED,GREEN);
GUI_WriteASCIImin(73,67,"S11",RED,GREEN);
GUI_Write14CnCharmin(97,64,"确认",RED,GREEN);
GUI_Write14CnCharmin(56,95,"按",RED,GREEN);
GUI_WriteASCIImin(73,98,"S12",RED,GREEN);
GUI_Write14CnCharmin(97,95,"清除",RED,GREEN);

while(1)
{
if(ks==0)
{
AJSB(); //按键识别
AJGN(); //按键功能
sy_blsplay(60,128,SRZ[7], RED, GREEN); //8位按键数值显示
sy_blsplay(68,128,SRZ[6], RED, GREEN);
sy_blsplay(76,128,SRZ[5], RED, GREEN);
sy_blsplay(84,128,SRZ[4], RED, GREEN);
sy_blsplay(92,128,SRZ[3], RED, GREEN);
sy_blsplay(100,128,SRZ[2], RED, GREEN);
sy_blsplay(108,128,SRZ[1], RED, GREEN);
sy_blsplay(116,128,SRZ[0], RED, GREEN);

if(sd==3) //按键锁定
{
js++;
LED3=0; //开按键锁定指示灯
GUI_Write14CnChar(43,180,"键盘锁定",RED,GREEN); //键盘锁定提示
if(js==600) //键盘锁定时间参数最大值:600
{
js=0; //键盘锁定时间参数归零
sd=0; //关闭键盘锁定状态
LED3=1; //关闭键盘锁定指示灯
GUI_Box(43,180,150,210,BLACK); //清除键盘锁定提示
}
}

}

else if(ks==1)
{
ks++;
/**************画表格,写入字符*******************/
GUI_ClearScreen(BLACK); //TFT刷屏,以黑色为底色
GUI_Write14CnCharmin(10,6,"模数",RED,BLACK);
GUI_Write14CnCharmin(42,6,"数",RED,BLACK);
GUI_Write14CnCharmin(58,6,"模",RED,BLACK);
GUI_Write14CnCharmin(74,6,"和测速示波器",RED,BLACK);
GUI_WriteASCIImin(16,185,"0",YELLOW,BLACK);
GUI_WriteASCIImin(12,160,"50",YELLOW,BLACK);
GUI_WriteASCIImin(8,135,"100",YELLOW,BLACK);
GUI_WriteASCIImin(8,110,"150",YELLOW,BLACK);
GUI_WriteASCIImin(8,85,"200",YELLOW,BLACK);
GUI_WriteASCIImin(8,60,"250",YELLOW,BLACK);
GUI_WriteASCIImin(8,35,"300",YELLOW,BLACK);
GUI_Line(0,25,175,25,GREEN);
GUI_Line(0,50,36,50,GREEN);
GUI_Line(0,75,36,75,GREEN);
GUI_Line(0,100,36,100,GREEN);
GUI_Line(0,125,36,125,GREEN);
GUI_Line(0,150,36,150,GREEN);
GUI_Line(0,175,36,175,GREEN);
GUI_Line(0,200,175,200,GREEN);
GUI_Line(36,25,36,200,GREEN);
GUI_Konkuan(0,0,175,219,GREEN,GREEN,GREEN,GREEN);

/***************定时/计数器初始化******************/
TMOD=0x55;//设置定时计数器0/1工作方式:16位计数器
//T2CON=0x00; //16位定时器2自动重载定时,T2CON=0x01为不自动重载模式
TCLK=0; //可令T2CON=0;或TCLK=0,RCLK=0;
RCLK=0; //T2CON中其他位可默认为0,而TCLK和RCLK必须手动置0
T2MOD=0x00;
RCAP2H=(65536-50000)/256; //RCAP2L和R

CAP2H由软件预设,自动装载到定时器2的低8位和高8位
RCAP2L=(65536-50000)%256;
TH2=(65536-50000)/256;
TL2=(65536-50000)%256;
ET2=1;
TR2=1;
TR0=1;
TR1=1;
EA=1;
}

else if(ks==2)
{
/***************AD/DA转换控制******************/
Pcf8591SendByte(0);//发送电位器转换命令
adNum[3]=Pcf8591ReadByte();//ADC3读取外部输入电压

Pcf8591SendByte(1);//发送热敏转换命令
adNum[0]=Pcf8591ReadByte();//读取电位器转换结果

Pcf8591SendByte(2);//发送光敏转换命令
adNum[1]=Pcf8591ReadByte();//ADC1读取热敏

Pcf8591SendByte(3);//发送外部输入电压转换命令
adNum[2]=Pcf8591ReadByte();//ADC2读取光敏

Pcf8591DaConversion(adNum[4]);

/***************按键识别******************/
if(K1==0) //DA数值增大
{
if(adNum[4]==255) //8位DA转换最大值:255
{
adNum[4]=255;
}
else
{
adNum[4]++;
}
}
if(K2==0) //DA数值减小
{
if(adNum[4]==0)
{
adNum[4]=0;
}
else
{
adNum[4]--;
}
}

if(K3==0) //数值显示控制:0时显示AD/DA 1时显示脉冲计数 2时不显示
{
if(qh>1)
{
qh=0;
}
else
{
qh++;
}
GUI_Box(1,201,174,218,BLACK); //清除数值显示区,避免数值相互干扰
GUI_Box(1,201,174,218,BLACK); //只做延时
}

/***************数值显示变换******************/
if(qh==0) //显示AD/DA数值
{
ten_blsplay(23,204,adNum[0],RED,BLACK);//以十进制显示
ten_blsplay(58,204,adNum[1],YELLOW,BLACK);
ten_blsplay(93,204,adNum[2],BLUE,BLACK);
ten_blsplay(128,204,adNum[3],WHITE,BLACK);
ten_blsplay(163,204,adNum[4],MAGENTA,BLACK);
}
else if(qh==1) //显示50ms脉冲计数值
{
ten_blsplay(60,204,mc1*pz,GREEN,BLACK);
ten_blsplay(120,204,mc2*pz,YELLOW,BLACK);
}

/***********原始数值转换,以便在相应区域显示*********/
zhz[0]=199-adNum[0]/2;
zhz[1]=199-adNum[1]/2;
zhz[2]=199-adNum[2]/2;
zhz[3]=199-adNum[3]/2;
zhz[4]=199-adNum[4]/2;
if(mc1>174) //显示区域最大高度174
{
zhz[5]=26;
}
else
{
zhz[5]=199-mc1;
}
if(mc2>174)
{
zhz[6]=26;
}
else
{
zhz[6]=199-mc2;
}

/********显示区域为X轴:37~174,Y轴:26~199,空缺值4*******/
if(ii>170)
{
kf=ii-134;
}
else
{
kf=ii+4;
}

GUI_Line(kf,26,kf,199,BLACK); //消除前期数据曲线痕迹,以便更新数据曲线

if(ii!=36) //x=36时不显示数据曲线,避免数据曲线在x=36处有残余
{
/*************数据曲线更新************/
GUI_Line(ii,qz[0],ii+1,zhz[0],RED);
GUI_Line(ii,qz[1],ii+1,zhz[1],CYAN);
GUI_Line(ii,qz[2],ii+1,zhz[2],BLUE);
GUI_Line(ii,qz[3],ii+1,zhz[3],WHITE);
GUI_Line(ii,qz[4],ii+1,zhz[4],MAGENTA);
GUI_Line(ii,qz[5],ii+1,zhz[5],GREEN);
GUI_Line(ii,qz[6],ii+1,zhz[6],YELLOW);
}

qz[0]=zhz[0];qz[1]=zhz[1];qz[2]=zhz[2]; //保存前一位数据,用于更新数据曲线
qz[3]=zhz[3];qz[4]=zhz[4];qz[5]=zhz[5];qz[6]=zhz[6];

ii++; //数据曲线前移
if(ii>173) //X轴关联参数ii变

换范围:36~173
{
ii=36;
}

}
}
}

void timer0() interrupt 5
{
mc1=TL0+TH0*256;
mc2=TL1+TH1*256;

/***************脉冲计数值2分频***************/

if(sbz2==0)
{
mc1=mc1/2;
mc2=mc2/2;
pz=2;
}
else if(sbz4==0)
{
mc1=mc1/4;
mc2=mc2/4;
pz=4;
}
else if(sbz8==0)
{
mc1=mc1/8;
mc2=mc2/8;
pz=8;
}
else
{
pz=1;
}

TH0=0;TL0=0; //计数器0/1数值归零
TH1=0;TL1=0;
TF2=0; //必须软件置0
}

相关主题
文本预览
相关文档 最新文档