📄 hello.c.loc.c
字号:
//**************************************************************
void tserial(void) /*宣告串口serial发送副程式*/
{ uchar sec,min,hour;
sec=((dispbuf[2]<<4)&0xf0)|(dispbuf[1]&0x0f);
min=((dispbuf[4]<<4)&0xf0)|(dispbuf[3]&0x0f);
hour=((dispbuf[6]<<4)&0xf0)|(dispbuf[5]&0x0f);
IE=0x8f;
SBUF=hour; /*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(20);
SBUF=min; /*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(20);
SBUF=sec; /*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(20);
IE=0x9f;
}
/*******************************************************************/
// 24C02芯片读写 起动总线函数
//函数原型: void Start();
//功能: 启动总线,发送24c02启动条件.
//==================================================================
void Start()
{SDA=0;
nop;
nop;
SCL=0;
SDA=1; /*发送起始条件的数据信号*/
nop;
SCL=1;
nop; /*起始条件建立时间大于4.7us,延时*/
nop;
nop;
nop;
nop;
SDA=0; /*发送起始信号*/
nop; /* 起始条件锁定时间大于4us*/
nop;
nop;
nop;
nop;
SCL=0; /*钳住总线,准备发送或接收数据 */
nop;
nop;
SDA=1;
}
//==================================================================
// 结束总线函数
//函数原型: void Stop();
//功能: 结束总线,发送24c02结束条件.
//==================================================================
void Stop()
{
SCL=0;
SDA=0; /*发送结束条件的数据信号*/
nop; /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4us*/
nop;
nop;
nop;
nop;
nop;
SDA=1; /*发送总线结束信号*/
nop;
nop;
nop;
nop;
SCL=0;
}
//==================================================================
// 89X52发数据或地址给24c02 字节数据发送函数
//函数原型: void SendByte(uchar c);
//功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
// 此状态位进行操作.(不应答或非应答都使acknow=0)
// 发送数据正常,acknow=1; acknow=0表示被控器无应答或损坏。
//==================================================================
void SendByte(uchar c)
{ uchar count;
for(count=0;count<8;count++) /*要传送的数据长度为8位*/
{if((c<<count)&0x80)
SDA=1; /*判断发送位*/
else
SDA=0;
nop;
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
nop;
nop; /*保证时钟高电平周期大于4us*/
nop;
nop;
nop;
SCL=0;
}
nop;
nop;
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
nop;
nop;
SCL=1;
nop;
nop;
nop;
if(SDA==1)
acknow=0; /* 24c02无应答 */
else
acknow=1; /* 发送数据正常 */
SCL=0;
nop;
nop;
}
//==================================================================
// 89X52从24c02读数据字节数据接收函数
//函数原型: uchar RcvByte();
//功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
// 发完后请用应答函数应答从机。
//==================================================================
uchar RcvByte()
{uchar retc=0;
uchar count;
SDA=1; /*置数据线为输入方式*/
for(count=0;count<8;count++)
{ nop;
SCL=0; /*置时钟线为低,准备接收数据位*/
nop;
nop; /*时钟低电平周期大于4.7us*/
nop;
nop;
nop;
SCL=1; /*置时钟线为高使数据线上数据有效*/
nop;
nop;
retc=retc<<1;
if(SDA==1)
retc=retc+1; /*读数据位,接收的数据位放入retc中 */
nop;
nop;
}
SCL=0;
nop;
nop;
return(retc);
}
//==================================================================
// 主机89X52应答子函数
//函数原型: void Ack(bit a);
//功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
//==================================================================
void Ack(bit a)
{if(a==0)
SDA=0; /*在此发出应答或非应答信号 */
else /* 应答 a=0 非应答 a=1 */
SDA=1;
nop;
nop;
nop;
SCL=1;
nop;
nop; /*时钟低电平周期大于4us*/
nop;
nop;
nop;
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
nop;
nop;
}
//==================================================================
// 用户接口函数
// 有无子地址表示是否向芯片的特定地址写数据
// 向有子地址器件写入6字节数据函数 对应数据资料中的写模式
//函数原型: bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);
//功能: 从启动总线到发送从地址,子地址,数据,结束总线的全过程,从器件
// 地址slaaddress,子地址subaddress,发送内容是s指向的内容,no=字节数
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//==================================================================
bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no) /* 向有子地址器件写入6字节数据函数 */
{uchar i;
Start(); /*启动总线*/
SendByte(slaaddress); /*发送器件地址*/
if(acknow==0)
return(0);
SendByte(subaddress); /*发送器件子地址*/
if(acknow==0)
return(0);
for(i=0;i<no;i++)
{
SendByte(s[i]); /*发送数据*/
if(acknow==0)
return(0);
}
Stop(); /*结束总线*/
return(0);
}
//==================================================================
// 向有子地址器件读取4字节数据函数
//函数原型: bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);
//功能: 从启动总线到发送从地址,子地址,读数据,结束总线的全过程,从器件
// 地址slaaddress,子地址subaddress,读出的内容放入s, no=字节数
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//==================================================================
bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no)
{ uchar i;
Start(); /*启动总线*/
SendByte(slaaddress); /*发送器件从地址*/
if(acknow==0)
return(0);
SendByte(subaddress); /*发送器件子地址*/
if(acknow==0)
return(0);
Stop(); /*结束总线*/
Start(); /*重新启动总线*/
SendByte(slaaddress+1);
if(acknow==0)
return(0);
for(i=0;i<no;i++)
{* s=RcvByte(); /*接收数据*/
Ack(0); /*发送应答位*/
s++;
}
* s=RcvByte(); /*接收数据*/
Ack(1);
Stop(); /*结束总线*/
return(1);
}
//==================================================================
void disp(void) /*显示密码副程式*/
{ char c; /*宣告变数*/
read24c02(); /*呼叫读取密码存放在DATE1[]副程式*/
ptr=0xff;
for(c=1;c<7;c++) /*将密码存放在阵列buft[]存入显示器存放阵列dispbuf[]*/
{
dispbuf[c]=bufdata[c];
}
tsled(); /*串行发送到DTLED-6副程式*/
while(m==P0); /*判断按钮放开否,没有则在此等待*/
clear(); /*有则呼叫清除显示器*/
FLAG2=1;
}
//******************************************************************
void scan(void) /*扫描键盘副程式*/
{char a1=0xef,i; /*A1=0XF7列扫描初值,I行*/
FLAG0=0; /*设按键回应旗号为0,键盘扫描计数指标为0*/
ptr=0;
for(i=0;i<4;i++) /*键盘4个扫描列*/
{
P0=a1; /*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
m=P0;
switch(m&0x0f) /*取行的高4位元,侦测那一行被按*/
{
case 0x07: ptr=i*4; /*第一行被按否?是则扫描指标=列X4*/
FLAG0=1; /*是则设FLAG0=1表有按键输入*/
break; /*跳出此循环*/
case 0x0b: ptr=i*4+1; /*第二行被按否?是则扫描指标=列X4+1*/
FLAG0=1; /*是则设FLAG0=1表有按键输入*/
break; /*跳出此循环*/
case 0x0d: ptr=i*4+2; /*第三行被按否?是则扫描指标=列X4+2*/
FLAG0=1; /*是则设FLAG0=1表有按键输入*/
break; /*跳出此循环*/
case 0x0e: ptr=i*4+3; /*第四行被按否?是则扫描指标=列X4+3*/
FLAG0=1; /*是则设FLAG0=1表有按键输入*/
default: break; /*跳出此循环*/
}
if(FLAG0==1)break; /*不为1,则扫描列右移,扫描下一列*/
a1=a1<<1|0x01; /*高位补1,由于P1.7~P1.4未接+5V,而是由指令加载高电平*/
}
} /*返回主程式*/
//******************************************************************
void service_int0 () interrupt 1 using 2 /*设定每隔3000us中断扫描一次数码管*/
{
ptr1++; /*扫描指标加1*/
TH0=(65536-2000)/256; /*每隔4000US扫描一次*/
TL0=(65536-2000)%256;
while (ptr1>5) ptr1=0; /*ptr1>5表示6个数码管都已经扫描过*/
P0=(ptr1<<4)|dispbuf[ptr1]; /*将扫描值左移至高4位元再加上资料码*/
} /*返回主程式*/
/********************************************************/
void service_int1 () interrupt 3 using 3 /*TIMER1中断副程式--秒计时器*/
{ TH1=(65536-59200)/256; /*重设TIMER1计数值*/
TL1=(65536-59200)%256;
dispbuf[8]=0x09; /*蜂鸣器设定开/二次分频*/
if(b1==0) /*中断次数完成否,是则表1秒到了*/
{
b1=100; /*重设中断次数*/
P3_6=1; /*秒SEC加1*/
TR1=0;
dispbuf[8]=0x01; /*蜂鸣器关*/
clear();
tsled(); /*串行发送到DTLED-6副程式*/
}
TF1=0;
b1--; /*中断次数减1*/
} /*返回主程式*/
/********************************************************/
void uartcom1_in1 () interrupt 4 using 1 /*串行口中断副程式*/
{ uchar v,i=0;
while(RI!=1); /*接收完成否*/
{RI=0;
v=SBUF; /*接收的数据存入C*/
if(v==0xa0) /*是否是识别码"A0"*/
{while(RI!=1); /*接收完成否*/
bufuart[i]=v;
for(i=1;i<7;i++)
{while(RI!=1); /*接收完成否*/
bufuart[i]=SBUF; /*接收的数据存入C*/
RI=0; /*清除接收完成标志位RI*/
}
}
else delay(10);
RI=0;
}
dispbuf[0]=bufuart[6];
dispbuf[1]=bufuart[5];
dispbuf[2]=bufuart[4];
dispbuf[3]=bufuart[3];
dispbuf[4]=bufuart[2];
dispbuf[5]=bufuart[1];
} /*返回主程式*/
/******************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -