/***************************************************************************** * 函 数 名: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; }
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); }
/*------------------------------------------------ 主函数 ------------------------------------------------*/ 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; } }
/***************************************************************************** * 函 数 名: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); }