/****先定义数组类型再赋值**L310*********/
/*2014 8 21 10:01**PAST*CODE1000**TEST**/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sfr AUXR=0x8e; //辅助寄存器
sfr SADDR=0xA9; //从机地址寄存器
sfr SADEN=0xB9; //从机地址屏蔽寄存器
typedef uchar BYTE;
typedef uint WORD;
#define SLAVE 1 //定义从机编号,0 为从机 1, 1 为从机 2
#if SLAVE==0
#define SAMASK 0x33 //从机 1 地址屏蔽位
#define SERADR 0x55 //从机 1 的地址为 xx01,xx01
#define ACKTST 0x78 //从机 1 应答测试数据
#else
#define SAMASK 0x3C //从机 2 地址屏蔽位
#define SERADR 0x5A //从机 2 的地址为 xx01,10xx
#define ACKTST 0x49 //从机 2 应答测试数据
#endif
#define URMD 2 //0:使用定时器 2 作为波特率发生器
int x,a,y,j; //待放入数组的数据
int k,m,*p=&k; //数组下标位变量
uint aa=0; //
uint val,Buff;
sfr P4=0xc0;
sfr P5=0xc8;
sbit out=P5^5; //
sbit CS=P3^5; //12864 PIN4
sbit SID=P3^6; //12864 PIN5
sbit SCLK=P3^7; //12864 PIN6
sbit key1=P3^2; //
sbit key2=P3^3; //
sbit key3=P3^4; //
uint array[32],i; //定义数组a 循环总变量i
uchar code zk[]=
{
0x41,0x00,0x21,0x00,0x31,0x00,0x21,0xFC,
0x02,0x20,0x02,0x20,0xF4,0x20,0x10,0x20,
0x17,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,
0x14,0x20,0x18,0x20,0x10,0x20,0x00,0x20,
};
/*------------------延时子程序----------------------*/
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++);
}
/*------------------写命令到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;
delay_1ms(100);
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,即为第一行的首位*/
}
/*------------初始化串口---------------------*/
void InitUart()
{
SADDR=SERADR;
SADEN=SAMASK;
SCON=0x50; //8位数据,可变波特率允许接收
#if URMD==0
T2L=0xDF; //设置波特率重装值
T2H=0xFE; //9600bps(65536-11059200/4/9600)
AUXR &=0x40; //定时器1时钟为Fosc/12,即12T
AUXR&=0xFE; //串口1选择定时器1为波特率发生器
#elif URMD==1
AUXR=0x40; //定时器 1 为 1T 模式
TMOD=0x20; //设定定时器1为16位自动重装方式
TL1=0xDF; //设定定时初值
TH1=0xFE; //设定定时初值
ET1=0; //禁止定时器1中断
TR1=1; //启动定时器1
#else
TMOD=0x20; //设置定时器 1 为 8 位自动重装载模式
AUXR=0x40; //定时器 1 为 1T 模式
TL1=TH1=0xDB; //9600 bps(256 - 11059200/32/9600)
TR1=1;
#endif
}
/****************************************************/
void timer0() interrupt 1
{
aa=aa+1;
TH0=0X53;
TL0=0X32;
if(aa==500)
out=!out,
aa=0;
}
/*--------UART 中断服务程序----Buff=SBUF---------------*/
void Uart() interrupt 4 using 1
{
if(RI)
{
array[i]=SBUF; //数组下标位置的数据等于j
i++; //m加一
RI=0;
}
}
/*--------显示 程序-------------------*/
void uartdisp()
{
a=0;
x=0;
for(y=0;y<=16;)
{
if(x==0)
{
write_com(0x36); //写入数据的地址
write_com(y+0X80); //起始地址加计数地址80->8F
write_com(0X80); //列地址
write_com(0x30); //扩充指令
write_data(zk[a]); //一个字符的左半部 前一个字节
a++;
}
else
{
write_data(zk[a]); //一个字符的右半部 后一个字节
a++;
y++;
}
x=~x;
if(y>=16)
{
write_com(0x34);
write_com(0x36);
}
}
}
/*--------显示 程序-------------------*/
void disp()
{
a=0;
x=0;
for(y=0;y<=16;)
{
if(x==0)
{
write_com(0x36); //写入数据的地址
write_com(y+0X80); //起始地址加计数地址80->8F
write_com(0X80); //列地址
write_com(0x30); //扩充指令
write_data(array[a]);//一个字符的左半部 前一个字节
a++;
}
else
{
write_data(array[a]);//一个字符的右半部 后一个字节
a++;
y++;
}
x=~x;
if(y>=16)
{
write_com(0x34);
write_com(0x36);
}
}
}
/****************************************************/
void send(unsigned temp)
{
unsigned serial;
serial=temp;
SBUF=(unsigned char)temp;
while(TI!=1);
TI=0;
}
/****************************************************/
void main()
{
lcd_init(); //初始化LCD屏
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01;
TH0=0X53;
TL0=0X32;
ET0=1;
TR0=1;
i=0;
m=0;
InitUart(); //初始化串口
EA=1;
ES=1;
while(1)
{
if(!key1)
{
i=0;
disp();
}
if(!key2)
{
i=0;
out=0;
for(k=0;k<32;k++) // zk[]
{
send(array[k]);
delay(200);
}
delay(2000);
out=1;
}
if(!key3) //
{
uartdisp();
}
}
}