#include <REG931.H>
#include <INTRINS.H>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ClkDown OCC = 0 //P1.7
#define ClkUp OCC = 1
#define DataLow KB0 = 0 //P0.0
#define DataHigh KB0 = 1
#define LEDown OCD = 0 //P2.1
#define LEUp OCD = 1
sbit LED1 = P2^2;
sbit LED2 = P2^3;
sbit KB = P1^6;
sbit adcs = P2^4; //out
sbit dout = P2^3; //in
sbit adclk = P1^4; //out
// 间接访问方式地址定义
// 控制引脚定义
sbit RS =P1^7;
sbit RW =P2^1;
sbit Elcm=P2^0;
////////////////////////////////////////////////////////////////////////////
#define DataPort P0// 数据端口
//instruction
#define Busy 0x80
#define Work_M 0x38//n=1,f=0
#define Cls 0x01
#define Input_M 0x06//i/d=1 ac++ s=0 screen move=off
#define Screen_Off 0x08
#define Disp_M 0x0c//d=1 disp=on c=0 cursor=off
#define Ddram_Al1 0x80;
#define Ddram_Al2 0xc0;//0x80+0x40
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
/* 设为全局变量 */
unsigned char com,dat;
///////////////////////////////////////////////
uchar dispc[2][16]=
{
' ',' ','O','U','T','P','U','T',' ','P','O','W','E','R',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','d','B','m',' ',' ',' '
};
uchar low[2][16]=
{
' ',' ','O','U','T','P','U','T',' ','P','O','W','E','R',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','d','B','m',' ',' ',' '
};
uchar pllfreq[6]={2,0,8,0,0,0};
uchar pllstate=1;
/////////////////////////////////////////
code unsigned char ctab[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','<','o','w'};
/////////////////////////////////////////
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
uchar rflag=0; //定义读标志
uchar sflag=0; //定义发送标志
///////////////////
#define SCOUNT 10
#define RCOUNT 10 //note : cause the invalid ip --> 0000
//idata <256 data <128 bdata bit pdata movx @ri xdata movx @dptr
unsigned char data countsms;
unsigned char data rpoint;//point the next address
unsigned char data spoint;
//**********************
unsigned char idata ssbuf[SCOUNT+1];
//**********************
unsigned char data rbuf[RCOUNT+1];
uchar rtemp;
//======================================================================
//串口接收中断
void UART_ISR(void) interrupt 4 using 3//当接收完一个字节RI置1进入Recieve中断
{
rtemp=SBUF; //保存所读取的数据
RI=0; //RI清0以等待下次发送 // set flag for polling in main loop
//rflag--1 已接收到AA,2--命令字节已接收到
if (rflag==1)
{
rbuf[rpoint]=rtemp;
if (rpoint<RCOUNT)
{
rpoint++;
}
}
if (rtemp==0xaa)
{
rpoint=0;
rflag=1;
}
}
//=======================================================================
//串口发送
void sendm(unsigned char sl)
{
EA=0;//dellete????????????????????????????duplex
for(spoint=0;spoint<sl;spoint++) // send string
{
// clear transmit interrupt flag
SBUF=ssbuf[spoint]; //start sending one byte
while (!TI);
TI=0;
// wait until sent
}
EA=1;
}
//=======================================================================
//串口初始化
void UART_init(void)
{
SCON =0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
SSTAT=0x60; // separate Rx / Tx interrupts
BRGR0=0xF0; // setup BRG for 9600 baud @ 7.373MHz internal RC oscillator
BRGR1=0x02;
BRGCON = 0x03; // enable BRG
//header of sending string
rpoint=0;
spoint=0;
rbuf[RCOUNT]=0;
ssbuf[SCOUNT]=0;
ssbuf[0]=0xaa;
rflag=0;
ESR=1; //ESR=Enable Serial Recieve
EST=1; //EST=Enable Serial Transmit
// EA=1; //使能中断
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void initio(void)
{
P0M1 = 0x00;
P0M2 = 0x00;//P0
P1M1 = 0x2c;
P1M2 = 0x0c; //P1.2 P1.3 0C OUTPUT
P2M1 = 0x00;
P2M2 = 0x00;
DataLow;
ClkDown;
LEDown;
KB=1;
LED1=1;
LED2=1;
}
/***********************************/
/* 间接访问方式的驱动函数 */
/***********************************/
/* 直接驱动函数由4个子程序组成:
1.读BF和AC值函数WaitForEnable
2.写指令代码函数LcdWriteCommand
3.写显示数据函数LcdWriteData
4.读显示数据函数LcdReadData
*/
/*---------读BF和AC值函数---------*/
/*
=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================
*/
void WaitForEnable( void )
{
DataPort = 0xff;
RS =0;RW = 1;
Elcm = 1;
/* 判BF=0? */
_nop_();
while( DataPort & Busy );
Elcm = 0;
//ACC=P1; while(ACC_7==1); com=cradd;
}
/*
=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================
*/
/*-----------写指令函数-----------*/
void LcdWriteCommand( void )
{
WaitForEnable(); // 检测忙信号?
RS = 0;RW = 0;
DataPort = com;
// 送控制字子程序
_nop_();
Elcm = 1;
_nop_();
_nop_();
Elcm = 0; // 操作允许脉冲信号
}
/*
=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================
*/
/*-----------写数据函数-----------*/
//void LcdWriteData( char dataW ) {
void LcdWriteData( void )
{
WaitForEnable();
// 检测忙信号
RS = 1;RW = 0;
DataPort = dat;
_nop_();
Elcm = 1;
_nop_();
_nop_();
Elcm = 0; // 操作允许脉冲信号
}
/*
=======================================================
initialization of LCD
=======================================================
*/
void initLCD(void)
{
unsigned char i,j;
for(j=0;j<3;j++)
{
RS=0;
RW=0;
DataPort=Work_M;
Elcm=1;
_nop_();
Elcm=0;
for(i=0;i<180;i++);
Elcm=1;
_nop_();
Elcm=0;
}
com=Work_M;
LcdWriteCommand();
com=Screen_Off;
LcdWriteCommand();
com=Cls;
LcdWriteCommand();
com=Input_M;
LcdWriteCommand();
com=Disp_M;
LcdWriteCommand();
}
/*
=======================================================
disp the string
=======================================================
*/
void Dispall(void)
{
uchar i;
com = Ddram_Al1;
LcdWriteCommand();
for (i=0;i<16;i++)
{
dat=dispc[0][i];
LcdWriteData(); // 写字符
}
com = Ddram_Al2;
LcdWriteCommand();
for (i=0;i<16;i++)
{
dat=dispc[1][i];
LcdWriteData();
}
}
//////
void Dispall1(void)
{
uchar i;
com = Ddram_Al1;
LcdWriteCommand();
for (i=0;i<16;i++)
{
dat=low[0][i];
LcdWriteData(); // 写字符
}
com = Ddram_Al2;
LcdWriteCommand();
for (i=0;i<16;i++)
{
dat=low[1][i];
LcdWriteData();
}
}
//==============================================================================================
/****************************************************************
;说明CPU配置WDTE=1WDSE=0
;***************************************************************/
void init_wdt()
{
ACC = WDCON; //读取WDT控制寄存器
ACC = ACC|0xc5; //置位ACC.2准备启动WDT PRE2PRE1PRE0=110_D765 WDCLK_D0当该位为1时选择看门狗振荡器作为时钟源
WDL = 0xff; //设置8位倒计时器初值 c5/1.31s e5/2.62s
WDCON = ACC; //启动WDT
WFEED1 = 0xA5; //清零第一部分
WFEED2 = 0x5A; //清零第二部分
}
/*****************************
;喂狗子程序
;注意程序中开启中断
*****************************/
void clrwdt()
{
EA = 0; //关闭中断
WFEED1 = 0xA5; //执行清零第一部分
WFEED2 = 0x5A; //执行清零第二部分
EA = 1; //开中断
}
//***********
kk.rar_串行AD_串行AD 单片机
版权申诉
31 浏览量
2022-09-14
15:16:44
上传
评论
收藏 39KB RAR 举报
周楷雯
- 粉丝: 80
- 资源: 1万+