📄 lcm16864zk.c
字号:
#include <absacc.h>
#include <reg51.h> //声明了各种寄存器 和变量
#include "main.h" //声明了所有的函数
#define PRINTBYTE XBYTE[0x9FFF] //打印地址
#define WARNBYTE XBYTE[0x5FFF] //射频报警地址
#define LEDBYTE XBYTE[0X1FFF] //显示芯片地址
sbit BUSY=P3^2;
void main(void)
{
SP=0x30;
Delay_ms(2);
SystemInitial(); //系统初始化
while(1)
{
Delay_ms(10); //显示初始画面
ShowTime();
if(LKEY==0)
{
Delay_ms(10);
if(LKEY==0)
{
while(1){if(LKEY==1)break;}
ShScreen1();
DisplayInitial();
}
}
if(flag)
{
flag=0;
/* TH0=0X3C;
TL0=0XB0;
TMOD=0X01;
*/
WarnDeal();
Delay_s(1);
DisplayInitial();
}
}
}
void SystemInitial(void) // 系统初始化程序
{
uchar i;
IE=0X95; //中断控制初始化
PCON=0Xa0;
SCON=0X90; //串行口波特率加倍
REN=1;
IT1=0;
P3=0XFF; //P1,P3口的第二的功能先输出1
for(i=0;i<=3;i++) //密码初始化为0000
CodeNum[i]=0;
//报警数据初始化
pdx=0x0100; //防抢设置向量地址
*pdx=0x00; // 向量数目
pdx=0x0200; //防盗设置向量首地址
*pdx=0x00;
pdx=0x0300; //放火设置向量首地址
*pdx=0x00;
pdx=0x0400; //报警发生存储向量首地址
*pdx=0x00;
RobDataInitial();
CalendarInitial(calen); //日历芯片初始化
BurstR1302(calen); //输入日历的初始值
ShowInitial(); //显示模块初始化
DisplayInitial(); //显示初始画面
}
void ShowInitial(void) //显示初始化
{
P2=0X1F;
Delay_ms(22); //delay > 40ms
//i=00110000B;
WritCommand(0x30); //function set
Delay_us(6); //delay > 100us
WritCommand(0x30); //function set
Delay_us(3); //delay > 37us
WritCommand(0x0c); //display set D=1 C=1 B=0
Delay_us(6); //>100us
WritCommand(0x01); //display clear
Delay_ms(7); //>10ms
//i=00000110B
WritCommand(0x06); //enter nod set
P2=0X0F;
}
void RobDataInitial(void)
{
pdx=0x0100;
*pdx=6;
pdx=0x0102;
*pdx=100;
pdx=0x0103;
*pdx=2;
RobNum=2; //最少与数
pdx++;*pdx=0x07; pdx++;*pdx=0x00; // 0111 高级
pdx++;*pdx=0x01;pdx++;*pdx=0x01;
pdx++;*pdx=0x04; pdx++;*pdx=0x00; // 0100 高级
pdx++;*pdx=0x02;pdx++;*pdx=0x01;
pdx++; *pdx=0x08; pdx++;*pdx=0x00; // 1000 高级
pdx++;*pdx=0x03;pdx++;*pdx=0x01;
pdx++; *pdx=0x02; pdx++;*pdx=0x00; // 0010 低级
pdx++;*pdx=0x04;pdx++;*pdx=0x00;
pdx++; *pdx=0x01; pdx++;*pdx=0x00; // 0001 低级
pdx++;*pdx=0x05;pdx++;*pdx=0x00;
pdx++; *pdx=0x0a; pdx++;*pdx=0x00; // 1010 低级
pdx++;*pdx=0x06;pdx++;*pdx=0x00;
pdx=0x0302;*pdx=0x0a;pdx=0x0300;*pdx=0x01;
}
/////////////////////////////////////////////////////延时程序 us ms s
void Delay_us(uchar i) //delay 8 * i us
{
uchar j;
for(j=0;j<i;j++);
}
void Delay_ms(uchar i) // delay i * 1000 us=i ms
{
uchar sum=125,j,k;
for(j=0;j<i;j++)
for(k=0;k<sum;k++);
}
void Delay_s(uchar i)
{
uint sum=125000,k;
uchar j;
for(j=0;j<i;j++)
for(k=0;k<sum;k++);
}
///////////////////////////////////////////////////////
////////////////////////////////////////////////////////LED显示程序
void WritCommand(uchar i) //写命令
{
// P2=0X1F;
Waitfree();
S_RS=0;
S_RW=0;
E=1; //E=1
/* P0 = i;
_WR=0;
_WR=1; */
LEDBYTE=i;
E=0; //E=0
// P2=0X0F;
}
//////////////////////////////////////////////////////////
void WritData(uchar i) //写数据
{
// P2=0X1F;
Waitfree();
S_RS=1;
S_RW=0;
E=1; //E=1
/* P0=i;
_WR=0;
_WR=1; */
LEDBYTE=i;
E=0;
// P2=0X0F;
}
void Waitfree(void) //送数据入LED芯片的等待程序,判断数据线是否忙
{
P0=0XFF;
S_RS=0;
S_RW=1;
_RD=0;
ACC=P0;
while(ACC7==1)
{
_RD=0;
P2=0X1F;
E=1;
ACC=P0;
// ACC=LEDBYTE;
E=0;
}
_RD=1;
S_RS=0;
S_RW=0;
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void DisplayInitial(void)
{
WritCommand(0x01); //显示初始画面
WritCommand(0x91);
WritData(0xBC);WritData(0xAF);WritData(0xB3);WritData(0xc9); //集成警务系统
WritData(0xbe);WritData(0xaf);WritData(0xce);WritData(0xf1);
WritData(0xcf);WritData(0xb5);WritData(0xcd);WritData(0xb3);
WritCommand(0x98);
WritData(0xc3);WritData(0xdc);WritData(0xc2);WritData(0xeb); //密码门
WritData(0xc3);WritData(0xc5);
WritCommand(0x89);
WritData(0xcf);WritData(0xe6);WritData(0xcc);WritData(0xb6); //湘潭大学研制
WritData(0xb4);WritData(0xf3);WritData(0xd1);WritData(0xa7);
WritData(0xd1);WritData(0xd0);WritData(0xd6);WritData(0xc6);
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////日历程序
void CalendarInitial(pcalen)//日历初始化程序
uchar pcalen[8];
{
uchar i;
BurstW1302(pcalen); //读日历,并送到pcalen[]中
i=Read1302(0x80);
i=i&0x7f; //ch=0
Writ1302(0x80,i); //起震,
}
void BurstR1302(pcalen) // 从1302读多字节,并存入日历数组中
uchar pcalen[8];
{
uchar i;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(0xbf); //oxbf 时钟多字节读命令
for(i=0; i<8; i++)
{
*pcalen=RTOutputByte(); //读1BYTE的数据
pcalen++ ;
}
T_CLK=1;
T_RST=0;
}
////////////////////////////////////////////////////////
void RTInputByte(udata) //向1302写入一字节的数据
uchar udata;
{
uchar i;
ACC=udata;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/////////////////////////////////////////////////////
uchar RTOutputByte(void) //从1302读一字节的数据
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
//////////////////////////////////////////////////////
void Writ1302(uchar uAddr,uchar udata) //写1字节的数据入指定地址
{
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(uAddr); //先输入地址
RTInputByte(udata); //写数据
T_CLK=1;
T_RST=0;
}
//////////////////////////////////////////////////////
uchar Read1302(uchar uAddr) //从指定地址读出1字节数据
{
uchar udata;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(uAddr); //写入地址
udata=RTOutputByte(); //读出数据
T_CLK=1;
T_RST=0;
return(udata);
}
/////////////////////////////////////////////////////
void BurstW1302(pcalen) //写入多字节的数据
uchar pcalen[8];
{
uchar i;
Writ1302(0x8e,0x00); //WP=0,写操作
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(0xbe); //0xbe ;时钟多字节写命令
for(i=8;i>0;i--)
{
RTInputByte(*pcalen);
pcalen++;
}
T_CLK=1;
T_RST=0;
}
////////////////////////////////////////////////////
void ShowTime(void) //时间显示 能自动从DS1302中读取时间数据显示在第一行
{
uchar i;
BurstR1302(calen);
i=0x80;
WritCommand(i);
i=calen[6];
ShowTimes(i);
i=0x2f;
WritData(i);
i=calen[4];
ShowTimes(i);
i=0x2f;
WritData(i);
i=calen[3];
ShowTimes(i);
i=0x2f;
WritData(i);
i=calen[2];
ShowTimes(i);
i=0x3a;
WritData(i);
i=calen[1];
ShowTimes(i);
i=calen[0];
ShowTimes(i);
}
////////////////
void ShowTimes(uchar i) //数字到BCD码的转换 因为LED显示的是BCD码
{
uchar m,n;
m=i>>4;
m=m+0x30;
n=i&0x0f;
n=n+0x30;
WritData(m);
WritData(n);
}
////////////////////////////////////////////////////////////////// 进入系统设置画面
void ShScreen1(void)
{
uchar i,j=0,k=0;
uchar CodeNum1[4];
while(1) {if(LKEY==1) break; }
//整体显示开 游标位置开
WritCommand(0x0e);
WritCommand(0x01);
ShowPart1();
WritCommand(0x90);
WritData(0xcf);WritData(0xb5);WritData(0xcd);WritData(0xb3); //显示系统密码:0
WritData(0xc3);WritData(0xdc);WritData(0xc2);WritData(0xeb);
WritData(0x3a);WritData(0x20);WritData(0x20);WritData(0x20);
WritData(0x20);WritData(0x20);
WritCommand(0x94);
WritData(0xa3);
WritData(0xb0);
WritCommand(0x10);
while(k<4)
{
if(LKEY==0)
{
Delay_ms(10);
if(LKEY==0)
{
while(1){if(LKEY==1) break;}
CodeNum1[k]=j;
k++;
for(i=0;i<4;i++) //判断密码是否正确
{
j=CodeNum[i];
if(CodeNum1[i]!=j)
{
WritCommand(0x01);
WritCommand(0x91);
WritData(0xc3);WritData(0xdc);WritData(0xc2);WritData(0xeb); //密码错误
WritData(0xb4);WritData(0xed);WritData(0xce);WritData(0xf3);
Delay_s(3);
k=0;
ShScreen1();
break;
}
}
RobSet();
StealSet();
FireSet();
CalenSet();
FuncControl();
}
break;
}
if(MKEY==0)
{
Delay_ms(10);
if(MKEY==0)
{
j++;
if(j>9) j=0;
i=0xb0+j;
WritData(0xa3);
WritData(i); //显示下个数
WritCommand(0x10);
while(1){ if(MKEY==1) break; }
}
}
if(RKEY==0)
{
Delay_ms(10); //延时去抖动
if(RKEY==0)
{
CodeNum1[k]=j;
WritCommand(0x14);
k++;
if(k>3) {k=0; WritCommand(0x94);}
WritData(0xa3);
WritData(0xb0);
WritCommand(0x10);
j=0;
while(1)
{
if(RKEY==1) break;
}
}
}
ShowTime();
WritCommand(0x94+k);
Delay_ms(10);
}
}
//////////////////////////////////////////////////////////各种显示画面
////////////////////////////////////////////////////////
void ShowPart1(void)
{
WritCommand(0x98);
WritData(0xc8);WritData(0xb7);WritData(0xc8);WritData(0xcf); //显示确认 选数 移动
WritData(0x20);WritData(0x20);WritData(0xd1);WritData(0xa1);
WritData(0xca);WritData(0xfd);WritData(0x20);WritData(0x20);
WritData(0xd2);WritData(0xc6);WritData(0xb6);WritData(0xaf);
}
void ShowPart2(void)
{
WritCommand(0x90);
WritData(0xb7);WritData(0xa2);WritData(0xc9);WritData(0xe4); //发射器编号:0
WritData(0xc6);WritData(0xf7);WritData(0xb1);WritData(0xe0);
WritData(0xba);WritData(0xc5);WritData(0x3a);WritData(0x20);
WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
WritData(0xa3);WritData(0xb0);
}
void ShowPart3(void)
{
WritCommand(0x90);
WritData(0xb5);WritData(0xe7);WritData(0xbb);WritData(0xb0); //电话报警:Y
WritData(0xb1);WritData(0xa7);WritData(0xbe);WritData(0xaf);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart4(void)
{
WritCommand(0x98);
WritData(0xc8);WritData(0xb7);WritData(0xc8);WritData(0xcf); //确认 选择
WritCommand(0x9e);
WritData(0xd1);WritData(0xa1);WritData(0xd4);WritData(0xf1);
}
void ShowPart5(void)
{
WritCommand(0x98);
WritData(0xbd);WritData(0xf8);WritData(0xc8);WritData(0xeb); //进入
WritCommand(0x9e);
WritData(0xc1);WritData(0xed);WritData(0xd1);WritData(0xa1); //另选
}
void ShowPart6(void)
{
WritCommand(0x91);
WritData(0xc3);WritData(0xf9);WritData(0xbe);WritData(0xaf);
WritData(0xb5);WritData(0xd1); //鸣警笛 :Y
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart7(void)
{
WritCommand(0x90);
WritData(0xbd);WritData(0xd3);WritData(0xc1);WritData(0xa6); //接力报警:Y
WritData(0xb1);WritData(0xa7);WritData(0xbe);WritData(0xaf);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart8(void)
{
WritCommand(0x90);
WritData(0xb7);WritData(0xe2);WritData(0xcb);WritData(0xf8); //封锁现场:Y
WritData(0xcf);WritData(0xd6);WritData(0xb3);WritData(0xa1);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart9(void)
{
WritCommand(0x90);
WritData(0xc5);WritData(0xe7);WritData(0xc9);WritData(0xe4); //喷射眠雾:Y
WritData(0xc3);WritData(0xdf);WritData(0xce);WritData(0xed);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart10(void)
{
WritCommand(0x90);
WritData(0xd4);WritData(0xb1);WritData(0xb9);WritData(0xa4); //员工编码:0
WritData(0xb1);WritData(0xe0);WritData(0xba);WritData(0xc5);
WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
}
void ShowPart11(void)
{
WritCommand(0x90);
WritData(0xd7);WritData(0xee);WritData(0xc9);WritData(0xd9); //最少与数:0
WritData(0xd3);WritData(0xeb);WritData(0xca);WritData(0xfd);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xb0);
}
void ShowPart12(void)
{
WritCommand(0x90);
WritData(0xc2);WritData(0xde);WritData(0xbc);WritData(0xad); //逻辑关系:A
WritData(0xb9);WritData(0xd8);WritData(0xcf);WritData(0xb5);
WritData(0x3a);WritData(0x20);WritData(0xa6);WritData(0xa1);
}
void ShowPart13(void)
{
WritCommand(0x90);
WritData(0xd3);WritData(0xeb);WritData(0xb5);WritData(0xc8); // 与等时间000S
WritData(0xca);WritData(0xb1);WritData(0xbc);WritData(0xe4);
WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xd3);
}
void ShowPart14(void)
{
WritCommand(0x01);
WritCommand(0x98);
WritData(0xcc);WritData(0xee);WritData(0xd0);WritData(0xb4); //填写 继续
WritCommand(0x9b);
WritData(0xb2);WritData(0xbb);WritData(0xcc);WritData(0xee);
WritCommand(0x9e);
WritData(0xbc);WritData(0xcc);WritData(0xd0);WritData(0xf8);
}
void ShowPart15(void)
{
WritCommand(0x90);
WritData(0xd7);WritData(0xd4);WritData(0xb6);WritData(0xaf); //自动喷水:Y
WritData(0xc5);WritData(0xe7);WritData(0xcb);WritData(0xae);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart16(void)
{
WritCommand(0x90);
WritData(0xd7);WritData(0xd4);WritData(0xb6);WritData(0xaf); //自动喷沙:Y
WritData(0xc5);WritData(0xe7);WritData(0xc9);WritData(0xb3);
WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart17(void)
{
WritCommand(0x92);
WritData(0xc8);WritData(0xd5);WritData(0xc0);WritData(0xFa); //日历设置
WritData(0xc9);WritData(0xe8);WritData(0xd6);WritData(0xc3);
}
void ShowPart18(void)
{
WritCommand(0x91);
WritData(0xb1);WritData(0xa7);WritData(0xbe);WritData(0xaf); //报警记录打印
WritData(0xbc);WritData(0xc7);WritData(0xc2);WritData(0xbc);
WritData(0xb4);WritData(0xf2);WritData(0xd3);WritData(0xa1);
}
void ShowPart19(void)
{
WritCommand(0x92);
WritData(0xc8);WritData(0xab);WritData(0xb3);WritData(0xbf); //全部打印
WritData(0xb4);WritData(0xf2);WritData(0xd3);WritData(0xa1);
}
void ShowPart20(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -