#include "SH88F516.h"
//#include "reg52.h"
#include "absacc.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define day 3
#define BUFFER_COUNT 30
//#define TICK_10S 10
#define TICK_10S 50
#define TICK_1S 20
#define column 4 //共16个模块
//#define OE_LEVEL //有两种屏体,一种是oe1低有效,一种是高有效.
sbit ACK_SOUND=P3^3;
sbit updown=P0^7;
uchar yy_chishu=0; //发两次语音
//unsigned char code eeprom[1024] _at_ 0x0000;
unsigned char code Flash[256] _at_ 0x8000;
sbit dout=P3^0;
sbit dout2=P3^6;
sbit rck=P3^4; //stb
sbit sck=P3^1;
//模拟串口接收
//sbit di=P3^2;
sbit oe1=P3^5;
/*
sbit l1=P1^0;
sbit l2=P1^1;
sbit l3=P1^2;
*/
sbit l1=P2^4;
sbit l2=P2^5;
sbit l3=P2^6;
sbit l4=P3^7;
bit is_next=0;
bit led_on;
bit tou_1=0;
bit tou_2= 0;
bit tou_3=0;
bit is_set=0;//13 byte is received
bit is_stop=0;
bit is_start=0;
bit is_first=0;
bit rec1=0;
bit rec2=0;
bit is_pulse=0;
uchar rec_byte=0;//one_byte
uchar rec_count=0;//bit count
uchar rec_byte_count=0; //byte count
uchar jishu=0;
uchar address=0x80;
uchar count=0;
uchar shu=0;
// uchar tx_1s=0;
// uchar tx_2s=0;//for 连续时钟
// uchar tx_3s=0;//for 连续时钟
//------------------------------------------------------------
char scanw=0xfe;
// uchar code led_shu[10]={0xC0,0xF9,0xA4,0xB0,0x99,
// 0x92,0x82,0xF8,0x80,0x90};
uchar xdata buff[16][16];
uchar xdata buff2[16][16];
uchar xdata command[BUFFER_COUNT][14];
// uchar fangshi=2;
uchar time0_jishu=0;
uchar time0_1s=200; // 5*200=1000ms
uchar time0_me=0; //共几秒
bit need_fangun=0; //第1行开始翻滚了或要求更换
uchar first_line=0;
uchar fanggun_jishu=0;
bit need_fangun_1=0; //第2行要求更换
uchar fanggun_jishu_1=0;
uchar idata recv[3][3]; //接收到的三组号码
//void proc_r(void);
//void fangun(void);
//void fangun1(void);
uchar volatile idata main_count=0;
uchar volatile idata key_count=0;
uchar volatile idata yy_count=0;
uchar yy_jishu=0;
bit need_yuying=0;
// void wait_yy();
uchar who=0;
uchar yy_time0=0;
bit is_yy_start=0;
extern unsigned char code fangshi[2]; //0为语音次数,1为翻滚速度
//void lie_out(uchar shu);
//uchar idata now[4];
/*本文件为16×16点阵中文字库文件,字的横向8点构成一字节,左边点在字节的高位,字符点阵四角按左上角→左下角→右上角→右下角取字*/
//显示屏595连接方法是从右上角到右下角,一直到左上角到左下角
// extern unsigned char code qianwei[1];
//extern unsigned char code hz[18][32];
// extern unsigned char code asc[13][16];
void trans();
void ProgramFlash(void);
void EraseFlash(void);
uchar shudu=0;
void proc_input();
sbit comm_mode=P1^6;
sbit deng_mode1=P1^4;
sbit deng_mode2=P1^5;
sbit deng_off=P1^7;
sbit deng_shudu=P1^1;
sbit deng=P1^0;
sbit wireless=P1^3;
sbit deng_on=P3^2;
uchar send_buff[5];
uchar deng_mode=0; //0为1-13,1为1-8,2为9-16
void delay(uchar t){
uchar k;
uchar i;
uchar tt;
// get_out=0;
for(tt=0;tt<t;tt++)
for(i=0;i<10;i++)//10ms
{
for(k=0;k<200;k++)
{
/*
if(r_ok==1){
get_out=1;
goto d_out;
}
*/
_nop_();
}
}
// d_out:
_nop_();
}
void proc_input()
{
/*
sbit comm_mode=P1^6;
sbit deng_mode1=P1^4;
sbit deng_mode2=P1^5;
sbit deng_off=P1^7;
sbit deng_shudu=P1^1;
sbit deng=P1^0;
*/
//0x55,mode(0为走灯,1为关灯,2为调速,3为点灯模式,4为某一个按钮停止),
//对应值 (其中点灯模式0为1-13,1为1-8,2为9-16;停止按钮从1-16;调速值从0-20,0为50ms,20为1s),crc
uchar i;
i=0;
//-------------------走灯
if(deng==0)
{
delay(1);
if(deng==0)
{
send_buff[1]=0;
trans();
while(deng==0)
_nop_();
}
}
//--------------------关灯
if(deng_off==0)
{
delay(1);
if(deng_off==0)
{
send_buff[1]=1;
trans();
while(deng_off==0)
_nop_();
}
}
//--------------------点灯
if(deng_on==0)
{
delay(1);
if(deng_on==0)
{
send_buff[1]=5;
trans();
while(deng_on==0)
_nop_();
}
}
//--------------------调速
if(deng_shudu==0)
{
delay(1);
if(deng_shudu==0)
{
send_buff[1]=2;
shudu++;
if(shudu>=20)
shudu=0;
send_buff[2]=shudu;
trans();
EraseFlash();
ProgramFlash();
while(deng_shudu==0)
_nop_();
}
}
//-------------------点灯模式
if(deng_mode!=1)
{
if(deng_mode1==0)
{
delay(1);
if(deng_mode1==0)
{
send_buff[1]=3;
send_buff[2]=1;
deng_mode=1;
trans();
}
}
}
if(deng_mode!=2)
{
if(deng_mode2==0)
{
delay(1);
if(deng_mode2==0)
{
send_buff[1]=3;
send_buff[2]=2;
deng_mode=2;
trans();
}
}
}
if(deng_mode!=0)
{
if(deng_mode1==1&&deng_mode2==1)
{
delay(1);
if(deng_mode1==1&&deng_mode2==1)
{
send_buff[1]=3;
send_buff[2]=0;
deng_mode=0;
trans();
}
}
}
//------------------------------- 某一个按钮停止
if(P0!=0xff)
{
delay(1);
if(P0!=0xff)
{
send_buff[1]=4;
for(i=0;i<8;i++)
{
if((P0&(1<<i))==0)
{
send_buff[2]=i+1;
break;
}
}
trans();
while(P0!=0xff)
_nop_();
}
}
if(P2!=0xff)
{
delay(1);
if(P2!=0xff)
{
send_buff[1]=4;
for(i=0;i<8;i++)
{
if((P2&(1<<i))==0)
{
send_buff[2]=i+1+8;
break;
}
}
trans();
while(P2!=0xff)
_nop_();
}
}
}
void EraseFlash(void)
{
/*
bit EA_BAK = EA;
//---------------------------------------
EA = 0; //step 1
// IB_CLK1 = (ERASE_CLK>>8)&0xff;
// IB_CLK0 = (ERASE_CLK)&0xff; //step 2
XPAGE = 0x80; //step 3
IB_OFFSET=0;
IB_CON1 = 0xE6; //step 4
IB_CON2 = 0x05;
IB_CON3 = 0x0A;
IB_CON4 = 0x09;
IB_CON5 = 0x06;
_nop_(); //step 5
_nop_();
_nop_();
_nop_();
//---------------------------------------
EA = EA_BAK;
*/
}
void ProgramFlash(void)
{
/*
bit EA_BAK = EA;
//---------------------------------------
EA = 0; //step 1
XPAGE =0x80; //step 3
IB_OFFSET= 0;
IB_DATA = shudu; //step 4
IB_CON1 = 0x6E; //step 5
IB_CON2 = 0x05;
IB_CON3 = 0x0A;
IB_CON4 = 0x09;
IB_CON5 = 0x06;
_nop_(); //step 6
_nop_();
_nop_();
_nop_();
EA = EA_BAK;
*/
}
void init(void){
uchar i,j;
uchar m,n;
for(i=0;i<100;i++)
for(j=0;j<200;j++)
_nop_();
/*
P3M0=0x0c;//00001100;
P3M1=0xf3;//11110011;
//P1M0=0x00;//00001100;
//P1M1=0xff;//11110011;
// P1M0|=1<<2;
// P1M1&=~(1<<2);
P1M0=0x00;//00001100;
P1M1=0x00;//11110011;
P1M0=0xf7; //11110111 //p1.2为仅输入
P1M1=0x08; // 00001000 p1.3为推挽
P0M0=0xff;//00001100; 按钮1-8号
P0M1=0x00;//11111111;
P2M0=0xff;//00001100;
P2M1=0x00;//11111111;按钮9-16号
*/
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
count=0;
scanw=0xfe;
TMOD=0x21 ;//gate, c/t, m1,m0,gate,c/t,m1,m0
//TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的
//timer是 104.167*11.0592/12= 96
//但是必须是一半,即96×2=192
//这里使用4800波特率,晶震使用22.1184,则 timer是 104.167*2*11.0592/12= 192
//
TH1 =0xfd;
TL1=0xfd; //9600 bps
SCON=0x50; //8 bit
PCON=0x00;
TR1=1;
/*
TL0=0x0;
TH0=0x4C; //50MS 2^16-50ms/(12/11.059*10^6) //10ms为DC00;5MS为EE00
*/
//1个时钟周期
TL0=0x0;
TH0=0x4c; //50MS 2^16-50ms*(12/11.059*10^6) //10ms为DC00;5MS为EE00;50ms为4c00
// TH0=0X4C;
// SCON=0x00; //sm0,sm1,sm2,ren,tb8,rb8,ti,ri
//CLKCON=0; //fsys=fosc
//CLKCON=0x40; //fsys=fosc /4
// SM2_TXCOL=1; //同步输出=fsys/4
PCON=0x00; //
T2CON=0;