⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hardware.c

📁 Verilog, c and asm source codes of the Minimig system, a fpga implementation of the Amiga computer.
💻 C
字号:
/*
Copyright 2005, 2006, 2007 Dennis van Weeren

This file is part of Minimig

Minimig is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

Minimig is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Hardware control routines

27-11-2005		-started coding
29-01-2006		-done a lot of work
31-01-2006		-added key repeat
06-02-2006		-took out all button handling stuff
*/

#include <pic18.h>
#include "hardware.h"

/*local functions*/
void ScanKeys(void);

/*variables*/
unsigned short systimer;	/*system timer*/
	
/*initialize hardware*/
void HardwareInit(void)
{
	/*disable analog inputs*/
	ADCON1=0b00000110;
	
	/*initalize output register*/
	PORTA=0b00100011;
	PORTB=0b01100000;
	PORTC=0b00010001;	

	/*enable PORTB weak pullup*/
	RBPU=0;
			
	/*initialize SPI*/
	SSPSTAT=0x00;
	SSPCON1=0x32; //changed from 1/16 to 1/64

	/*initialize input/ouput configuration*/
	TRISA=0b11001100;
	TRISB=0b00001011;
	TRISC=0b10010000;
	
	/*initialize serial port*/
	/*SPBRG=129;*/	/*9600 BAUD @ 20MHz*/
	SPBRG=10;	/*115200 BAUD @ 20MHz*/
	TXSTA=0x24;
	RCSTA=0x90;
	
	/*init timer0, internal clk, prescaler 1:256*/
	T0CON=0xc7;
	
	/*enable interrupt for timer 0*/
	TMR0IE=1;
	GIE=1;
}

/*interrupt service routine*/
void interrupt intservice(void)
{
	/*clear timer 0 interrupt flag*/
	TMR0IF=0;
	
	/*set timer to timeout every 10ms
	@20Mhz --> instruction=200ns
	200ns * 256 * 195 = 10ms*/
	TMR0-=195;	

	/*increment system timer*/
	systimer++;	
}

/*get system timer + offset (handy for lots of things)*/
unsigned short GetTimer(unsigned short offset)
{
	unsigned short r;
	
	/*get system time SAFELY*/
	GIE=0;
	r=systimer;
	GIE=1;
	
	/*add offset*/
	r+=offset;

	return(r);
}

/*check if timer is past given time in <t>
t may be maximum 30000 ticks in the future*/
unsigned char CheckTimer(unsigned short t)
{
	/*calculate difference*/
	GIE=0;
	t-=systimer;
	GIE=1;
	
	/*check if <t> has passed*/
	if(t>30000)
		return(1);
	else
		return(0);
}

/*put out a chacter to the serial port*/
void putch(unsigned char ch) 
{
	while(TRMT==0);
	TXREG=ch;  	
}

/*SPI-bus*/
unsigned char SPI(unsigned char d)		
{
	SSPBUF = d;
	while (!BF);			/*Wait untill controller is ready*/
	return(SSPBUF);			/*Return with received value*/
}

/*FPGA configuration serial interface*/
void ShiftFpga(unsigned char data)
{
	/*bit 0*/
	DIN=0;
	CCLK=0;
	if(data&0x80)
		DIN=1;
	CCLK=1;

	/*bit 1*/
	DIN=0;
	CCLK=0;
	if(data&0x40)
		DIN=1;
	CCLK=1;

	/*bit 2*/
	DIN=0;
	CCLK=0;
	if(data&0x20)
		DIN=1;
	CCLK=1;

	/*bit 3*/
	DIN=0;
	CCLK=0;
	if(data&0x10)
		DIN=1;
	CCLK=1;

	/*bit 4*/
	DIN=0;
	CCLK=0;
	if(data&0x08)
		DIN=1;
	CCLK=1;

	/*bit 5*/
	DIN=0;
	CCLK=0;
	if(data&0x04)
		DIN=1;
	CCLK=1;

	/*bit 6*/
	DIN=0;
	CCLK=0;
	if(data&0x02)
		DIN=1;
	CCLK=1;

	/*bit 7*/
	DIN=0;
	CCLK=0;
	if(data&0x01)
		DIN=1;
	CCLK=1;
}





	
	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -