?? yijia.c
字號:
#include <reg51.h>
#define USE_KEY
#define CH451_RESET 0x0201 /*復位 */
#define CH451_LEFTMOV 0x0300 /*設(shè)置移動方式-左移 */
#define CH451_LEFTCYC 0x0301 /*設(shè)置移動方式-左循 */
#define CH451_RIGHTMOV 0x0302 /*設(shè)置移動方式-右移 */
#define CH451_RIGHTCYC 0x0303 /*設(shè)置移動方式-右循 */
#define CH451_SYSOFF 0x0400 /*關(guān)顯示、鍵盤、看門狗 */
#define CH451_SYSON1 0x0401 /*開顯示 */
#define CH451_SYSON2 0x0403 /*開顯示、鍵盤、關(guān)看門狗 */
#define CH451_SYSON3 0x0407 /*開顯示、鍵盤、看門狗功能 */
#define CH451_DSP 0x0500 /*設(shè)置默認顯示方式 */
#define CH451_BCD 0x0580 /*設(shè)置BCD譯碼方式 */
#define CH451_USER 0x05c0 /*設(shè)置BCD譯碼方式、4位數(shù)碼管、最亮*/
#define CH451_TWINKLE 0x0600 /*設(shè)置閃爍控制的命令碼,無閃爍 */
#define CH451_TWINKLE1 0x0601 /*設(shè)置閃爍控制--從右向左計數(shù),1閃爍(DIG0驅(qū)動) */
#define CH451_TWINKLE2 0x0602 /*設(shè)置閃爍控制--從右向左計數(shù),2閃爍(DIG1驅(qū)動) */
#define CH451_TWINKLE3 0x0604 /*設(shè)置閃爍控制--從右向左計數(shù),3閃爍(DIG2驅(qū)動) */
#define CH451_TWINKLE4 0x0608 /*設(shè)置閃爍控制--從右向左計數(shù),4閃爍(DIG3驅(qū)動) */
#define CH451_TWINKLE5 0x0610 /*設(shè)置閃爍控制--從右向左計數(shù),5閃爍(DIG4驅(qū)動) */
#define CH451_TWINKLE6 0x0620 /*設(shè)置閃爍控制--從右向左計數(shù),6閃爍(DIG5驅(qū)動) */
#define CH451_TWINKLE7 0x0640 /*設(shè)置閃爍控制--從右向左計數(shù),7閃爍(DIG6驅(qū)動) */
#define CH451_TWINKLE8 0x0680 /*設(shè)置閃爍控制--從右向左計數(shù),8閃爍(DIG7驅(qū)動) */
#define CH451_DIG0 0x0800 /*送數(shù)碼管位0顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG1 0x0900 /*送數(shù)碼管位1顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG2 0x0a00 /*送數(shù)碼管位2顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG3 0x0b00 /*送數(shù)碼管位3顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG4 0x0c00 /*送數(shù)碼管位4顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG5 0x0d00 /*送數(shù)碼管位5顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG6 0x0e00 /*送數(shù)碼管位6顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_DIG7 0x0f00 /*送數(shù)碼管位7顯示的數(shù)據(jù),本值或上一個要顯示的值即可 */
#define CH451_KEY 0x07 /*讀取鍵值的命令碼 */
#define maxp 3000
#define minp 30
typedef unsigned char U8 ;
typedef unsigned int U16;
bit pf; /* 有脈沖信號標志*/
bit t10msf; /* 10ms 間隔到標志 */
bit udf; /*需要顯示更新標志 */
bit kf; /*有按鍵按下標志*/
bit k1f; /*按鍵k1按下標志--左鍵--啟動、確認*/
// bit k2f; /*按鍵k2按下標志--中左鍵--移位*/
// bit k3f; /*按鍵k3按下標志--中右鍵--增1*/
// bit k4f; /*按鍵k3按下標志--右鍵--減1*/
sbit HC14=P3^2; /* INT0, 光電信號輸入口*/
sbit jout=P2^0; /* 噴碼信號輸出口*/
/* CH451接口*/
sbit ch451_dout=P3^3; /* INT1,鍵盤中斷和鍵值數(shù)據(jù)輸入,接CH451的數(shù)據(jù)輸出*/
sbit ch451_load=P1^0; /*串行命令加載,上升延激活 */
sbit ch451_din=P1^1; /*串行數(shù)據(jù)輸出,接CH451的數(shù)據(jù)輸入 */
sbit ch451_dclk=P1^7; /*串行數(shù)據(jù)時鐘上升延激活 */
U8 ch451_key; /* 存放鍵盤中斷中讀取的鍵值 */
sbit s=P1^2; /* 93c46的片選 */
sbit c=P1^3; /* 93c46的串行時鐘 */
sbit d=P1^4; /* 93c46的數(shù)據(jù)輸入 */
sbit q=P1^6; /* 93c46的數(shù)據(jù)輸出 */
U8 skv[4]; /*顯示緩存,4字節(jié),分別存放要顯示的個、十、百、千*/
U16 setv; /*設(shè)置的脈沖數(shù)值*/
U16 cv; /*當前接受的脈沖數(shù)值*/
void int0() interrupt 0 using 1 /*光電輸入中斷*/
{
/*設(shè)置光電輸入標志 */
pf=1;
}
/*void int1() interrupt 2 using 1 /* 鍵盤輸入中斷*/
/*{
/*設(shè)置按鍵按下標志 */
/* kf=1;
} */
void time0() interrupt 1 using 1 /* 設(shè)置T0為10ms中斷*/
{
TH0=0xdc; /* 重裝時間常數(shù)*/
TL0=0x0;
t10msf=1;
}
void updatedisp(unsigned char* disp,bit twif,unsigned char twip); /* 更新顯示*/
U16 read93(U8 ax);
void write93(U8 ax, U16 dx);
void erwren93(void);
void erwrdisen93(void);
void erase93(U8 ax);
void eraseall93(void);
void writeall93(U16 dx);
U8 ch451_read();
void ch451_init();
void ch451_write(U16 command);
void delay();
void main()
{
U16 temp1,temp2,temp3;
U8 ck,shift;
/* 初始化*/
P1=0x00; /* 初始化輸出端口*/
P2=0x00;
SP=0x5f; /* 初始化堆棧指針*/
/* 初始化變量*/
pf=0;
k1f=0;
kf=0;
temp1=read93(2);
temp2=read93(4);
temp3=read93(6);
if(temp1==temp2)
setv=temp1;
else if(temp2==temp3)
setv=temp2;
else
setv=temp1;
if(setv<minp)
{
setv=3000;
erwren93();
write93(2,0xaaaa);
write93(4,0xaaaa);
write93(6,0xaaaa);
erwrdisen93();
}
cv=0;
skv[0]=setv%10;
skv[1]=(setv%100)/10;
skv[2]=(setv%1000)/100;
skv[3]=(setv/1000);
udf=1;
/* 初始化芯片ch451*/
ch451_init(); /*調(diào)用初始化 */
/* 初始化CPU*/
IP=0x05; /* 兩個外中斷為高優(yōu)先級*/
TCON=0x05; /*設(shè)置外中斷為下降沿觸發(fā) */
/* 允許兩個外中斷*/
EX0=1;
EX1=1;
// TMOD=0x21; /* 設(shè)置T0/T1工作方式:T0為方式1, 16位定時器,T1為波特率發(fā)生器,8位自裝入方式*/
// TH0=0x0dc; /* 設(shè)置T0為10ms中斷--12Mp:d8f0*///10*1000/(12/12M)=10000(T), (65536-10000)=0xd8f0
// TL0=0x0; //11.0592Mp:10ms=10*1000us, 10*1000/(12/11.0592M)=9216(T), (65536-9216)=0xdc00
// TR0=1; /* 啟動T0*/
// ET0=1; /* 允許T0中斷*/
// ES=1; /* 允許串口中斷*/
EA=1; /* 開中斷*/
/* 開始運行*/
while(1)
{
if(pf) /* 有光電信號*/
{
pf=0;
cv++; /*當前脈沖數(shù)值增1 */
if(cv>=setv) /*如果當前脈沖數(shù)與設(shè)置值相等,則重新開始計數(shù),并發(fā)出一個脈沖--用于噴碼機動作 */
{
cv=0;
jout=1;
jout=0;
}
/*更新顯示*/
skv[0]=cv%10;
skv[1]=(cv%100)/10;
skv[2]=(cv%1000)/100;
skv[3]=(cv/1000);
udf=1; /*脈沖數(shù)改變,需要更新顯示 */
}
if(kf) /*有按鍵--按鍵處理 */
{
kf=0;
if(k1f) /*已經(jīng)按過啟動鍵的按鍵操作處理 */
{
if(ch451_key==0x40) /*減1鍵操作,當前設(shè)置位之值發(fā)生改變*/
{
if(ck==0)
ck=9;
else
ck--;
}
else if(ch451_key==0x41) /*增1鍵操作,當前設(shè)置位之值發(fā)生改變*/
{
if(ck==9)
ck=0;
else
ck++;
}
else if(ch451_key==0x42) /*移位鍵操作*/
{
skv[shift]=ck; /*獲取修改過的當前設(shè)置位之值,暫存起來 */
if(shift==3) /*改變設(shè)置位*/
shift=0;
else
shift++;
ck=skv[shift]; /*取得新設(shè)置位之值,用于修改 */
}
else if(ch451_key==0x43) /*確認鍵--與啟動按鍵操作是同一鍵,第1次按是啟動,第2次按是確認 */
{
k1f=0;
/*計算新的設(shè)置值,并保存新的設(shè)置值*/
setv=skv[3]*1000+skv[2]*100+skv[1]*10+skv[0];
erwren93();
write93(2,setv);
write93(4,setv);
write93(6,setv);
erwrdisen93();
/*設(shè)置完畢,重新顯示為當前脈沖數(shù) */
skv[0]=cv%10;
skv[1]=(cv%100)/10;
skv[2]=(cv%1000)/100;
skv[3]=(cv/1000);
}
}
else if(ch451_key==0x43) /*啟動鍵--與確認按鍵操作是同一鍵,第1次按是啟動,第2次按是確認*/
{
k1f=1; /*k1f=1表明當前在操作按鍵設(shè)置,顯示設(shè)置值,并閃爍*/
skv[0]=setv%10;
skv[1]=(setv%100)/10;
skv[2]=(setv%1000)/100;
skv[3]=(setv/1000);
/*首先設(shè)置個位,個位閃爍 */
shift=0; /*表明當前設(shè)置位--也是閃爍位 */
ck=skv[shift]; /*取當前要設(shè)置的值 */
}
else
{
/*沒有按啟動鍵,先按了其它鍵,則其它的功能處理*/
}
udf=1; /*設(shè)置更新顯示標志 */
}
if(udf) /*更新顯示的操作 */
{
updatedisp(skv,k1f,shift);
udf=0;
}
} /*end of while loop */
}
/*更新顯示,*disp--顯示內(nèi)容,twif--是否閃爍標志,twip--閃爍位 */
void updatedisp(unsigned char* disp,bit twif,unsigned char twip)
{
if(twif) /*閃爍 */
{
if(twip==0)
ch451_write(CH451_TWINKLE1);
else if(twip==1)
ch451_write(CH451_TWINKLE2);
else if(twip==2)
ch451_write(CH451_TWINKLE3);
else if(twip==3)
ch451_write(CH451_TWINKLE4);
}
else
ch451_write(CH451_TWINKLE); /*不閃爍 */
/*顯示各個位數(shù)據(jù) */
ch451_write(CH451_DIG0 | disp[0]);
ch451_write(CH451_DIG1 | disp[1]);
ch451_write(CH451_DIG2 | disp[2]);
ch451_write(CH451_DIG3 | disp[3]);
}
/*讀操作,ax:地址,以字為單位*/
U16 read93(U8 ax)
{
char i;
U8 db,ay;
U16 dx;
/* 前導條件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=1;
c=0;
/* 發(fā)送讀操作碼 */
d=1;
c=1;
c=0;
d=0;
c=1;
c=0;
/* 發(fā)送地址 */
for(i=5;i>=0;i--)
{
ay=(ax>>i) & 1;
if(ay==1)
d=1;
else
d=0;
c=1;
c=0;
}
/*輸出前導0
c=0;
c=1; */
/*讀數(shù)據(jù)*/
dx=0;
for(i=15;i>=0;i--)
{
c=1;
if(q==1)
db=1;
else
db=0;
dx=dx | (db<<i);
c=0;
}
s=0;
return dx;
}
/*寫操作,ax:地址,dx:數(shù)據(jù),以字為單位*/
/*總的寫操作之前,要調(diào)用擦寫使能函數(shù)*/
/*總的寫操作之后,要調(diào)用擦寫禁止函數(shù)*/
void write93(U8 ax, U16 dx)
{
char i;
U8 ay;
/* 前導條件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=1;
c=0;
/* 發(fā)送寫操作碼 */
d=0;
c=1;
c=0;
d=1;
c=1;
c=0;
/* 發(fā)送地址 */
for(i=5;i>=0;i--)
{
ay=(dx>>i) & 1;
if(ay==1)
d=1;
else
d=0;
c=1;
c=0;
}
/* 發(fā)送數(shù)據(jù) */
for(i=15;i>=0;i--)
{
ay=(dx>>i) & 1;
if(ay==1)
d=1;
else
d=0;
c=1;
c=0;
}
/*啟動寫操作*/
s=0;
q=1;
s=1;
/*等待寫操作結(jié)束*/
while(q==0)
{
c=1;
c=0;
}
/* delay();
delay(); */
s=0;
}
/*擦寫使能*/
void erwren93(void)
{
char i;
/* 前導條件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=1;
c=0;
/* 發(fā)送操作碼 */
d=0;
c=1;
c=0;
c=1;
c=0;
/* 發(fā)送"地址" */
for(i=0;i<6;i++)
{
d=1;
c=1;
c=0;
}
s=0;
}
/*擦寫禁止*/
void erwrdisen93(void)
{
char i;
/* 前導條件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=1;
c=0;
/* 發(fā)送操作碼 */
d=0;
c=1;
c=0;
c=1;
c=0;
/* 發(fā)送"地址" */
for(i=0;i<6;i++)
{
d=0;
c=1;
c=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -