?? 048v2.c
字號:
#include "stdio.h"
#include "reg51.h"
#include "ctype.h"
#include "absacc.h"
#define uchar unsigned char
#define ACK 0X06 /* 遙控肯定應答*/
#define NAK 0X15 /* 遙控否定應答*/
#define COM8155 XBYTE[0x80f0] /*定義8155命令口地址*/
#define PA8155 XBYTE[0x80f1] /*定義8155 A口(段碼輸出)地址*/
#define PB8155 XBYTE[0x80f2] /*定義8155 B口(位碼輸出)地址*/
#define PC8155 XBYTE[0x80f3] /*定義8155 C口(位碼輸出)地址*/
#define DSSECOND XBYTE[0x4000] /*定義DS12C887秒寄存器地址*/
#define DSMINUTE XBYTE[0x4002] /*定義DS12C887分寄存器地址*/
#define DSHOUR XBYTE[0x4004] /*定義DS12C887時寄存器地址*/
#define DSDAY XBYTE[0x4007] /*定義DS12C887日寄存器地址*/
#define DSMONTH XBYTE[0x4008] /*定義DS12C887月寄存器地址*/
#define DSYEAR XBYTE[0X4009] /*定義DS12C887年寄存器地址*/
#define DSA XBYTE[0x400A] /*定義DS12C887 A寄存器地址*/
#define DSB XBYTE[0x400B] /*定義DS12C887 B寄存器地址*/
#define DSD XBYTE[0x400D] /*定義DS12C887 D寄存器地址*/
int bright;
uchar idata r_buf[15]; /*接收緩沖區*/
uchar idata t_buf[4]; /*發送緩沖區*/
sbit p1_7=P1^7; /*WATCHDOG 清零脈沖輸出腳*/
bit flag; /*接收完整一條命令中斷標志*/
int r_in,r_out,t_num,t_out,n;
bit r_full;
/*************************************************************************************************
* 將每一位數值轉換為相應的數碼管顯示代碼,并送去8155的PA口顯示 *
*************************************************************************************************/
void getsegmentcode(int digitvalue)
{
switch(digitvalue){
case 0x00:
PA8155=0xC0;
break;
case 0x01:
PA8155=0xF9;
break;
case 0x02:
PA8155=0xA4;
break;
case 0x03:
PA8155=0xB0;
break;
case 0x04:
PA8155=0x99;
break;
case 0x05:
PA8155=0x92;
break;
case 0x06:
PA8155=0x82;
break;
case 0x07:
PA8155=0xF8;
break;
case 0x08:
PA8155=0x80;
break;
case 0x09:
PA8155=0x90;
break;
default:
PA8155=0xff;
break;
}
}
/*************************************************************************************************
* delay()延遲程序是用來產生每位顯示所需的時間 *
* delay1()延遲程序是等待系統外圍器件進入穩定后再執行主程序的時間 *
* delay2()用于片選信號的延遲處理 *
*************************************************************************************************/
void delay()
{
int i,k;
for(i=0;i<2;i++)
for(k=0;k<10;k++){}
}
void delay2()
{
int i,k;
for(i=0;i<2;i++)
for(k=0;k<18;k++){}
}
void delay1()
{
int i,k;
for(i=0;i<10;i++)
for(k=0;k<50;k++){}
}
/*************************************************************************************************
* 串口發送程序,向上端程序發送數據或對收到命令的應答. t_buf[]為發送緩沖區 *
*************************************************************************************************/
void senddata(void)
{
for(t_out=0;t_out<=t_num;t_out++){
SBUF=t_buf[t_out];
while(TI==0);
TI=0;
}
}
/*************************************************************************************************
* 處理查詢當前亮度值或修改當前亮度值的命令 *
*************************************************************************************************/
void processbright(void)
{
switch(r_buf[2]){
case '?':
t_buf[0]=0x02;
t_buf[1]=bright;
t_buf[2]=0x03;
t_num=2;
senddata();
break;
case '0':
bright=0x30;P1=0X10;
t_buf[0]=0x06;t_num=0;senddata();break;
case '1':
bright=0x31;P1=0X11;
t_buf[0]=0x06;t_num=0;senddata();break;
case '2':
bright=0x32;P1=0X12;
t_buf[0]=0x06;t_num=0;senddata();break;
case '3':
bright=0x33;P1=0X13;
t_buf[0]=0x06;t_num=0;senddata();break;
case '4':
bright=0x34;P1=0X14;
t_buf[0]=0x06;t_num=0;senddata();break;
case '5':
bright=0x35;P1=0X15;
t_buf[0]=0x06;t_num=0;senddata();break;
case '6':
bright=0x36;P1=0X16;
t_buf[0]=0x06;t_num=0;senddata();break;
case '7':
bright=0x37;P1=0X17;
t_buf[0]=0x06;t_num=0;senddata();break;
default:
t_buf[0]=NAK;
t_num=0;
break;
}
}
/*************************************************************************************************
判斷r_buf()的值是否合法,返回0為不合法 ,yyh Add 2/2/2001
**************************************************************************************************/
int rbufOK(void)
{
int i;
for(i=2;i<=7;i++){
if((r_buf[i]&0x0f)>0x09) {
t_buf[0]=NAK;
t_num=0;
senddata();
return 0;
}
}
return 1;
}
/*************************************************************************************************
* 處理修改日期的命令 *
*************************************************************************************************/
void processdate(void)
{
if(rbufOK()==0) return;
DSB=0X82;
DSYEAR=((r_buf[2]<<4)&0xf0)|(r_buf[3]&0x0f);
DSMONTH=((r_buf[4]<<4)&0xf0)|(r_buf[5]&0x0f);
DSDAY=((r_buf[6]<<4)&0xf0)|(r_buf[7]&0x0f);
DSB=0X02;
t_buf[0]=0x06;
t_num=0;
senddata();
}
/*************************************************************************************************
* 處理修改時間的命令 *
*************************************************************************************************/
void processtime(void)
{
if(rbufOK()==0) return;
DSB=0X82;
DSHOUR=((r_buf[2]<<4)&0xf0)|(r_buf[3]&0x0f);
DSMINUTE=((r_buf[4]<<4)&0xf0)|(r_buf[5]&0x0f);
DSSECOND=((r_buf[6]<<4)&0xf0)|(r_buf[7]&0x0f);
DSB=0X02;
t_buf[0]=0x06;
t_num=0;
senddata();
}
/*************************************************************************************************
* 處理收到的命令,判斷是何種命令,并調用相關命令處理程序 *
*************************************************************************************************/
void processcommand(void)
{
switch(r_buf[0]){
case 0x02:
switch(r_buf[1]){
case 'b':
processbright();
break;
case 'd':
processdate();
break;
case 't':
processtime();
break;
default:
t_buf[0]=NAK;
t_num=0;
senddata();
break;
}
case ACK:
break;
default:
t_buf[0]=NAK;
t_num=0;
senddata();
break;
}
}
/*************************************************************************************************
* 初始化程序 *
*************************************************************************************************/
void init()
{
flag=0; /*中斷標志*/
COM8155=0x0f; /*8155命令口編程為PA、PB、PC皆為輸出口*/
TMOD=0x20; /*設置4800波特率的定時器一及其初始值*/
TL1=0xfa;TH1=0xfa;
SCON=0x50;PCON=0x00; /*工作于方式一10位異步收發方式*/
TR1=1; /*使定時器一開始工作*/
bright=0x36;P1=0X16; /*設置亮度初始值*/
IE=0x90;r_in=r_out=0;r_full=0;
PA8155=0xFF;PB8155=0xFF;PC8155=0xFF;
ACC=DSD; /*時鐘芯片初始化*/
DSA=0x20;
DSB=0x02;
}
/*************************************************************************************************
* 主程序 *
*************************************************************************************************/
void main(void)
{
int lsdvalue,msbvalue,f;
delay1();
init();
while(1)
{
p1_7=1; /*產生看門狗清零脈沖*/
p1_7=1;
p1_7=0;
f=DSSECOND; /*顯示時間程序開始*/
lsdvalue=f&0x0f;;
PB8155=0xFF;
delay2();
getsegmentcode(lsdvalue);
PB8155=0xFE;
delay();
msbvalue=f>>4;
PB8155=0xFF;
delay2();
getsegmentcode(msbvalue);
PB8155=0xFD;
delay();
f=DSMINUTE;
lsdvalue=f&0x0f;
PB8155=0xFF;
delay2();
getsegmentcode(lsdvalue);
PB8155=0xFB;
delay();
msbvalue=f>>4;
PB8155=0xFF;
delay2();
getsegmentcode(msbvalue);
PB8155=0xF7;
delay();
f=DSHOUR;
lsdvalue=f&0x0f;
PB8155=0xFF;
delay2();
getsegmentcode(lsdvalue);
PB8155=0xEF;
delay();
msbvalue=f>>4;
PB8155=0xFF;
delay2();
getsegmentcode(msbvalue);
PB8155=0xDF;
delay();
PB8155=0xFF;
f=DSDAY; /*顯示日期程序開始*/
lsdvalue=f&0x0f;
PC8155=0xFF;
delay2();
getsegmentcode(lsdvalue);
PC8155=0xFE;
delay();
msbvalue=f>>4;
PC8155=0xFF;
delay2();
getsegmentcode(msbvalue);
PC8155=0xFD;
delay();
f=DSMONTH;
lsdvalue=f&0x0f;
PC8155=0xFF;
delay2();
getsegmentcode(lsdvalue);
PC8155=0xFB;
delay();
msbvalue=f>>4;
PC8155=0xFF;
delay2();
getsegmentcode(msbvalue);
PC8155=0xF7;
delay();
f=DSYEAR;
lsdvalue=f&0x0f;
PC8155=0xFF;
delay2();
getsegmentcode(lsdvalue);
PC8155=0xEF;
delay();
msbvalue=f>>4;
PC8155=0xFF;
delay2();
getsegmentcode(msbvalue);
PC8155=0xDF;
delay();
PC8155=0xFF;
if(flag==1)
{ /*判斷是否有中斷產生*/
processcommand();
flag=0;
}
}
}
/*************************************************************************************************
* 串口接收中斷程序 *
*************************************************************************************************/
void serial() interrupt 4 using 1
{
r_buf[r_in]=SBUF;
RI=0;
if(r_buf[r_in]==0x02 && r_in>0) //先判斷楨頭
{
int i;
for(i=0;i<r_in;i++)
{
r_buf[i]=0xff;
}
r_buf[0]=r_buf[r_in];
r_in=1;
flag=0;
}
else if(r_buf[r_in]!=0x03 && r_buf[r_in]!=0x06)//再判斷楨尾
{
if(r_in > 0x0f) //不會接收15個字節的數據
{
t_buf[0]=0xff;
t_num=0;
senddata();
r_in = 0; //復位
flag = 0;
return;
}
r_in+=1;
}
else if((r_buf[r_in]==0x03) || (r_buf[r_in]==0x06))
{
r_in=0;
flag=1;
}
else
{
r_in=0;
flag=0;
}
}
/*
RI=0;
if(SBUF==0x02 && r_in ==0) //先判斷楨頭
{
r_buf[0]=SBUF;
r_in=1;
}
else if(r_in > 0 && SBUF!=0x03 && SBUF!=0x06)//有效數據
{
if(r_in > 0x0f) //不會接收15個字節的數據
{
t_buf[0]=0xff;
t_num=0;
senddata();
r_in = 0; //復位
flag = 0;
return;
}
r_buf[r_in]=SBUF;
r_in+=1;
}
else if((r_in > 0 && SBUF==0x03) || (SBUF==0x06)) //楨尾
{
r_in=0;
flag=1;
}
else
{
r_in = 0;
flag = 0;
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -