예제 #1
0
/*****************************************************************************
* 函 数 名:write_ds1302
* 函数功能:向DS1302某地址写一字节数据子程序
* 输    入:addr,TDat
* 输    出:
*****************************************************************************/
void WriteDs1302(unsigned char addr,unsigned char TDat)
{
	DS1302_RST=0;
	_nop_();_nop_();
	DS1302_CLK=0;
	_nop_();_nop_();
	DS1302_RST=1;
 	InputByte(addr);//传送8字节地址命令
	_nop_();_nop_();
	InputByte(TDat);//写入数据命令
	DS1302_CLK=1;
	_nop_();_nop_();
	DS1302_RST=0;
}
예제 #2
0
Word VMachine::InputWord(Word address)
{
	//0x01f0 - 0x01f7: IDE controller
	if(address >= 0x01f0 && address < 0x01f8)
		return ideController->ReadPortWord(0x01f0, static_cast<Byte>(address - 0x01f0));

	//0x03f6 & 0x03f7: IDE controller
	if(address == 0x3f6)
		return ideController->ReadPortWord(0x03f0, 6);

	if(address == 0x3f7)
		return ideController->ReadPortWord(0x03f0, 7);

	//Otherwise, split into 2 byte inputs
	return static_cast<Word>(InputByte(address + 1)) << 8 | InputByte(address);
}
예제 #3
0
파일: 2.c 프로젝트: yjcn/gitxx
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
	unsigned char count;//16行扫描数据,范围0-15
	unsigned int i,  j;
	unsigned char temp;
	P3M0=0xff;//推挽
	P1M0=0xff;
	P3M1=0;
	P1M1=0;

	AUXR |= 0x80;                 	//1T
	//AUXR &= 0x7f;                	//12T

	while (1)         //主循环
	{
		i++;
		if(i==100)//更改流动速度,1T单片机和12T单片机速度大约5-8倍,注意更改参数
		{
			i=0;
			MoveBitNum++;
			if(MoveBitNum==16)//每次移动完一个汉字大小后循环
			{
				MoveBitNum=0;
				HzNum+=32;    //调用下一个汉字
				if(HzNum>=11*32)//需要显示的汉字个数乘以32,包括前面的一屏空字符的个数,后面清屏的空字符不包含在内,这里是(汉字个数+4)x32
					HzNum=0;   //完全显示完后循环调用
			}
		}
		Delay(1);//控制扫描频率
		for(j=0;j<5;j++) //取每个汉字的前2个字节,4个汉字组成一行,数据传输完成后锁存输出即可,这里需要多取出一个汉字作为缓冲
		{                //原来j=4,现在j=5.
			buff[2*j]=hztest[HzNum+j*32+count*2];  //每次移动完一个汉字后,选择下一个汉字
			buff[2*j+1]=hztest[HzNum+j*32+count*2+1];
		}
		if(MoveBitNum<8)                   //  判读移动距离是大于一个字节还是小于一个字节,因为一个字节左移右移最大只能8位
		{ 
			IncNum=0; MoveBitNumtemp=MoveBitNum; 
		}
		else
		{ 
			IncNum=1; MoveBitNumtemp=MoveBitNum-8;
		}//大于8就减去8得到的数值还是小于8
		T_STR=0;       //锁存无效
		for(j=0;j<8;j++)          //按bit的方式移动缓冲区的内容,然后输出到595,即取出的数值每个字节左移一定的位数,
		{                                     //后面左移出的数据整合到前面的字节中,保持数据的连续性	     
			temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//这句比较重要,需要自行拿出2个字节的数据模拟分析
			InputByte(temp);//输出到595
		}//8个字节传输完锁存输出
		P1=count;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描16行
		T_STR=1;      //锁存有效,此时一行的数据显示到屏上
		count++;
		if(count==16)
			count=0;
	}
}
예제 #4
0
/*****************************************************************************
* 函 数 名:read_ds1302
* 函数功能:读DS1302地址子程序
* 输    入:add
* 输    出:timedata
*****************************************************************************/
unsigned char ReadDs1302(unsigned char addr)
{
	unsigned char timedata,aa;
	DS1302_RST=0;
	_nop_();_nop_();
	DS1302_CLK=0;
	_nop_();_nop_();
	DS1302_RST=1;
	InputByte(addr);//传送8字节地址命令
	timedata=OutPutByte();//读取字节命令
	DS1302_CLK=1;
	_nop_();_nop_();
	DS1302_RST=0;
	aa=timedata%16;
	timedata=timedata/16;
	timedata=timedata*10+aa;
	return(timedata);
}