?? debug.c
字號:
// 以下程序為板06-396作為遠方超市 電子鐘帶條屏程序,LED單元板為3.7舊板
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define TIME1 100
#define TIME2 200
#define TIME3 300
#define TIME4 100 //去抖延時
#define START_PT 0
//#define START_PT 0
#define COUNTADDR 0XC0 //計數值在DS1302中存儲起始地址 先低位后高位 C0/C2/C4...-WRITE C1/C3/C5...-READ 3個字節(ASC)
#define MODEL_ID_ADDR 0xe0
#define CT_1 0 // OE 極性 改變極性可更改此宏
#define CT_0 1
#define RED0 0X01
#define RED1 0X02
#define DAT_INVERSE 0Xff; // 數據反 0xff ,數據正常 0x00
/********** LED 屏寄存器地址定義************/
#define SCAN XBYTE[0X8000]
#define CT_REG XBYTE[0X8001]
#define SC_REG XBYTE[0X8002]
#define SC_REG1 XBYTE[0X8006]
#define IN_OE XBYTE[0X8003] // LED顯示板數據輸入允許端 0允許 1禁止
#define EXT_ADDR XBYTE[0X8004] // EEPROM 29C040 擴展地址 A15,A16,A17,A18
#define RELAY_REG XBYTE[0X8007]
/*******************************************/
// i2c 程序部分定義
#define FALSE 0
#define TRUE 1
#define NOP _nop_(); _nop_();_nop_();
#define DeviceAddr 0xa0
#define MAX_WAIT_COUNT 100
#define MAX_RETRY 3
sbit DE = P3^5 ;
sbit CS1 = P2^7;
/********************************************/
sbit IO_CE= P1^6; //外部IO選擇,為1選擇CPLD,為0選擇eeprom
sbit DAT =P1^7;
sbit SRCLK =P3^2;
sbit CLK =P3^3;
//*****************************************************************
sbit T_CLK = P1^0; /*實時時鐘時鐘線引腳 */
sbit T_IO = P1^1; /*實時時鐘數據線引腳 */
sbit T_RST = P1^4; /*實時時鐘復位線引腳 */
//********************************************************************
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
//uchar code string[]="01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789abcdefghijklmnopqrstuvwxyz";
//0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
uchar code led_seg7[10]={0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6}; //6B595
uchar data time_sec;
static uchar idata timemem[7];
uint data row=0;
uint data pt_col=START_PT;
uint data flashaddr;
uint data flash_addr;
uchar xdata *xp_rbuffer;
uchar data over_count; //回車累計變量,為4時即為通信結束
uint data timeout;
uint counter1;
uint counter0;
uchar model_id;
uchar KEY;
bit update;
bit keyflag;
bit ledflag;
bit receiveflag;
union
{
uchar dpl;
uchar dph;
uint dptr;
} dp;
void delay(unsigned int time0)
{
while(time0--);
}
/*********************************************************************/
/* 實時時鐘模塊 時鐘芯片型號:DS1302 */
/*/
/*********************************************************************/
/*
*
* 名稱: v_RTInputByte
* 說明:
* 功能: 往DS1302寫入1Byte數據
* 調用:
* 輸入: ucDa 寫入的數據
* 返回值: 無
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相當于匯編中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
*
* 名稱: uchar uc_RTOutputByte
* 說明:
* 功能: 從DS1302讀取1Byte數據
* 調用:
* 輸入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC=ACC>>1; /*相當于匯編中的 RRC */
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
/********************************************************************
*
* 名稱: v_W1302
* 說明: 先寫地址,后寫命令/數據
* 功能: 往DS1302寫入數據
* 調用: v_RTInputByte()
* 輸入: ucAddr: DS1302地址, ucDa: 要寫的數據
* 返回值: 無
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 寫1Byte數據*/
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名稱: uc_R1302
* 說明: 先寫地址,后讀命令/數據
* 功能: 讀取DS1302某地址的數據
* 調用: v_RTInputByte() , uc_RTOutputBytk()
* 輸入: ucAddr: DS1302地址
* 返回值: ucDa :讀取的數據
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 讀1Byte數據 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************************
*
* 名稱: v_Set1302
* 說明:
* 功能: 設置初始時間
* 調用: v_W1302()
* 輸入: pSecDa: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年
* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 無
***********************************************************************/
void v_Set1302(uchar idata *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 時 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
}
/********************************************************************
*
* 名稱: v_Get1302
* 說明:
* 功能: 讀取DS1302當前時間
* 調用: uc_R1302()
* 輸入: ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年
* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 無
***********************************************************************/
void v_Get1302(uchar idata *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
*ucCurtime++=uc_R1302(ucAddr); /*格式為: 秒 分 時 日 月 星期 年 */
ucAddr += 2;
}
}
void charge() //DS1302 充電
{
v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
v_W1302(0x90,0xa5); // 選用一個二極管及一個2K電阻
v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
}
uint LoadCounter(uchar number)
{
union
{
uchar byte[2];
uint word;
}num;
number=number*2+1;
num.byte[0]=uc_R1302(COUNTADDR+number);
num.byte[1]=uc_R1302(COUNTADDR+number+2);
return(num.word);
}
uchar LoadModelId()
{
uchar model_id;
model_id=uc_R1302(MODEL_ID_ADDR+1);
return(model_id);
}
void SaveModelId(uchar model_id)
{
v_W1302(0x8e,0x00);
v_W1302(MODEL_ID_ADDR,model_id);
v_W1302(0x8e,0x80);
}
void SaveCounter(uchar number,uint counter)
{
union
{
uchar byte[2];
uint word;
}num;
number=number*2;
num.word=counter;
v_W1302(0x8e,0x00);
v_W1302(COUNTADDR+number,num.byte[0]);
v_W1302(COUNTADDR+number+2,num.byte[1]);
v_W1302(0x8e,0x80);
}
void SetTime(uchar xdata *pt_time)
{
uchar idata *ip_time;
uchar data high;
uchar data low;
ip_time=timemem;
high=*(pt_time+19); //秒
high=(high-0x30)<<4;
low=(low-0x30)&0x0f;
*ip_time++=high|low;
high=*(pt_time+16); // 分
high=(high-0x30)<<4;
low=*(pt_time+17);
low=(low-0x30)&0x0f;
high=*(pt_time+13); // 時
high=(high-0x30)<<4;
low=*(pt_time+14);
low=(low-0x30)&0x0f;
*ip_time++=high|low;
high=*(pt_time+8); // 日
high=(high-0x30)<<4;
low=*(pt_time+9);
low=(low-0x30)&0x0f;
*ip_time++=high|low;
high=*(pt_time+5); // 月
high=(high-0x30)<<4;
low=*(pt_time+6);
low=(low-0x30)&0x0f;
*ip_time++=high|low;
low=*(pt_time+11); // 星期
low=(low-0x30)&0x0f;
if((low==0)||(low==8))
low=7;
*ip_time++=low;
// 年
high=*(pt_time+2);
high=(high-0x30)<<4;
low=*(pt_time+3);
low=(low-0x30)&0x0f;
*ip_time++=high|low;
v_Set1302(timemem);
}
void DispNumToLed(uchar dat)
{
uchar data d;
uchar data i;
d=led_seg7[dat];
for(i=0;i<8;i++)
{
d<<=1;
DAT=CY;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
_nop_();
CLK=1;
}
}
void IntToChar(uint num,uchar data *pt_array)
{
*pt_array++=num/1000;
*pt_array++=(num%1000)/100;
*pt_array++=(num%100)/10;
*pt_array++=num%10;
}
void led_disp()
{
uchar i;
uchar j;
uchar d;
uchar num_array[4];
uchar idata *p_time=timemem; //指向內存中的時間位置
uchar data time;
//if(ledflag)
{
DispNumToLed(2);
DispNumToLed(0);
time=*(p_time+6); // 年
DispNumToLed((time&0xf0)>>4);
DispNumToLed(time&0x0f);
time=*(p_time+4); //月
DispNumToLed((time&0xf0)>>4);
DispNumToLed(time&0x0f);
time=*(p_time+3); //日
DispNumToLed((time&0xf0)>>4);
DispNumToLed(time&0x0f);
time=*(p_time+5); // 星期
if(time==7)
time=8;
DispNumToLed(time&0x0f);
// 時
time=*(p_time+2);
DispNumToLed((time&0xf0)>>4);
DispNumToLed(time&0x0f);
time=*(p_time+1); //分
DispNumToLed((time&0xf0)>>4);
DispNumToLed(time&0x0f);
time=*(p_time+0); // 秒
DispNumToLed((time&0xf0)>>4);
DispNumToLed(time&0x0f);
SRCLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SRCLK=1;
ledflag=0;
}
}
//********************************* FLASH 讀寫程序 ****************************
void Flash_Write(uchar page,uchar xdata *source,uchar xdata *destination)
{
uint data i;
IO_CE=1;
EXT_ADDR=0;
IO_CE=0;
XBYTE[0xD555]=0xaa; //load 0xaa to adresss 5555
XBYTE[0xD555]=0xa0; //load 0xa0 to adresss 5555
IO_CE=1;
EXT_ADDR=page;
IO_CE=0;
for(i=0;i<256;i++)
{
*destination++=*source++;
}
delay(10000);
}
void Flash_Erase()
{
}
void Dis_Flash_Protect()
{
IO_CE=1;
IO_CE=0;
XBYTE[0xD555]=0xaa;
XBYTE[0xAAAA]=0x55;
XBYTE[0xD555]=0x80;
XBYTE[0xD555]=0xaa;
XBYTE[0xAAAA]=0x55;
XBYTE[0xD555]=0x20;
delay(20000);
}
void SaveModel(uchar xdata *xp_ram)
{
uint data i;
uint data j;
uchar data k;
uchar data page_flash;
uchar xdata *xp_flash;
uchar data row;
page_flash=0x43000/0x7fff;
xp_flash=0x43000|0x8000;
IO_CE=1;
EXT_ADDR=0;
IO_CE=0;
XBYTE[0xAAAA]=0x55; //load 0x55 to address 2aaa
XBYTE[0xD555]=0xa0; //load 0xa0 to adresss 5555
IO_CE=1;
EXT_ADDR=page_flash;
IO_CE=0;
for(i=0;i<256;i++)
{
if(xp_ram<0x7fff)
{
*xp_flash++=*xp_ram++;
}
else
{
*xp_flash++=' ';
}
}
delay(10000);
}
uint LoadSetValue(uchar number)
{
uint setvalue;
uchar xdata *xp_flash;
uchar data page_flash;
uchar num[4];
uchar data i;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -