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

📄 shukong3.c

📁 这里有很多我自己做的凌阳单片机源程序
💻 C
字号:
#include<spce061a_chf.h>
#define	Uint	unsigned int
typedef struct
{
	Uint bit0  : 1;
	Uint bit1  : 1;
	Uint bit2  : 1;
	Uint bit3  : 1;
	Uint bit4  : 1;
	Uint bit5  : 1;
	Uint bit6  : 1;
	Uint bit7  : 1;
	Uint bit8  : 1;
	Uint bit9  : 1;
	Uint bit10 : 1;
	Uint bit11 : 1;
	Uint bit12 : 1;
	Uint bit13 : 1;
	Uint bit14 : 1;
	Uint bit15 : 1;
}Bit;

typedef struct
{
	Uint bytel  : 8;
	Uint byteh  : 8;
}Byte;
	
typedef union
{
	Bit bit;
	Byte byte;
	Uint port;
}UNport;


#define PA    			((volatile UNport *)(0x7000))
#define PA_Buffer		((volatile UNport *)(0x7001))
#define PA_Dir   		((volatile UNport *)(0x7002))
#define PA_Attrib   	((volatile UNport *)(0x7003))
#define	PA_Latch   		((volatile UNport *)(0x7004))
#define	PB    			((volatile UNport *)(0x7005))
#define	PB_Buffer   	((volatile UNport *)(0x7006))
#define	PB_Dir   		((volatile UNport *)(0x7007))
#define	PB_Attrib   	((volatile UNport *)(0x7008))
#define	P0_0		PA->bit.bit0
#define	P0_1		PA->bit.bit1
#define	P0_2		PA->bit.bit2
#define	P0_3		PA->bit.bit3
#define	P0_4		PA->bit.bit4
#define	P0_5		PA->bit.bit5
#define	P0_6		PA->bit.bit6
#define	P0_7		PA->bit.bit7
#define	P0_8		PA->bit.bit8
#define	P0_9		PA->bit.bit9
#define	P0_10		PA->bit.bit10
#define	P0_11		PA->bit.bit11
#define	P0_12		PA->bit.bit12
#define	P0_13		PA->bit.bit13
#define	P0_14		PA->bit.bit14
#define	P0_15		PA->bit.bit15
#define	P1_0		PB->bit.bit0
#define	P1_1		PB->bit.bit1
#define	P1_2		PB->bit.bit2
#define	P1_3		PB->bit.bit3
#define	P1_4		PB->bit.bit4
#define	P1_5		PB->bit.bit5
#define	P1_6		PB->bit.bit6
#define	P1_7		PB->bit.bit7
#define	P1_8		PB->bit.bit8
#define	P1_9		PB->bit.bit9
#define	P1_10		PB->bit.bit10
#define	P1_11		PB->bit.bit11
#define	P1_12		PB->bit.bit12
#define	P1_13		PB->bit.bit13
#define	P1_14		PB->bit.bit14
#define	P1_15		PB->bit.bit15

#define startA 0x0031//4096&1
#define stopA 0x0036//0&0停止计数

void write_flash(void);//写存储区的数据
unsigned int read_flash();//读取存储取的数据
void page_erase();//檫除页
void write_command(unsigned int);//写命令
void write_data(unsigned int );//写数据
void check_busy();//检测busy信号
void lcd_init();//lcd初始化操作
void lcd_display(void);//显示操作
unsigned int key_scan();//按键扫描,有操作才进行显示和存储操作
void get_key();//获取键控的键值
void jiema_init();//解码中断初始化
unsigned int get_ma(void);//获取遥控码值
void delay();


unsigned int a[5]="K=150";
//unsigned int flag2;//遥控更新数据的标志
unsigned int num[8]={0};
unsigned int value;//表示增益数字
unsigned int k=5;//表示增益数字的位数
unsigned int *addr=0xf100;//要檫除的页地址
unsigned int flag;
int main()
{	
	unsigned int flag1=0;//按键和遥控改变的标志	
	Set_IOB_Dir(0xf0);
	Set_IOB_Attrib(0xf4);
	Set_IOB_Data(0x04);//外部中断为悬浮式输入
	
	value=read_flash();
	jiema_init();
	lcd_init();	
	lcd_display();
	Set_IOB_Data(((~(value/10))<<4)&0xf0);
	
	while(1)
	{
		Watchdog_Clear();
		if(flag==0)//没有外部中断的时候扫描键盘
		{
			flag1=key_scan();		
			if(flag1)
			{
				get_key();//直接是???的形式					
				flag1=0;
			}	
				
				value=get_ma();	
				lcd_init();		
				lcd_display();				
				page_erase();
				write_flash();	
				Set_IOB_Data(((~(value/10))<<4)&0xf0);		
		}	
	}
}

void write_flash()
{
	*P_Flash_Ctrl=0xaaaa;
	*P_Flash_Ctrl=0x5533;
	*addr=value;
}
void page_erase(void)
{
	*P_Flash_Ctrl=0xaaaa;
	*P_Flash_Ctrl=0x5511;
	*addr=0x0000;//向相应的页地址写如任意值;
}
unsigned int read_flash(void)
{
	unsigned int data1;
	data1=*addr;
	return (data1);
}
//初始化函数
void lcd_init(void)
{		
	write_command(0x38);//显示模式的设置		
	write_command(0x08);//显示关闭*/		
	write_command(0x0c);//整体显示,关光标,不闪烁
	write_command(0x06);//显示光标移动设置
	write_command(0x01);	//显示清屏
}
//写命令函数,IOA0~IOA2为控制端口,IOA8~IOA15为数据端口
void write_command(unsigned int command)
{	
	check_busy();
	Set_IOA_Dir(0xff07);
	Set_IOA_Attrib(0xff07);	
	PA->byte.byteh=command;//操作高8位	
	P0_0=0;//rs=0
	P0_1=0;//rw=0
	P0_2=1;//E=1
	asm("nop");		
	P0_2=0;//E=0;//下降沿触发	
}
//写数据函数
void write_data(unsigned int data2)
{
	check_busy();
	Set_IOA_Dir(0xff07);
	Set_IOA_Attrib(0xff07);		
	PA->byte.byteh=data2;//操作高8位	
	P0_0=1;//rs=1	
	P0_1=0;//rw=0
	P0_2=1;//E=1
	asm("nop");	
	P0_2=0;//E=0;//下降沿触发	
}
void check_busy()
{	
	unsigned int c;
	
	Set_IOA_Dir(0x0007);
	Set_IOA_Attrib(0xff07);
	Set_IOA_Data(0xff00);//悬浮式输入	
		
	do
	{
		Watchdog_Clear();		
		P0_0=0;//rs=0
		P0_1=1;//rw=1
		P0_2=1;//E=1	
		c=PA->byte.byteh;//只读出高8位			
		P0_2=0;//E=0;
		asm("nop");		
		c&=0x80;	
	}while(c==0x80);	
}
unsigned int key_scan()
{
	if(P1_0==1)
	{
		delay();
		if(P1_0==1)
		{
			return(1);
		}
	}
	else if(P1_1==1)
	{
		delay();
		if(P1_1==1)
		{
			return(1);
		}
	}	
	else
	{
		return(0);
	}
}
void get_key()
{
	if(P1_0==1)
	{
		do{
			Watchdog_Clear();
		}while(P1_0==1);
		if(value<150)//
			{
				if(value==1)
				{
					value=10;
				}
				else
				{
					value+=10;				
				}
			}
	}
	if(P1_1==1)//'-10'
		{
			do
			{
				Watchdog_Clear();
			}while(P1_1==1);//等待按键释放
			if((value==10)|(value==1))
			{
				value=1;				
			}	
			else 
			{
				value-=10;
			}	
		}
}			
void jiema_init()
{	
	//时钟的设置
	*P_SystemClock=0x0013;//24.576--24.576/8
	//定时器时钟的设置
	Set_TimerA_Data(0x0000);//定时器A从0开始计数
	Set_TimerA_Ctrl(stopA);//开始先不计数
	//设置中断
	*P_INT_Ctrl=0x0100;//开IRQ3_EXIT1中断
	//开中断
	asm("irq on");
}
unsigned int get_ma()
{
	unsigned int i;		
	for(i=0;i<8;i++)
	{
		if(num[i]>130)
		{
			num[i]=1;
		}
		else
		{
			num[i]=0;
		}
	}	
	i=num[0]*128+num[1]*64+num[2]*32+num[3]*16+num[4]*8+num[5]*4+num[6]*2+num[7]*1;		
	switch(i)
	{
		case 0xff:return(1);break;
		case 0x7f:return(10);break;
		case 0xbf:return(20);break;
		case 0x3f:return(30);break;
		case 0xdf:return(40);break;
		case 0x5f:return(50);break;
		case 0x9f:return(60);break;
		case 0x1f:return(70);break;
		case 0xef:return(80);break;
		case 0x6f:return(90);break;		
		case 0x87:return(100);break;
		case 0x27:return(110);break;
		case 0xa7:return(120);break;
		case 0x07:return(130);break;
		case 0x05:return(140);break;
		case 0x95:return(150);break;
		default:return(value);break;
	}
}
void delay()
{
	unsigned int r,e;
	r=0;		
	while(r--)
	{
		e=0xfff;
		while(e--)
		{
			Watchdog_Clear();
		}
	}
}
void lcd_display()
{
	unsigned int l;
	if((value>0)&(value<=150))
	{
		if(value>=100)
		{
			a[2]=value/100+48;
			a[3]=(value-100)/10+48;
			a[4]=0+48;
			k=5;
		}
		else if((value>=10)&(value<100))
		{
			a[2]=value/10+48;
			a[3]=0+48;
			k=4;
		}
		else
		{
			a[2]=1+48;
			k=3;
		}	
	}
	else
	{
		value=150;
	}	
	for(l=0;l<k;l++)
	{		
		write_data(a[l]);
	}
}	
	
	
	

⌨️ 快捷键说明

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