#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#include<string.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD_data P2 //???
sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000
sbit LCD_RS = P0^7; //???????
sbit LCD_RW = P0^6; //???/???
sbit LCD_EN = P0^5; //??????
sbit LCD_PSB = P0^4; //?/?????
sbit LCD_RST = P0^3; //??????
sbit LED = P3^7;
sbit BELL = P3^6;
sbit jidian= P0^0;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
#define FOSC_110592M
uchar code num[]={'0','1','2','3','4','5','6','7','8','9'}; //数字显示寄存器
uint mima[6]={0}; //客户输入密码寄存器
uchar miling[6]={1,2,3,4,5,6}; //密码寄存器
uchar shed[]={8,8,3,1,1,6}; //预设密码寄存器
uchar code DIS1[] = {"请输"};
uchar code DIS2[] = {"密码"};
uchar code DIS3[] = {"误"};
uchar code DIS4[] = {"旧码"};
uchar code DIS5[] = {"新码"};
uchar code DIS6[] = {"重置吗"};
uchar code DIS7[] = {"报警"};
uchar code led1[] = {"123 0 456789234 1 567890345 2 678901"}; //可变键盘寄存器
uchar xdata led2[] ={" "};
uchar code led3[] = {"0123456789"};
unsigned int rec_data_len_uart=0; //标记Buffer_Uart0接收数组
unsigned char idata Buffer_Uart0_Rec[25]={0}; //Uart0中断接收数组
uchar hang,keyvalue,flag=0,mode=0,moshi=0,warn=0,jb=0,bian=0,ssb=0; //行、按键数值寄存、工作状态寄存、密码位数寄存、显示寄存
uchar keydown();
void delaykey(uint t);
void display(uchar key);
void SerialInti()//初始化程序(必须使用,否则无法收发)
{
TMOD=0x20;//定时器1操作模式2:8位自动重载定时器
#ifdef FOSC_12M //在这里根据晶振大小设置不同的数值初始化串口
TH1=0xf3;//装入初值,波特率2400
TL1=0xf3;
#else
TH1=0xfd;//装入初值,波特率9600
TL1=0xfd;
#endif //end of SOC_12M
TR1=1;//打开定时器
SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
EA=1;//开总中断
ES=1;//开串行口中断
}
unsigned char hand(unsigned char *data_source,unsigned char *ptr)
{
if(strstr(data_source,ptr)!=NULL)
return 1;
else
return 0;
}
void clear_rec_data()
{
uchar i,temp_len;
temp_len=strlen(Buffer_Uart0_Rec);
if(temp_len>25)
{
temp_len=25;
}
for(i=0;i<temp_len;i++)
{
Buffer_Uart0_Rec[i]='\0';
}
rec_data_len_uart=0;
}
/*串行通讯中断,收发完成将进入该中断*/
void Serial_interrupt() interrupt 4
{
unsigned char temp_rec_data_uart0;
temp_rec_data_uart0 = SBUF;//读取接收数据
RI=0;//接收中断信号清零,表示将继续接收
Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0; //接收数据
rec_data_len_uart++;
if(rec_data_len_uart>24)
{
rec_data_len_uart=0; //从头开始接收数据
}
}
void Uart1Send(uchar c)
{
SBUF=c;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
}
//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
str++;
}
}
//延时函数大概是1s钟,不过延时大的话不准...
void DelaySec(int sec)
{
uint i , j= 0;
for(i=0; i<sec; i++)
{
for(j=0; j<65535; j++)
{
}
}
}
void baojing()
{
warn=0;
flag=2;
LED=~LED;
jb=1;
}
void delay1ms(void)
{
unsigned char a,b;
for(b=180;b>0;b--)
for(a=100;a>0;a--);
_nop_();
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay1(int ms)
{
while(ms--)
{
uchar y;
for(y=0;y<100;y++) ;
}
}
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P2&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P2 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P2 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_init()
{
LCD_PSB = 1; //????
LCD_RST = 0; //????
delay(3);
LCD_RST = 1;
delay(3);
lcd_wcmd(0x30); //??????
delay(5);
lcd_wcmd(0x0C); //???,???
delay(5);
lcd_wcmd(0x01); //??LCD?????
delay(5);
}
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //????
}
void lcdflag()
{
lcd_wcmd(0x08);
delay(400);
lcd_wcmd(0x0c);
delay(400);
lcd_wcmd(0x08);
delay(400);
lcd_wcmd(0x0c);
delay(400);
lcd_wcmd(0x08);
delay(200);
lcd_wcmd(0x0c);
delay(5);
lcd_wcmd(0x01);
delay(5);
}
/*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //??????
delay(5);
lcd_wcmd(0x30); //??????
delay(5);
lcd_wcmd(0x01); //??
delay(5);
}
void delaykey(uint t)
{
unsigned char i, j;
while(t--)
{
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
uchar keydown()
{
keyvalue=100; //没有按键输入的时候不动作
P1=0xf0;
if(P1!=0xf0)
{ delaykey(1);
if(P1!=0xf0)
{ P1=0xf0;
switch(P1)
{
case(0xe0): hang=0;break;
case(0xd0): hang=3;break;
case(0xb0): hang=6;break;
case(0x70): hang=9;break;
}//检测行
P1=0x0f;
switch(P1)
{
case(0x0e): keyvalue=hang+1;break;
case(0x0d): keyvalue=hang+2;break;
case(0x0b): keyvalue=hang+3;break;
case(0x07): keyvalue=hang+20;break;
}
} while(P1!=0x0f)
{
P1=0x0f;
}
delaykey(1);
}
keyvalue=keyvalue+bian/12;
return keyvalue;
}
void main()
{
uchar i=1;
lcd_init();//初始化LCD
LED=1; //关闭LED
BELL=0; //关闭喇叭
jidian=0;
lcd_pos(1,0); //设置初始屏幕显示
for(i=0+bian;i<6+bian;i++)
{
lcd_wdat(led1[i]);
delay(1);
}
lcd_pos(2,0);
for(i=6+bian;i<9+bian;i++)
{
lcd_wdat(led1[i]);
delay(1);
}
lcd_pos(3,0);
for(i=9+bian;i<12+bian;i++)
{
lcd_wdat(led1[i]);
delay(1);
}
lcd_pos(1,4);
for(i=0;i<4;i++)
{
lcd_wdat(DIS1[i]);
delay(1);
}
lcd_pos(2,4);
for(i=0;i<4 ;i++)
{
lcd_wdat(DIS2[i]);
delay(1);
}
while(1) //循环检测按键
{display(keydown());
if(jb==1)
{
BELL=1;
i=1;
SerialInti();
DelaySec(10);//延时约15
//----------------为什么是下面这些AT指令呢,请看群共享文件SIM900A重要的短信指令文件------------
Uart1Sends("AT+CSCS=\"GSM\"\r\n");
DelaySec(1);//延时大约3秒
BELL=0;
Uart1Sends("AT+CMGF=1\r\n");
DelaySec(1);//延时3秒0
Uart1Sends("AT+CSCA?\r\n");
DelaySec(1);//延时3秒
Uart1Sends("AT+CSMP=17,167,0,241\r\n");
DelaySec(1);//延时3秒
Uart1Sends("AT+CMGS=\"00000000000\"\r\n");//此处修改为对方的电话号
DelaySec(1);//延时3秒
Uart1Sends("warning stolen");//修改短信内容,短信内容可为英文和数字
Uart1Send(0x1a);
DelaySec(15);//延时20秒
LED=~LED;
jb=0;
}
}
}
void display(uchar key)
{
uchar i,j,k;
if(key==100) //没有按键输入的时候不动作
{}
else
{
clr_screen();//清屏
if(key==11) //判断按键0
{
key=0;
}
lcd_pos(1,0);//初始化显示按键数字
for(i=0+bian;i<6+bian;i++)
{
lcd_wdat(led1[i]);
delay(1);