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

📄 main.c

📁 周立功EasyARM2104开发板 ARM 下载程序
💻 C
字号:
/*flashman编写,QQ28479691,欢迎交流,谢谢飘零仁兄指点*/

#include  "config.h"
#define bit(i) (1<<1)
#define rs (1<<8)
#define rw (1<<9)
#define en (1<<10)
#define busy (1<<7)		

uint8 BCD[6];			//十位二进制的显示码分别是千百十个位的显示

__inline void enable_irq()
	{
	uint8 tmp;
	__asm
		{
		MRS tmp,CPSR
		BIC tmp,tmp,#0x80
		MSR CPSR_c,tmp
		}
	}

__inline void disable_irq()
	{
	uint8 tmp;
	__asm
		{
		MRS tmp,CPSR
		ORR tmp,tmp,#0x80
		MSR CPSR_c,tmp
		}
	}

__inline void enable_frq()
	{
	uint8 tmp;
	__asm
		{
		MRS tmp,CPSR
		BIC tmp,tmp,#0x40
		MSR CPSR_c,tmp
		}
	}

__inline void disable_frq()
	{
	uint8 tmp;
	__asm
		{
		MRS tmp,CPSR
		ORR tmp,tmp,#0x40
		MSR CPSR_c,tmp
		}
	}


void  delay(uint32  dly);
void timer1_init(void);
void __irq tInt(void);
void int_init(void);
void ChkBusy(void);
void WrOp(uint8 dat);
void WrDat(uint8 dat);	//读数据
void lcd_init(void);
void DisText(uint8 addr,uint8 *p);
void ShowInt(uint8 addr,uint16 num);			//在addr处显示数字num
void ShowByte(uint8 addr,uint8 num);

/****************************************************/
int  main(void)
{
	PINSEL0|=(1<<23);
	IODIR=0x0fff;		//设置为输出
	IOCLR=0xffff;
	IODIR &=~bit(11);	//设置为输入
	IOSET =bit(11);
	lcd_init();
	ShowInt(0x80,0);
	int_init();
	timer1_init();
	enable_irq();
	while(1);
}
/*
{
	IODIR=0x07ff;		//设置为输出
	IOCLR=0x7ff;
//	IODIR &=~bit(11);	//设置为输入
	PINSEL0|=(1<<23);
//	IOSET =bit(11);
	lcd_init();
	ShowInt(0x80,8);
	int_init();
	timer1_init();
	enable_irq();
	while(1);
}*/

/**************************************************/
void  delay(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<500; i++);
}


void timer1_init(void)
{//定时器计数器0设置,晶振为12M,1秒要运行1000000个周期,
	T1PR=1000;		//预分频寄存器
	T1CCR=0x00000038;		//捕获CR1.1下降沿,并产生中断
	T1TCR=0x00000003;		//T0PC和T0TC复位
	T1TCR=0x00000001;		//T0PC和T0TC复位
}

void __irq tInt(void)
{//中断处理程序
	ShowInt(0x80,T1CR1);		//显示捕获值
	T1IR=0x00000020;  		//清除中断标志
}

void int_init(void)
{//中断设置
	VICIntSelect=0x00000000;
	VICIntEnable=0x00000020;
	VICVectCntl0=0x00000025;
	VICVectAddr0=(int)tInt;
}

/********************LCD程序********************************/
void ChkBusy()
{
	IODIR=0xff00;
	while(1)
	{
		IOCLR=rs;
		IOSET=rw;
		IOSET=en;
		if(!(IOPIN & busy))break;
		IOCLR=en;
	}
	IODIR=0xffff;
}

void WrOp(uint8 dat)
{
	ChkBusy();
	IOCLR=rs;		//全部清零
	IOCLR=rw;
	IOCLR=0xff;		//先清零
	IOSET=dat;		//再送数
	IOSET=en;
	IOCLR=en;
}

void WrDat(uint8 dat)	//读数据
{
	ChkBusy();
	IOSET=rs;
	IOCLR=rw;
	IOCLR=0xff;		//先清零
	IOSET=dat;		//再送数
	IOSET=en;
	IOCLR=en;
}

void lcd_init(void)
{
	WrOp(0x38);			
	WrOp(0x06);			//光标加1
	WrOp(0x0c);			//开显示
}

void DisText(uint8 addr,uint8 *p)
{
	WrOp(addr);
	while(*p !='\0')WrDat(*(p++));
}

void ShowInt(uint8 addr,uint16 num)			//在addr处显示数字num
{//将num转化成五个BCD码存放在全局数组BCD[5]中
	uint8 i;
	for(i=5;i>0;i--)       //将NUM数据转化成ASCII码,如521会转化为00521
	{
       	  BCD[i-1]=(uint8)(num%10+0x30);     //取出最低位
       	  num/=10;                           //去掉最低位
    }
    i=0;
	while(BCD[i] ==0x30 && i<4) BCD[i++]=' ';    //NUM转换成数组存放,但还没有加上小数点
	BCD[5]='\0';
	DisText(addr,BCD);
}

void ShowByte(uint8 addr,uint8 num)
{//将num转化成五个BCD码存放在全局数组BCD[5]中
	uint8 i;
	for(i=3;i>0;i--)       //将NUM数据转化成ASCII码,如521会转化为00521
	{
       	  BCD[i-1]=(uint8)(num%10+0x30);     //取出最低位
       	  num/=10;                           //去掉最低位
    }
    i=0;
	while(BCD[i] ==0x30 && i<2) BCD[i++]=' ';    //NUM转换成数组存放,但还没有加上小数点
	BCD[3]='\0';
	DisText(addr,BCD);
}



⌨️ 快捷键说明

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