?? platup070710.c
字號:
//plat2up.c(電子看板)// close 0 dig
//*****************************************************************************************//
//顯示面板: * 今日計劃 8 8 8 8 * // //
// * 現在計劃 8 8 8 8 * // //
// * 現在實績 8 8 8 8 * // //
//=========================================================================================//
//操作說明: //
// 按計數鍵:進行計數及顯示close 0 disp //
// 按清 0鍵:進行現在實績清0和現在計劃清0,同時顯示 //
// 按設定鍵:第1次進行今日計劃設定及顯示; //
// 第2次進行今日工時設定及顯示; //
// 第3次進行現在時間設定及顯示; //
// 第4次進行設定確認并退出。 //
// 0~9數字鍵:進行數據設定,按1下后自動到下一位設定,并在設定位進行循環移位 //
// 暫停計數鍵:ON時計數鍵無效且現在計劃暫停計數,現在時間斷續。 //
//*****************************************************************************************//
#include <regx51.h>
#define uchar unsigned char
#define uint unsigned int
#define TTH0 (65536-1000)/256 //1ms 初始化中斷掃描
#define TTL0 (65536-1000)%256
uchar buffer[24]; //顯示代碼緩存
uchar code table[]= {0x3f,0x06,0x5b,0x4f, // 共陰 用74ls07驅動
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
/*{ 0xC0,0xF9,0xA4,0xB0, //共陽用74ls04驅動
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e },*/
uchar MRD; //鍵號存儲
uchar cnt_set; //設定計數器
bdata uchar flag=0; //標示位
sbit flagminute=flag^0; //分標示
sbit flag_set=flag^1; //設定標示
sbit flag_second=flag^2; //秒標示
sbit ir_enable=flag^3; //紅外接收成功標示
sbit ir_reject=flag^4; //紅外不接收標示
sbit flag_day=flag^5; //天標示
uchar hour; //計時小時暫存器
uchar minute; //計時分鐘暫存器
uchar second; //計時秒暫存器
uint cnt01ms; //0.1ms計數器
uchar cnt_flash; //閃爍計數器
uchar cnt; //顯示中斷用
uchar line; //閃爍位置
uint counter; //實績計數器
uint minutecounter; //分鐘計數器
uint worktime; //設定工作時間
uint plancount; //設定計劃生產數量暫存器
uchar connt; //紅外中斷接收狀態碼暫存器
uint tmp0; //紅外中斷前1時間暫存器
uint tmp1; //紅外中斷現在時間暫存器
uchar ir_data; //紅外接收碼暫存器
uchar ir_data1; //紅外接收1碼暫存器
uchar ir_data2; //紅外接收2碼暫存器
uchar year,mouth,day,day0; //年月日標示
void delay(unsigned int i){ //延時10US程式
while(i>0)i--;
}
void timerint0 () interrupt 1 { //單個7SEG1ms掃描;共16個7SEG需16ms掃描完成一個循環
TL0 = TTL0; //1ms定時
TH0= TTH0;
if((flag_set==1)&&(cnt==line)){ //有設定值則該位閃爍
P0=0x00; //關顯示碼
cnt_flash++;
if(cnt_flash==30){ //過30MS
cnt_flash=0;
P0=table[buffer[cnt]]; //顯示顯示碼
}
}
else if((flag_second==1)&&(cnt==21)){flag_second=0;P0=table[buffer[cnt]]|0x80;}
else { P0=table[buffer[cnt]];}
if(cnt<16){ //片選74HC154
WR=0;
P1=cnt;
}
else if(cnt==16){ //片選74HC138
WR=1;
P1=0;
}
else {
WR=1;
P1=cnt;
}
if(cnt++==24) cnt=0;
}
void timer1() interrupt 3
{
tmp1++;
cnt01ms++;
if(cnt01ms==10000){
cnt01ms=0;second++;flag_second=1;
if(second==60){
second=0;minute++;flagminute=1;
if(minute==60){
minute=0;hour++;
if(hour==24){
flag_day=1;hour=0;
}
}
}
}
}
void ir_succeed() { //接收成功進行效對程式
if(ir_data1==0x67){
ir_data = ir_data2;
ir_enable=1;
ir_reject=1;
TH1=0;
TL1=0;
connt=0;
}
}
void JISH_INT0()interrupt 2 { //紅外接收程序
uint tmp; //紅外中斷時段暫存器
if(ir_reject)return; //有紅外拒收旗標,拒絕接收其它碼
tmp=tmp1-tmp0; //現在的時間中斷值-前一中斷值=時段
tmp0=tmp1; //把現在的時間中斷值=前一中斷值
if(connt == 0) //接收第0碼(頭碼)
{
if((tmp >98) && (tmp <146 )) //12160 //是第頭碼
{
connt++;
return;
}
else{ //不是第0碼則返回接收狀態0碼
connt = 0;
return;
}
}
/////////////////////////////////////////////////////
if(connt !=0)
{
if(connt <= 8) //是第1~8狀態碼
{
if((tmp >9) && (tmp <13 )) //1120 //是0碼
{
ir_data1 <<= 1;
connt++;
return;
}
else if((tmp >18) && (tmp <26) ) //2240//是1碼
{
ir_data1 <<= 1;
ir_data1 |= 0x01;
connt++;
return;
}
else{ //不是0和1 碼則返回狀態0碼
connt = 0;
return;
}
}
//////////////////////////////////////////////////////
if(connt == 9)
{
if((tmp >40) && (tmp <60 )) //5040 //是過渡碼
{
connt++;
return;
}
else { //否則返回狀態0碼
return;
}
}
//////////////////////////////////////////////////////
if(connt > 9 && connt <= 17) //是第10~17狀態碼
{
if((tmp >9) && (tmp <13 )) //1120//是0碼
{
ir_data2 <<= 1;
connt++;
if(connt == 18)ir_succeed();
return;
}
else if((tmp >18) && (tmp <26) ) //2240//是1碼
{
ir_data2 <<= 1;
ir_data2 |= 0x01;
connt++;
if(connt == 18)ir_succeed();
return;
}
else{ //否則返回狀態0碼
connt = 0;
return;
}
}
}
}
uchar key(){ //紅外接收碼轉換為鍵值碼
uchar i,LREC,ir_tmp;
uchar lrec[] ={0x98,0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x50,0xa0};
LREC=0;
for (i=0;i<12;i++){
if(lrec[i]==ir_data){
ir_tmp=i;
LREC=1;
}
}
if(LREC)return ir_tmp;else return 0XFF; // 是接收碼返回 ir_tmp;否則返回0XFF
}
void KEYHANDLE(){
switch(MRD){
//設定鍵1-今日計劃;2-工作時間;3-現在時間;4-確認 c
case 10:MRD=0XFF;flag_set=1;cnt_set++;
if(cnt_set==1){line=0; }
else if(cnt_set==2){line=4; }
else if(cnt_set==3){line=14;}
else if(cnt_set==4){line=20;}
else if(cnt_set==5){flag_set=0;cnt_set=0;second=0;}
break;
case 11:MRD=0XFF;counter=0;minutecounter=0;break; //實績計數器&分鐘計數器清0
default: if((MRD<=9)&&(flag_set==1)){ //輸入設定值
buffer[line]=MRD;
if(cnt_set==1){ //設定今日計劃數量
line++;
if(line>3)line=0;
plancount=buffer[0]*1000+buffer[1]*100+buffer[2]*10+buffer[3];
}
else if(cnt_set==2){ //設定今日生產時間
line++;
if(line>7)line=4;
worktime=buffer[4]*1000+buffer[5]*100+buffer[6]*10+buffer[7];
}
else if(cnt_set==3){ //設日期
line++;
if(line>19)line=14;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -