该程序主要运用了键盘扫描技术和EEROM存储器编程,做到把键盘值输入到存储器中,不怕掉电。基于WICN单片机开发板设计。
主程序
- //--------------------- 半自动绕线机程序 ----------------------
- //-----------------芯片STC89C52RC 晶振11.0592M ----------------
- //---------------------计数值范围1~22圈-----------------------
- #include<reg52.h>
- #include"24c01.c"
- #include"stopgo.c"
- #include"jishuan.c"
- #include"lcd1602.c"
- #include"startgo.c"
- //-------------------------------------------------------------
- #define uchar unsigned char
- #define uint unsigned int
- //-------------------------------------------------------------
-
- sbit K1=P0^0; //数字输入键个位数
- sbit K2=P0^1; //数字输入键十位数
- sbit K3=P0^2; //输入功能并以IIC存入AT24C01中保存
- sbit K4=P0^3; //确认存入数据键
- sbit K5=P0^4; //停止键
- sbit beep=P3^3;
- sbit CLK=P1^2; //光电感应脉冲(用该开关模仿)
- sbit LE_LED=P3^4;
- sbit LED=P1^5;
- //-------------------------------------------------------------
- //-------------------------------------------------------------
- uchar tablee[2];
-
- //------按键延时-----------------------------------------------
- void delayx(uint i)
- {
- uint w;
- for(w=0;w<i;w++);
- }
- //-------------------------------------------------------------
- void start_ggo(uchar b) //打线执行程序
- {
- uchar d=0;
- uchar n=0;
- while(n<=b)
- {
- LCD1602(n); //显示
- if(!CLK)
- {
- delayx(500);
- while(CLK==0);
- n++;
- LED=0;
- beep=0;
- delayx(10000);
- LED=1;
- beep=1;
- }
- }
- }
- //------------------------------------------------------------
- //-------------------------------------------------------------
- //------------------数据键盘按键扫描---------------------------
- void main()
- {
- uchar h,f;
- uchar e=30;
- uchar id0=0;
- uchar id1=0;
- LE_LED=0;
- while(1)
- {
- if(!K1) //P0.0 K1=3
- {
- delayx(500);
- while(K1==0);
- beep=0;
- delayx(5000);
- beep=1;
- tablee[0]=3;
- if(id0==1)
- {
- tablee[1]=3;
- id0=0;
- }
- id0++;
- if(id0==2)id0=0;
- }
- //--------------------
- if(!K2) //P0.1 K2=5
- {
- delayx(500);
- while(K1==0);
- beep=0;
- delayx(5000);
- beep=1;
- tablee[1]=5;
- if(id1==1)
- {
- tablee[0]=5;
- id0=0;
- }
- id1++;
- if(id1==2)id1=0;
- }
- //===========================================================
- if(!K3)//确认输入到AT24C01中
- {
- delayx(500);
- while(K3==0); //P0.2
- beep=0;
- delayx(5000);
- beep=1;
- jishuan(tablee[0],tablee[1]);
- f=jishuan_ok();
- init(); //24c01初始化
- W_AT24C01(e,f);//写数据到AT24C01中,0x30是器件地址内存单元
- }
- if(!K4)//启动机器打线 P0.3
- {
- delayx(500);
- while(K4==0);
- beep=0;
- delayx(5000);
- beep=1;
- init(); //24c01初始化
- h=R_AT24C01(e); //读AT24C01中0x30的数据
- LCD1602(h); //显示
- //start_go(h); //启动执行打线功能并计数
- start_ggo(h);
-
- if(!K5) //如果停机键按下则执行停机功能
- stop_go();
- }
- }
- }
-
-
- //---IIC AT24C01存储器读写操作程序-----------
- #include <reg52.h>
- #define uchar unsigned char
- sbit SDA=P3^6;
- sbit SCL=P3^7;
- ///------------------------------------------
- void delay()
- { ; ; }
- ///////////////////////
- void start()//起始信号
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- SDA=0;
- delay();
- }
- ///////////////////////
- void stop()//终止信号
- {
- SDA=0;
- delay();
- SCL=1;
- delay();
- SDA=1;
- delay();
- }
- //////////////////////////////////////////////////
- //////////////////////////////////////////////////
- void respons()//应答信号,等待或者发送一个应答信号
- {
- uchar i;
- SCL=1;
- delay();
- while((SDA==1)&&(i<250))i++;
- SCL=0;
- delay();
- }
- /*************************************************/
- void init()//初始化
- {
- SDA=1;
- SCL=1;
- }
- //////////////////////////////////////////////////
- void write_byte(uchar date)//写一字节
- {
- uchar i;
- SCL=0;
- for(i=0;i<8;i++)
- {
- date=date<<1;
- SDA=CY;
- SCL=1;
- delay();
- SCL=0;
- delay();
- }
- }
- //------------------------------------------------
- uchar read_byte()//读数据(也就是接收从器件传来的数据)
- {
- uchar i,k;
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay();
- k=(k<<1)|SDA;
- SCL=0;
- delay();
- }
- return k;
- }
- //////////////////////////////////////////////////
- //=============AT24C01写操作=====================//
- void W_AT24C01(uchar address,uchar date)//写数据
- {
- start();
- write_byte(0xa0); //器件地址
- respons();
- write_byte(address);//器件内存地址 address
- respons();
- write_byte(date);//数据 date
- respons();
- stop();
- }
- //////////////////////////////////////////////////
- //==============AT24C01读操作====================//
- uchar R_AT24C01(uchar address)
- {
- uchar date;
- start();
- write_byte(0xa0);//写器件地址和写指令0XA0=10100000B最后一个零表示写,低电平有效
- respons();
- write_byte(address);////器件内存地址address
- respons();
- start();
- write_byte(0xa1);//写器件地址和读指令0XA1=10100001B,最后一个1表示读,高电平有效
- respons();
- date=read_byte();
- stop();
- return date;
- }
-
-
-
- //------------------LCD1602显示程序(模块)--------------------
- #include <reg52.h>
- #define uchar unsigned char
- ///////////////LCD1602/////////////
- sbit RS=P0^5;
- sbit RW=P0^6;
- sbit YE=P0^7;
- /////////////////////////////////////////////////////////////
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0,1,2,3
- 0x99,0x92,0x82,0xf8,//4,5,6,7
- 0x80,0x90,0xfe};//8,9,.,段码表
- /////////////////////////////////////////////////////////////
- uchar code table1[] ={"0123456789. -"};
- uchar code table2[] ={"Temperature"};
- uchar code table3[] ={" 123333 "};
- /////////////////////////////////////////////////////////////
- void delayy(unsigned int us)
- {
- while(us--);
- }
- ////////////////////////////////////////////
- void delay2()
- {
- RS=0;
- RW=0;
- YE=0;
- delayy(5);
- YE=1;
- }
- /******************************LCD1602液晶显示****************************/
- void LCD1602(uchar dd)//dd是整数
- {
- uchar e,f,i,nem;
- e=dd/10;
- f=dd%10;
- //////////////////////////////////////LCD屏初始化
- P2=0x01; //清屏
- delay2();
- P2=0x38; //显示设定两行
- delay2();
- P2=0x0f; //打开显示和光标
- delay2();
- P2=0x06; //光标右移
- delay2();
- P2=0x80; //光标回到第一行的开头
- delay2();
- //////////////////////////////////////////
- for(nem=0;nem<11;nem++)////////////温度英文字显示
- {
- P2=table2[nem];
- RS=1;
- RW=0;
- YE=0;
- delay2();
- }
- ////////////////////////
- P2=table1[e];
- RS=1;
- RW=0;
- YE=0;
- P2=0x06; //光标右移显示整数十位
- delay2();
- ////////////////////////
- P2=table1[f];
- RS=1;
- RW=0;
- YE=0;
- P2=0x06; //光标右移显示整数个位
- delay2();
- /////////////////////////////////////////////////
- P2=0xc0;//换行显示
- delay2();
- for(i=0;i<16;i++)
- {
- P2=0xc0;
- delay2();
- P2=table3[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
-
-
-
- //-----------数据计算程序--------------
- #define uchar unsigned char
- static uchar j=0;
- ///----------------------------------------------------
- void jishuan(uchar i,uchar e) //i为十位,e为个位
- {
- j=((i*10)+e);
- }
- ///-----------------------------------------------------
- uchar jishuan_ok()
- {
- return (j);
- }
复制代码
|