📄 gf.c
字号:
#include<AT89X51.H>
#include<absacc.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define _RDY_ 0x06
#define _BUSY_ 0x15
#define _OK_ 0x00
#define _SUCC_ 0x0f
#define _ERR_ 0xf0
#define BN 28
void lcd1 (void);
void lcd2 (void);
void lcd12 (void);
void lcd21 (void);
void lcd3 (void);
void lcd4 (void);
void chaiji (void);
void delay (void);
void delay1s(void);
uchar code table1[16]=
{0x4b,0x58,0x2d,0x37,0x35,0x30,0x32,0x42,0x20,0x4b,0x45,0x59,0x20,0x4f,0x46,0x46};
uchar code table2[16]=
{0x20,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x77,0x61,0x69,0x74,0xa5,0xa5,0xa5,0x20};
uchar code table3[16]=
{0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x20,0x74,0x65,0x73,0x74,0x20,0x4f,0x4b,0x20};
uchar code table[9][16]={
{0x20,0x32,0x34,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2d,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2b,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x20,0x54,0x65,0x6d,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xdf,0x43,0x20},
{0x20,0x48,0x65,0x61,0x74,0x69,0x6e,0x67,0x20,0x20,0x20,0x20,0x20,0x41,0x20,0x20},
{0x20,0x20,0x42,0x69,0x61,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x41,0x20},
{0x20,0x20,0x50,0x6f,0x77,0x65,0x72,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x57,0x20},
{0x53,0x2f,0x4e,0x3a,0x32,0x30,0x30,0x36,0x31,0x32,0x32,0x42,0x30,0x32,0x32,0x20},
{0x31,0x33,0x31,0x30,0x54,0x72,0x61,0x6e,0x73,0x69,0x6d,0x69,0x74,0x74,0x65,0x72}};
uchar code table4[5][16]={
{0x20,0x32,0x34,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2d,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2b,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x53,0x2f,0x4e,0x3a,0x32,0x30,0x30,0x36,0x31,0x32,0x32,0x42,0x30,0x32,0x32,0x20},
{0x31,0x33,0x31,0x30,0x54,0x72,0x61,0x6e,0x73,0x69,0x6d,0x69,0x74,0x74,0x65,0x72}};
char s=4;
bit ck=0;
bit cj=0;
uchar idata b[28];
uchar idata cd[28];
//初始化显示器子函数
void lcd1(void){
P1=0x3b;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x06;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x0c;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x01;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
//显示器第一行显示"KX-7502B KEY OFF"子函数
void lcd2(void){
uchar i;
uchar code *p=table1;
P1=0x80;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<16;i++){
P1=*p;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
p++;}
}
//第二行显示“system test OK”子函数
void lcd2_1(void){
uchar i;
uchar code *p=table3;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<16;i++){
P1=*p;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
p++;}
}
//显示器第二行显示“Please wait..." 子函数
void lcd21 (void){
uchar j;
uchar code *bb=table2;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(j=0;j<16;j++){
P1=*bb;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
bb++;}
bb=table2;
}
/*延时1s子函数*/
void delay1s(void){
uchar i,j,k;
i=100;
for(k=0;k<10;k++){
while((i--)!=0){
for(j=0;j<125;j++)
{;}
}
}
}
/*延时10毫秒子函数*/
void delay(void){
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
;
}
/*可变延时10ms子函数 */
void delay10ms(uchar count){
uchar i,j,k;
for(k=0;k<count;k++)
for(i=0;i<100;i++)
for(j=0;j<100;j++)
;
}
/*显示器第一行8e开始的2位显示”ON"的子函数*/
void lcd3(void){
P1=0x8e;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x4e;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
P1=0x20;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
/*显示器第一行8e开始的2位显示"OFF" 的子函数*/
void lcd4(void){
char i;
P1=0x8e;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<2;i++){
P1=0x46;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
}
/*5变量的显示子函*/
void lcd112(void) {
uchar i,j;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(j=0;j<16;j++){ /* 二行显示固定部分*/
P1=*(*(table4+s)+j);
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
if(s<=2){
P1=0xcb;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=s*4;i<s*4+4;i++){ /*二行显示采集处理数据*/
P1=cd[i];
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
} }
/*9变量显示器第二行开始显示数据的子函数*/
void lcd12(void) {
uchar i,j;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(j=0;j<16;j++){ /* 二行显示固定部分*/
P1=*(*(table+s)+j);
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
if(s<=6){
if(s>=3) P1=0xc9;
else P1=0xcb;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=s*4;i<s*4+4;i++){ /*二行显示采集处理数据*/
P1=cd[i];
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
}
}
}
/*显示方行子函数*/
void lcd1_2(void){
char i;
P1=0xc0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
for(i=0;i<16;i++){
P1=0x14;
P3_4=1;
P3_5=0;
P3_6=0;
P3_6=0;
P3_6=1;
delay10ms(20);
}
}
/*采集和数据处理子函数*/
void chaiji(void){
while(1){
uchar k;
if(ck==1) lcd12();
else{
P3_2=1;
if(P3_2==0)delay();
if(P3_2==0){
lcd3();
P2_0=0;
P2_2=0;
lcd1_2();
P2_1=0;
ck=1;
cj=0;
s=8;
}
}
if(cj==1) lcd112();
else{
P3_2=1;
if(P3_2==1)delay();
if(P3_2==1){
lcd4();
P2_1=1;
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
P2_0=1;
P2_2=1;
ck=0;
cj=1;
s=4;
}
}
//采集的数据存入b数组中
for(k=0;k<28;k+=4){
P0=0xff;
while(!P0_4);
ACC=P0;
b[k]= ACC&0x0f;
P0=0xff;
while(!P0_5);
ACC=P0;
b[k+1]= ACC&0x0f;
P0=0xff;
while(!P0_6);
ACC=P0;
b[k+2]= ACC&0x0f;
P0=0xff;
while(!P0_7);
ACC=P0;
b[k+3]= ACC&0x0f;
delay();
P2_6=1;
delay();
delay();
delay();
P2_6=0;
delay();
}
delay();
P2_7=1;
delay();
delay();
delay();
P2_7=0;
delay();
//数据处理后存入cd数组中
if(s==0) {cd[0]=b[1]+0x30;cd[1]=b[2]+0x30;cd[2]=0x2e;cd[3]=b[3]+0x30;}
if(s==1) {cd[4]=0x2d;cd[5]=b[5]+0x30;cd[7]=b[6]+0x30;cd[6]=0x2e;}
if(s==2) {cd[8]=0x2b;cd[9]=b[9]+0x30;cd[10]=0x2e;cd[11]=b[10]+0x30;}
if(s==3) {cd[12]=0x32;cd[13]=0x35;cd[14]=0x2e;cd[15]=0x30;}
if(s==4) {cd[16]=0x30;cd[17]=0x2e;cd[18]=b[17]+0x30;cd[19]=b[18]+0x30;}
if(s==5) {cd[20]=b[21]+0x30;cd[21]=b[22]+0x30;cd[22]=0x2e;cd[23]=b[23]+0x30;}
if(s==6) {ACC=0xff;ACC=ACC&b[24];if((!ACC_0)&&(!ACC_3))cd[24]=0x31; else cd[24]=0x30; cd[25]=b[25]+0x30;cd[27]=b[26]+0x30;cd[26]=0x2e;}
}
}
/*中断服务子函数用于显示器显示数据*/
void sevice_int1() interrupt 2 using 1
{
s--;
if(s<0&P3_2==0) s=8 ;
if(s<0&P3_2==1) s=4 ;
if(s==0) {cd[0]=b[1]+0x30;cd[1]=b[2]+0x30;cd[2]=0x2e;cd[3]=b[3]+0x30;}
if(s==1) {cd[4]=0x2d;cd[5]=b[5]+0x30;cd[7]=b[6]+0x30;cd[6]=0x2e;}
if(s==2) {cd[8]=0x2b;cd[9]=b[9]+0x30;cd[10]=0x2e;cd[11]=b[10]+0x30;}
if(s==3) {cd[12]=0x32;cd[13]=0x35;cd[14]=0x2e;cd[15]=0x30;}
if(s==4) {cd[16]=0x30;cd[17]=0x2e;cd[18]=b[17]+0x30;cd[19]=b[18]+0x30;}
if(s==5) {cd[20]=b[21]+0x30;cd[21]=b[22]+0x30;cd[22]=0x2e;cd[23]=b[23]+0x30;}
if(s==6) {ACC=0xff;ACC=ACC&b[24];if((!ACC_0)&&(!ACC_3))cd[24]=0x31; else cd[24]=0x30; cd[25]=b[25]+0x30;cd[27]=b[26]+0x30;cd[26]=0x2e;}
if(P3_2==0) lcd12();
else lcd112();
}
//初始化串口
void int_serial()
{
TMOD=0x20; //定时器T1使用工作方式2
TH1=250; //设置初值
TL1=250;
TR1=1; //开始计时
PCON=0x80; //SMOD=1
SCON=0x50; //工作方式1,波特率9600 bit/s,允许接收
}
/*发送数据*/
void send_data(uchar *buf)
{
uchar ecc,i;
ecc=BN; //开始进行校验字节计算
/*发送数据*/
for(i=0;i<BN;i++)
{
ecc=ecc^(*buf); //计算校验字节
SBUF=*buf; //发送数据
buf++;
while(!TI);
TI=0;
}
/*发送校验字节*/
SBUF=ecc; //发送校验字节
while(!TI);
TI=0;
}
/*串口中断*/
void ssio(void) interrupt 4 using 1
{
/*如果接收到的不是握手信号_RDY_,则返回*/
uchar tmp=_RDY_;
RI=0;
ES=0;
if(SBUF!=tmp)
{ TI=0;
SBUF=_ERR_;
while(!TI);
TI=0; ES=1;return;}
TI=0; //发送_OK_信号表示可以发送数据
SBUF=_OK_;
while(!TI);
TI=0;
/*发送数据并接收校验信息,如果接收的信号为0x0f,表示主机接收成功,否则将重新发送该组数据*/
tmp=_ERR_;
while(tmp!=_SUCC_)
{
send_data(b);
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
ES=1;
}
void main(void){
IT1=1; /*外部中断1设置为边沿触发方式*/
EX1=1; /*外部中断允许位开*/ /*中断总允许位开*/
lcd1();
lcd21();
int_serial();
ES=1;
EA=1; //开串口中断
P2=0x1f; /*开机蜂鸣器响一下*/
delay10ms(10);
P2_5=1;
delay1s();
lcd2();
lcd2_1();
chaiji();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -