?? computer2.c
字號:
/********************************************************************/
/* 2006-05-24 */
/******************* RS232接收不定數據長度的程序 ********************/
/***************************** Ver 1.0 ******************************/
#include <reg51.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
/* 直接訪問方式地址定義,根據用戶平臺接口修改 */
//PARA1 EQU 20H ; 應用于DMF682(256*128)
//PARA1 EQU 28H ; 應用于DMF50081/50174(320*240)
//PARA1 EQU 50H ; 應用于DMF50036(640*200)
#define wcadd1 XBYTE[0xbf00] /* 寫指令代碼地址 */
#define wdadd1 XBYTE[0x3f00] /* 寫參數及顯示數據地址 */
#define rdadd1 XBYTE[0xbf00] /* 讀參數及顯示數據地址 */
#define rbadd1 XBYTE[0x3c00] /* 讀忙狀態地址 */
#define Io8155 XBYTE[0xef00]
#define M8155 XBYTE[0xcf00]
#define M8155_1 XBYTE[0xcf10]
#define Io8155_A XBYTE[0xef01]
#define Io8155_B XBYTE[0xef02]
#define Io8155_C XBYTE[0xef03]
/* 程序參數定義,根據用戶選擇的LCM型號修改 32K(7FFFH)*/
#define True 1
#define False 0
#define PARA 0x28;
#define AD_Value 0x2c;
#define Rs232_Input_LEN 10
#define Rx_start_data 0x81
typedef unsigned char uchar;
typedef unsigned int uint;
sfr16 DPTR = 0x82;
sfr16 flash = 0xb3;
sfr SMOD = 0x87;
sfr SFCF = 0xb1;
sfr SFCM = 0xb2;
sfr SFAL = 0xb3;
sfr SFAH = 0xb4;
sfr SFDT = 0xb5;
sfr SFST = 0xb6;
sbit RS485 = P1^2; //S52
sbit MCU_LED = P1^0;
sbit MCU_LED2 = P0^0;
sbit Ds1302_clock = P2^2;
sbit Ds1302_data = P2^1;
sbit Ds1302_rst = P2^0;
//sbit RS485 = P3^5; //C2051
//sbit MCU_LED = P1^7;
//sbit Ds1302_clock = P1^6;
//sbit Ds1302_data = P1^5;
//sbit Ds1302_rst = P1^4;
sbit Video = P3^7;
/*********************************/
/* 定義調用子程序 */
void Close_write_bit(void);
void Open_write_bit(void);
void Init_ds1302(void);
void Read_ds1302();
void Write_ds1302(uchar address,uchar numb);
uchar TXD_pc(uchar icode);
void delay_2();
void delay(uint count0);
void delay_3(uchar count0);
//;-------------- DMF-50081/50174 的SYSTEM SET 參數 --------------
//SYSTAB: DB 30H,87H,07H,27H,42H,0F0H,28H,00H ; P1-P8參數
//SCRTAB: DB 00H,00H,0F0H,00H,30H,0F0H,00H,60H,00H,00H ; P1-P10參數
/*-------------------240128的SYSTEM SET 參數-------------------------------*/
//code uchar SYSTAB[8]={0x30,0x87,0x07,0x1e,0x21,0x80,0x1f,0x00};
//code uchar SCRTAB[10]={0x00,0x00,0x80,0xf0,0x01,0x80,0x00,0x00,0x00,0x00};
/*-------------------320240的SYSTEM SET 參數-------------------------------*/
code uchar SYSTAB[8] = {0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
code uchar SCRTAB[10] = {0x00,0x00,0xf0,0x00,0x30,0xf0,0x00,0x60,0x00,0x00};
//code uchar SCRTAB[10]={0x00,0x00,0xf0,0xce,0x04,0xf0,0x80,0x00,0x00,0x00};
/* 在此可以觀察文本方式下的字符及光標的顯示效果(寫入內容為"Sevicer tel:") */
code uchar DRAG_1[6][5] = {0,1,2,3,0xfe,0,1,4,5,0xfe,6,7,8,9,0xfe,10,8,4,5,0xfe,11,12,13,14,0xfe,53,54,55,56,0xff};
code uchar TXT_2[] = {0x84,0x84,0x84,0x84,0x84,0x84,0xff};
code uchar TXT_1[] = {0x80,0x80,0x80,0x80,0x80,0x82,0xff};
code uchar TXT_3[] = {23,23,23,23,23,23,0xff};
code uchar TXT_4[] = {59,57,58,60,0xff};
code uchar TXT_5[] = {67,68,69,63,64,0xff};
/* 文本方式下的漢字顯示方法
在文本方式下顯示漢字, 需要在SED1335 等顯示RAM 內建立一個自定義字符庫
CGRAM,然后通過在相應的單元寫入相應的字符代碼來實現漢字的顯示.
SED1335 等的字符代碼對應的是8x8 點陣的字符塊, 而一個漢字需要四個8x8
點陣的字符塊組合顯示, 所以在建立漢字的CGRAM 時, 需要四個字符代碼管理一個
漢字, 一般是按左上部, 左下部, 右上部和右下部四部分分配代碼. 比如在演示程
序中建立 "清華" 兩個漢字的CGRAM,那么這兩個漢字的代碼為80H(81H,82H,83H)和
84H(85H,86H,87H). */
uchar menu = 0;
uchar TH0_T,TL0_T;
uchar Buffer;
uint V_ml;
uchar Speed_V;
uchar bdata AD;
uint bdata Adend;
sbit AD_0 = AD^0;
sbit AD_1 = AD^1;
sbit AD_7 = AD^7;
bit Read_Flag;
bit Write_Flag;
bit Stop;
bit Stop1;
bit Ack;
bit Work;
bit Work1;
/**************************/
/*******串口接收設置*******/
bit Rs232_Rece_Error;
bit Start_Rxd;
uchar Rs_buf[Rs232_Input_LEN];
uchar M_D[8];
unsigned char g_cReceNum;
bit Rs232_Flag;
/*********************/
/* 演示主程序 */
/*********************/
void main()
{
TH1 = TL1 = 0xFD; //9600Kbps
Ack = False;
g_cReceNum = 0;
Work = False;
Stop = False;
TH0_T = 0; TL0_T = 0;
delay_2();
_nop_();
MCU_LED = 0;
delay(500);
MCU_LED = 1;
delay(500);
MCU_LED = 0;
delay(500);
MCU_LED = 1;
delay(500);
MCU_LED = 0;
delay(500);
MCU_LED = 1;
Init_ds1302();
ES = 1;
delay_3(1);
SCON = SCON|0x50;
while(1)
{
TMOD = TMOD|0x21;
//PCON |= 0x80;
TR1 = True; EA = True;
TR0 = True; ET0 = True;
ES = True;
if (Rs232_Rece_Error) {
Rs232_Rece_Error = False;
TXD_pc(0xBD);TXD_pc(0x90);TXD_pc(0x90);
TXD_pc(0x90);TXD_pc(0x90);TXD_pc(0x90);
}
if (Rs232_Flag)
{
Rs232_Flag = 0;
if (Rs_buf[2] == 0xB1)
{
RS485 = False;
MCU_LED = 0;
Work = True;
TXD_pc(0xBD);TXD_pc(0xA0);TXD_pc(0xA0);
TXD_pc(0xA0);TXD_pc(0xA0);TXD_pc(0xA0);
}
if (Rs_buf[2] == 0xB2)
{
RS485 = True;
MCU_LED = 1;
Stop = True;
TXD_pc(0xBD);TXD_pc(0xA3);TXD_pc(0xA3);
TXD_pc(0xA3);TXD_pc(0xA3);TXD_pc(0xA3);
}
if (Rs_buf[2] == 0xB3)
{
Ack = True;
}
if (Rs_buf[2] == 0xB4) //讀時間秒 ,分,小時,日,月,年
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
Read_ds1302();
TXD_pc(M_D[0]);
TXD_pc(M_D[1]);
TXD_pc(M_D[2]);
TXD_pc(M_D[3]);
TXD_pc(M_D[4]);
TXD_pc(M_D[6]);
}
if (Rs_buf[2] == 0xB5) //寫秒
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
Open_write_bit();
Write_ds1302(0,Rs_buf[1]);
Close_write_bit();
}
if (Rs_buf[2] == 0xB6) //寫分
{
MCU_LED = 0;
delay(100);
MCU_LED = 1;
Open_write_bit();
Write_ds1302(1,Rs_buf[1]);
Close_write_bit();
}
if (Rs_buf[2] == 0xB7) //寫時
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
Open_write_bit();
Write_ds1302(2,Rs_buf[1]);
Close_write_bit();
}
if (Rs_buf[2] == 0xB8) //寫日
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
Open_write_bit();
Write_ds1302(3,Rs_buf[1]);
Close_write_bit();
}
if (Rs_buf[2] == 0xB9) //寫月
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
Open_write_bit();
Write_ds1302(4,Rs_buf[1]);
Close_write_bit();
}
if (Rs_buf[2] == 0xBA) //寫年
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
Open_write_bit();
Write_ds1302(6,Rs_buf[1]);
Close_write_bit();
}
if (Rs_buf[2]== 0xBB) //開視頻切換
{
Video = False;
MCU_LED = 0;
delay(10);
MCU_LED = 1;
}
if (Rs_buf[2]== 0xBC) //關視頻切換
{
Video = True;
MCU_LED = 0;
delay(10);
MCU_LED = 1;
}
if (Rs_buf[2] == 0xBE)
{
MCU_LED = 0;
delay(10);
MCU_LED = 1;
TXD_pc(Rs_buf[0]);
TXD_pc(Rs_buf[1]);
TXD_pc(Rs_buf[2]);
TXD_pc(Rs_buf[3]);
TXD_pc(Rs_buf[4]);
TXD_pc(Rs_buf[5]);
Rs_buf[2] = 0;
}
}
}
}
uchar count;
/******************/
/*產生輸液量的定時*/
/******************/
void Time_0(void) interrupt 1
{
TR0 = 0;
EA = 0;
TH0 = TH0_T;
TL0 = TL0_T;
if (count>=25)
{
count = 0;
if (!Ack)
{
RS485 = True;
MCU_LED = True;
Work = False;
}
Ack = False;
}
else count++;
EA = 1;
TR0 = 1;
}
/*******************************/
/***********串口接收************/
/*******************************/
/*********接收不固定長度********/
/*void RS232(void) interrupt 4 using 1
{
unsigned char Rece_data = SBUF;
uchar i;
uchar verify = 0;
EA = False;
ES = False;
MCU_LED2 = False;
count = 0;
RI = 0;
if (Start_Rxd)
{
g_cReceNum ++;
Rs_buf[g_cReceNum] = Rece_data;
if (Rs_buf[1] == g_cReceNum+1)
{
for (i=0;i<Rs_buf[1]-1;i++)
{
verify^=Rs_buf[i];
}
if (verify == Rs_buf[g_cReceNum])
{
Rs232_Flag = True;
g_cReceNum = 0;
}
else
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -