📄 main.c
字号:
//==================================================
//程序以89c2051为基础,串行口以19200波特率(11.059M晶振)
//==================================================
#include ".\main.h"
#include <math.h>
#define DataPort P1 // 数据端口
#define Busy 0x80
// 控制引脚定义,不同的连接必须修改的部分
sbit RS=P3^5;
sbit RW=P3^4;
sbit Elcm=P3^7;
//sbit UP = P3^0;
//sbit DOWN = P3^1;
//------------------0123456789abcdef---------------------------------
code char exampl[]="Time: : : ";
union word_union
{
WORD w;
BYTE b[2];
};
bit r_done;
bit flash; //20041205
bit flash_sec;
bit flash_min;
bit flash_hour;
byte code TABLE[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
byte data Clock[3] = {0,0,0};
byte Number;
byte time_set;
data word p;
bit gBt_TxBusy;
data BYTE gB_RxIndex;
data BYTE gBa_DebugBuf[RXDBUFSIZE];
data word gB_T1count; //0.5ms一个单位;
data word gB_T2count;
byte obj_speed;
byte avg_speed;
byte data RxCt;
byte data RxBuf[10];
void Init8051Regs(void);
void clearbuff(void);
//--------------------------------------------------------------
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
void Delay5Ms(void);
///////////////////////////////////////////////////////////////////////////////
// void InitAll(void) //
///////////////////////////////////////////////////////////////////////////////
void Init8051Regs(void)
{
EA = 0;
//SCON ----||---- SM0 SM1 SM2 REN TB8 RB8 T1 RI
SCON = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr
PCON |= 0x00;
TMOD |= 0x23; // TMOD: timer 1, mode 2, 8-bit reload
// TH1 = 0xf3; // TH1: reload value for 9600 baud @ 24MHz WINBOND
TH1 = 0xfd; // TH1: 4800 baud @ 11.0596MHz 89c2051
TL1 = 0xfd; //fd-->9600 fa-->4800 f4-->2400 0xe8-->1200
TI = 1; // TI: set TI to send first char of UART
ES = 1;
//--------------------------
TL0 = 0x47; //
TR0 = 1;
ET0 = 1;
//---------------------------
TH0 = 0x00; //
TR1 = 1; // TR1: timer 1 run */
ET1 = 1; //Disable timer 0 irq
EA = 1; // global interrupt enable on
}
/////////////////////////////////////////////////////////////
// Function: Main() //
// Description: //
// //
//////////////////////////////////////////////////////////
void main(void)
{
Init8051Regs();
LcdReset();
Delay5Ms();
ePutstr(0,0,exampl); // 上面一行显示一个预定字符串
Delay5Ms();
r_done = 1; //20041205 有效计时
SBUF = 0x55;
while ( 1 ) // Infinite loop
{
multi_tasking();
}
}
//=======================================
//=Module Name: multi_tasking() =
//=Function: task allocation =
//=======================================
void multi_tasking(void)
{
byte bLen ;
if ( gB_RxIndex )
{
bLen = gB_RxIndex;
Delay1ms(1);
while ( gB_RxIndex > bLen )
{
bLen = gB_RxIndex;
Delay1ms(1);
}
switch ( gBa_DebugBuf[0] )
{
case 'u':
printf("uU");
printB(0x13,1);
clearbuff();
break;
case 'r':
{ printf("EL\r\n"); clearbuff(); }
break;
case 't':
{ printf("test done\r\n"); clearbuff(); }
break;
case 'E':
{ printf("RCVOK\r\n");
printf("ERASEOK\r\n");
printf("EERR3\r\n");
printf("EERR4\r\n");
clearbuff();
}
break;
case 'R':
{ printf("RCVOK\r\n");
printf("Unknow Flash");
clearbuff();
}
break;
case 'S':
{ printf("SERR1\r\n");
printf("SERR2\r\n");
printf("SERR3\r\n");
printf("SERR4\r\n");
printf("RCVOK\r\n");
clearbuff();
}
break;
case 'W':
{ printf("RCVOK\r\n");
printf("PROGRAMOK\r\n");
printf("VERIFYERR\r\n");
clearbuff();
}
break;
default:
clearbuff();
break;
}
}
}
//-------------------------------------------
void clearbuff(void)
{
byte i;
for(i = 0; i < gB_RxIndex; i++)
{ gBa_DebugBuf[i] = 0; }
gB_RxIndex = 0;
}
///////////////////////////////////////////////////////////////////////////////
// interrupt //
///////////////////////////////////////////////////////////////////////////////
void TIME0(void) interrupt 0x01 using 1// for TIME0 0.2ms
{
TL0 = 0x47; //
gB_T1count++;
}
void TIME1(void) interrupt 0x03 using 1// for TIME0 0.2ms
{
TH0 = 0x00;
gB_T2count ++;
//-----------------------------------------
p++ ;
if(p>=2500)
{
p = 0;
if(r_done) //20041205 有效计时
{
Clock[0] = Clock[0]+1;
SBUF = Clock[0] ;
if(Clock[0]>=60)
{
Clock[0] = 0 ;
Clock[1] = Clock[1]+1 ;
if(Clock[1]>=60)
{
Clock[1] = 0 ;
Clock[2] = Clock[2]+1 ;
if(Clock[2]>=24)
{
Clock[2] = 0 ;
}
}
}
}
}
}
/*=======================================================
显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar code *ptr)
{
Uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<16;i++)
{ DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}
/*=======================================================
显示光标定位
=======================================================*/
void Disp_XY( char posx,char posy) {
Uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}
/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
Disp_XY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
}
/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void )
{
LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x01, 1); // 显示清屏
LcdWriteCommand( 0x06, 1); // 显示光标移动设置
LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}
/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
if (AttribC) WaitForEnable(); // 检测忙信号?
RS = 0; RW = 0; _nop_();
DataPort = CMD; _nop_();
// 送控制字子程序
Elcm = 1; _nop_(); _nop_();Elcm = 0; // 操作允许脉冲信号
}
/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW ) {
WaitForEnable();
// 检测忙信号
RS = 1; RW = 0; _nop_();
DataPort = dataW; _nop_();
Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号
}
/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void ) {
DataPort = 0xff;
RS =0; RW = 1; _nop_();
Elcm = 1; _nop_(); _nop_();
while( DataPort & Busy );
Elcm = 0;
}
// 短延时
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -