/*****2017新波纹管板功能设置速度一 速度二参数*L769 CODE2476***/
/***按合模开模键OUT1,OUT2闪烁,按手动中断OUT1,OUT2停止闪烁 ***/
/***主程序检测功能设置,启动定时器0,定时器2按键 左中左下*****/
/*按下左中启动定时器2,按下左下启动定时器0,按中断3.2退出运行*/
/***2017 12 25 11:50 PAST 运行变量vala,valb到设定值后停止****/
/***STC15W1K16S*czdpj@163.com*13775061792 蔡志洪**************/
#include <reg52.h>
#include <intrins.h>
#include <stdlib.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char //自定义关键字
#define IAP_ADDRESS 0x0000 //EEPROM首地址
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
uchar kcounter,kstatus; //按键计数标志 按键状态标志
int func; /*功能键判断标志*/
uint val,val1,val2; /*速度A速度B*/
uint vala,valb; /*脉冲计数AB*/
uint aa,bb;
sbit CS=P3^4; // 12864PIN4 RS vala显示缓冲valb加减时间处理缓冲
sbit SID=P3^3; // 12864PIN5 RW
sbit SCLK=P1^6; // 12864PIN6 E INT0
sbit RST=P3^0;
sbit INT0=P3^2; //
sbit Key_Out1=P4^5;
sbit Key_Out2=P4^6;
sbit Key_Out3=P2^7;
sbit Key_Out4=P2^6;
sbit Key_Out5=P2^5;
sbit Key_In0=P3^2;
sbit GN=P0^3;
sbit Key_Rst=P0^3;
sbit Key_In1=P0^3;
sbit Key_In2=P0^2;
sbit Key_In3=P0^1;
sbit Key_In4=P0^0;
sbit OUT1=P0^5; /****输出信号****/
sbit OUT2=P0^4; /****输出信号****/
bit MOTARUN_FLAG,MOTBRUN_FLAG; /****电机A,电机B运行标志位 0 1****/
void IapIdle();
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);
uint l,m,n,k,s,g; /****个十百代码缓冲**/
uint t1,t2,t3; /****总数个十百千****/
bit Sign,adddecbit; /*功能设置运行标志 加减位标志01*/
void display2(void);
uchar code disdt[10]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9};
/*------------------延时子程序------------------------*/
void delay_1ms(uint x)
{
int i, j;
for (i=0; i<x; i++)
for (j=0;j<1500;j++);
}
/*------------------延时子程序-----------------------------*/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/*----关闭IAP----------------------------*/
void IapIdle()
{
IAP_CONTR=0; //关闭IAP功能
IAP_CMD=0; //清除命令寄存器
IAP_TRIG=0; //清除触发寄存器
IAP_ADDRH=0x80; //将地址设置到非IAP区域
IAP_ADDRL=0;
}
/*-从ISP/IAP/EEPROM区域读取一字节-*/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //数据缓冲区
IAP_CONTR=ENABLE_IAP; //使能IAP
IAP_CMD=CMD_READ; //设置IAP命令
IAP_ADDRL=addr; //设置IAP低地址
IAP_ADDRH=addr>>8; //设置IAP高地址
IAP_TRIG=0x5a; //写触发命令(0x5a)
IAP_TRIG=0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat=IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR=ENABLE_IAP; //使能IAP
IAP_CMD=CMD_PROGRAM; //设置IAP命令
IAP_ADDRL=addr; //设置IAP低地址
IAP_ADDRH=addr>>8; //设置IAP高地址
IAP_DATA=dat; //写ISP/IAP/EEPROM数据
IAP_TRIG=0x5a; //写触发命令(0x5a)
IAP_TRIG=0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*---扇区擦除---------------*/
void IapEraseSector(WORD addr)
{
IAP_CONTR=ENABLE_IAP; //使能IAP val=IapReadByte(IAP_ADDRESS+1);
IAP_CMD=CMD_ERASE; //设置IAP命令
IAP_ADDRL=addr; //设置IAP低地址
IAP_ADDRH=addr>>8; //设置IAP高地址
IAP_TRIG=0x5a; //写触发命令(0x5a)
IAP_TRIG=0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*-----------------------------------------*/
void red_eeprom(void)
{
l=IapReadByte(IAP_ADDRESS+1); //设定波值百位
m=IapReadByte(IAP_ADDRESS+2); //设定波值十位
n=IapReadByte(IAP_ADDRESS+3); //设定波值个位
val1=l*100+m*10+n; //设定波值
l=IapReadByte(IAP_ADDRESS+4); //设定波值百位
m=IapReadByte(IAP_ADDRESS+5); //设定波值十位
n=IapReadByte(IAP_ADDRESS+6); //设定波值个位
val2=l*100+m*10+n; //设定波值
}
/***********************/
void write_eeprom(void)
{
IapEraseSector(IAP_ADDRESS); //扇区擦除
l=val1/100;
m=(val1-l*100)/10;
n=val1-l*100-m*10;
IapProgramByte(IAP_ADDRESS+1,l); //设定波值百位
IapProgramByte(IAP_ADDRESS+2,m); //设定波值十位
IapProgramByte(IAP_ADDRESS+3,n); //设定波值个位
l=val2/100;
m=(val2-l*100)/10;
n=val2-l*100-m*10;
IapProgramByte(IAP_ADDRESS+4,l); //设定波值百位
IapProgramByte(IAP_ADDRESS+5,m); //设定波值十位
IapProgramByte(IAP_ADDRESS+6,n); //设定波值个位
}
/*------------------写命令到LCD-----------------------*/
void write_com(unsigned char cmdcode)
{
uchar i;
uchar i_data,temp_data1,temp_data2;
i_data=0xf8;
delay(10);
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=cmdcode;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=cmdcode;
temp_data1=i_data&0xf0;
temp_data2=i_data&0x0f;
temp_data1>>=4;
temp_data2<<=4;
i_data=temp_data1|temp_data2;
i_data&=0xf0;