/*最大 PAST 999999 正負數測試*****/
/*****L368 CODE 1799 2018 3 3 17:38*/
/*****-------------------***********/
/*****|負 0 0 2 4 6 8 |**********/
/*****|負 0 0 2 4 6 8 |**********/
/*****| |**********/
/*****| |**********/
/*****-------------------***********/
#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
long p1,p2,p3;
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_In1=P0^3;
sbit Key_In2=P0^2;
sbit Key_In3=P0^1;
sbit Key_In4=P0^0;
sbit Key_Rst=P0^3;
sbit Key_Motor=P0^1; //電機
sbit LED0=P0^2;
void IapIdle();
void IapProgramByte(WORD addr, BYTE dat);
uchar i,j,k,l,m,n;
void delay_iic(int v); /****eeprom讀寫延時**/
void delay(uint k); /****延時****/
uchar code disdt[10]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9};
/*------------------延時子程序------------------------*/
void delay(unsigned int t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<500;j++);
}
/*------------------延時子程序------------------------*/
void delay_1ms(uint x)
{
int i, j;
for (i=0;i<x;i++)
for (j=0;j<1500;j++);
}
/*------------------寫命令到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;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
}
/*-------------------寫數據到LCD----------------------*/
void write_data(unsigned char Dispdata)
{
uchar i;
uchar i_data,temp_data1,temp_data2;
i_data=0xfa;
delay(10);
CS=1;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=Dispdata;
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=Dispdata;
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;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
}
/*------------------初始化LCD屏-----------------------*/
void lcd_init()
{
uchar comdata;
RST=0;
delay_1ms(100);
RST=1;
comdata=0x30;
write_com(comdata); /*功能設置:一次送8位數據,基本指令集*/
comdata=0x04;
write_com(comdata); /*點設定:顯示字符/光標從左到右移位,DDRAM地址加1*/
comdata=0x0f;
write_com(comdata); /*顯示設定:開顯示,顯示光標,當前顯示位反白閃動*/
comdata=0x01;
write_com(comdata); /*清DDRAM*/
comdata=0x02;
write_com(comdata); /*DDRAM地址歸位*/
comdata=0x80;
write_com(comdata); /*把顯示地址設爲0X80,即爲第一行的首位*/
}
/*----關閉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 chuang_Six(long X)
{
i=X/100000;
j=(X/10000)%10;
k=(X/1000)%10;
l=(X/100)%10;
m=(X/10)%10;
n=X%10;
}
/********************************/
void Dis_XMemory(long X)
{
if(X>=0) //
{
write_com(0x80);
write_data(0XD5); /*半個字符*/
write_data(0XFD); /*正*/
}
else
{
write_com(0x80);
write_data(0XB8); /*半個字符*/
write_data(0XBA); /*負*/
X=X-2*X;
}
chuang_Six(X);
write_com(0x81);
write_data(0xA3); /*半個字符*/
write_data(disdt[i]); /**/
write_com(0x82);
write_data(0xA3); /*半個字符*/
write_data(disdt[j]); /**/
write_com(0x83);
write_data(0xA3); /*半個字符*/
write_data(disdt[k]); /**/
write_com(0x84);
write_data(0xA3); /*半個字符*/
write_data(disdt[l]); /**/
write_com(0x85);
write_data(0xA3); /*半個字符*/
write_data(disdt[m]); /**/
write_com(0x86);
write_data(0xA3); /*半個字符*/
write_data(disdt[n]); /**/
}
/********************************/
void Dis_NewData(long X)
{
if(X>=0) //
{
write_com(0x90);
write_data(0XD5); /*半個字符*/
write_data(0XFD); /*正*/
}
else
{
write_com(0x90);
write_data(0XB8); /*半個字符*/
write_data(0XBA); /*負*/
X=X-2*X;
}
chuang_Six(X);
write_com(0x91);
write_data(0xA3); /*半個字符*/
write_data(disdt[i]); /**/
write_com(0x92);
write_data(0xA3); /*半個字符*/
write_data(disdt[j]); /**/
write_com(0x93);
write_data(0xA3); /*半個字符*/
write_data(disdt[k]); /**/
write_com(0x94);
write_data(0xA3); /*半個字符*/
write_data(disdt[l]); /**/
write_com(0x95);
write_data(0xA3); /*半個字符*/
write_data(disdt[m]); /**/
write_com(0x96);
write_data(0xA3); /*半個字符*/
write_data(disdt[n]); /**/
}
/***AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)***/
void Write_Value(long Value)
{
if(Value<0) //è?1?ValueD?óú0?a?oêy
{
p1=Value; //×?μí??
p2=Value>>8; //μú?t??
p3=Value>>16&0XFF; //£¨1111 11μú??????????áù??£?£¨XXμúèy??è?μíá???£? ×??????a?o êy×?ò?21êyD?ê?2úéú
}
else //·??ò′óóú0?a?yêy
{
p1=Value; //×?μí??
p2=Value>>8; //μú?t??
p3=Value>>16&0X03; //0000 0011 ×??????a?y ?á±???áù??
}
}
/************AT24CXX_ReadOneByte(u16 ReadAddr)********************/
long Read_X()
{
uchar s;
long n,X;
s=p3; //×?????
n=s&0X80; //1000 0000?àó?
if(n==0X80) //×??????aò?μèóú?oêy
{
X=0XFF; //FFH 1111 1111
}
else //?y
{
X=0X00; // 0000 0000
}
X=X<<8; //×?????μú????×óò?8??
X=X|s; //oíμúèy???à?òè?μúèy??μ?μíá????μ
X=X<<8; //×óò?8??
X=X|p2; //oíμú?t???à?ò
X=X<<8; //×óò?8??
X=X|p1; //oíμúò????à?ò
return X;
}
/*------------------主循環程序----------------*/
void main( ) /*主程序開始*/
{
uchar x;
long h;
lcd_init() ; /*液晶復位*/
delay(5000);
while(1) /*主函數循環*/
{ /*開始kcounter,kstatus*/
Dis_XMemory(-2468);
delay(5000);
Write_Value(-2468);
h=Read_X();
Dis_NewData(h);
for(x=0;x<20;x++)
{
delay(500);
LED0=!LED0;
}
delay(5000);
lcd_init() ; /*液晶復位*/
Dis_XMemory(7236);
Write_Value(7236);
h=Read_X();
Dis_NewData(h);
for(x=0;x<20;x++)
{
delay(500);
LED0=!LED0;
}
delay(5000);
lcd_init() ; /*液晶復位*/
} //while 循環
} //主循環