main.c

来自「嵌入式计算机及接口技术」· C语言 代码 · 共 462 行

C
462
字号
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			Chenxibing
** Modified date:		2005-01-12
** Version:
** Descriptions:		GPIO输出实验,控制蜂鸣器鸣叫。
**
********************************************************************************************************/
#include "config.h"
#include <math.h>
#include "t6963c.h"

#define WR (1<<25) //p0.25 写控制位
#define CD (1<<17) //p1.17 数据指令选择控制位
#define RD (1<<26) //p0.26读控制位
#define DIR (1<<22) //p1.22 74LS245数据传送方向
#define LOCK (1<<15)//p0.15 74LS245数据锁存控制位

#define TEST (1<<10) //p0.10  测试输出脚

#define DPT (0xff<<16) //数据口

uint8 wang[32] =
 {
//-- 王 --
 0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,0x00,
 0x01,0x00,0x01,0x00,0x01,0x08,0x3F,0xFC,
 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
 0x01,0x04,0xFF,0xFE,0x00,0x00,0x00,0x00,
 };

uint8 feng[32]= 
{
//-- 峰 --
 0x20,0x80,0x20,0xFC,0x20,0x88,0xA9,0x88,
 0xAA,0x50,0xAC,0x20,0xA8,0xDC,0xAB,0x48,
 0xA8,0x40,0xAB,0xFC,0xB8,0x40,0xEB,0xFC,
 0x80,0x40,0x07,0xFE,0x00,0x40,0x00,0x40,
};




/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时 
** 入口参数 :dly	延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{ 
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<500; i++);
}


void ControlPinIni()
{
	PINSEL0 = 0x00000000;
	PINSEL1 = 0x00000000;
	PINSEL2 = 0x00000000;

	IO0DIR = IO0DIR |WR|RD|LOCK|TEST;
	IO1DIR = IO1DIR |CD|DIR;
	IO0SET = IO0SET |LOCK| TEST;
}






//读状态子函数完整源代码
uint8 ReadState ()
{
	uint8 data;

	IO0DIR = IO0DIR & (~DPT) ;//输入数据

	IO1CLR = IO1CLR | CD;//命令属性
	IO0CLR = IO0CLR | WR;
	IO0CLR = IO0CLR | RD;
 
	IO0SET = IO0SET | RD;//读有效

 
	data = (IO0PIN & DPT) >>16;//由引脚状态寄存器读出数据
	
	IO0CLR = IO0CLR | RD;//读无效
 
	return (data) ;//返回值为读取的数据
}





//等待可读写函数
void ReadEnable()	
{
	uint8 temp;

	while(((temp=ReadState())&0x03)!=0x03);
}


void ReadAuto()	//等待自动读写
	{
	uint8 temp;

	while(((temp=ReadState())&0x04)!=0x04);
	}

void WriteAuto()	//等待自动写
	{
	uint8 temp;

	while(((temp=ReadState())&0x08)!=0x08);
	

	}

void WriteCommand (uint8 command)
{
	uint32 com=0;//定义临时存储单元
	com = command;

	ReadEnable();
	IO0DIR = IO0DIR | DPT;//设置输出数据
	IO1CLR = IO1CLR | CD;//命令属性
	IO0CLR = IO0CLR | WR;
	IO0CLR = IO0CLR | RD;

	// 数据写入口线
	IO0SET = (IO0SET & (~DPT)) | (com<<16) ;
	IO0CLR = (IO0CLR & (~DPT)) | (((~com) &(0x0ff)) <<16) ;

	IO0SET = IO0SET | WR;//写有效
	IO0CLR = IO0CLR | WR;//写入完毕,写置低

}

void WriteData (uint8 data)
{

	ReadEnable();
	IO0DIR = IO0DIR | DPT;//设置输出数据
	IO1SET = IO1SET | CD;//数据属性

	//数据传输方向设定
	IO0SET = (IO0SET & (~DPT)) | (data<<16) ;
	// 数据写入口线
	IO0CLR = (IO0CLR & (~DPT)) | (((~data) &(0x0ff)) <<16) ;
	IO0SET = IO0SET | WR;//写有效
	IO0CLR = IO0CLR | WR;//写入完毕,写置低
}

	
	
	
	
/*写命令、写数据命令*********************
数据1、数据2、命令、参数个数*************
*****************************************/
void wr_data(char data1,char data2,char cmd,char num)
	{
	char temp;
	temp=num;

	if(temp==2)
		{
		ReadEnable();
		IO0DIR = IO0DIR | DPT;//设置数据为输出
		IO1SET = IO1SET | CD;//数据属性
		IO0SET = (IO0SET & (~DPT)) | (data1<<16) ;
		IO0CLR = (IO0CLR & (~DPT)) | (((~data1) & (0x0ff)) <<16) ;// 数据写入口线
		IO0SET = IO0SET | WR;//写有效
		IO0CLR = IO0CLR | WR;//写入完毕,写置高
		}
	 if(temp==2||temp==1)
	 	{
		ReadEnable();
		IO0DIR = IO0DIR | DPT;//设置数据为输出
		IO1SET = IO1SET | CD;//数据属性
		IO0SET = (IO0SET & (~DPT)) | (data2<<16) ;
		IO0CLR = (IO0CLR & (~DPT)) | (((~data2) & (0x0ff)) <<16) ;// 数据写入口线
		IO0SET = IO0SET | WR;//写有效
		IO0CLR = IO0CLR | WR;//写入完毕,写置高
		}
		ReadEnable();
		IO0DIR = IO0DIR | DPT;//设置数据为输出
		IO1CLR = IO1CLR | CD;//命令属性
		IO0SET = (IO0SET & (~DPT)) | (cmd<<16) ;
		IO0CLR = (IO0CLR & (~DPT)) | (((~cmd) & (0x0ff)) <<16) ;// 数据写入口线
		IO0SET = IO0SET | WR;//写有效
		IO0CLR = IO0CLR | WR;//写入完毕,写置高
	
	
	}
	
	
//写8字节数据函数Addr表示数据首地址,Way表示写的方式
void Write_8_Data(unsigned char Addr,unsigned char Way)
{
	WriteAuto();		//判断是否能自动写

	wr_data(0x00,0x00,AUT_WR,0x00);	//自动写开始
	wr_data(0x00,Addr,Way,0x01);
	wr_data(0x00,0x00,AUT_WO,0x00);	//自动写结束
}


//设置数据显示在屏幕上的坐标(以字节为单位)
//x表示显示的行(0~127),y表示显示的列(0~19)
void Set_xy(unsigned char x,unsigned char y)
{
	unsigned int a;
	a=x*20+y;
	wr_data(a&0xff,a>>8,ADR_POS,0x02);
}	

//设置汉字显示在屏幕上的坐标(以16X16汉字为单位)
//x表示显示的行(0~7),y表示显示的列(0~9)
void SetHanZi_xy(unsigned char x,unsigned char y)
{
	unsigned int a;
	a=x*320+y*2;
	wr_data(a&0xff,a>>8,ADR_POS,0x02);
}	


//设置数据存储起始地址
void Set_Addr(unsigned char Addr1,unsigned char Addr2)
{
	wr_data(Addr1,Addr2,ADR_POS,0x02);
}


void DisHanZi(uint8 x,uint8 y,uint8 *Hzcode)
{
	uint8 i;
	Set_xy(x*16,y*2);
	for(i = 0;i<16;i++)
	{
		WriteCommand(AUT_WR);
		WriteData(Hzcode[2*i]);
		WriteData(Hzcode[2*i+1]);
		WriteCommand(AUT_WO);
		
		Set_xy(x*16+i+1,y*2);
	}
	

}

//清屏程序
void Clear_LCD()
{
	unsigned int a;
	Set_xy(0,0);
	WriteCommand(AUT_WR);
	for(a=0;a<2560;a++)
	WriteData(0x00);
	WriteCommand(AUT_WO);
}
//设置点显示在屏幕上的坐标(以位为单位)
//x表示显示的行(0~127),y表示显示的列(0~159),n=1表示打个点,n=0清除一个点
void Point(unsigned char x,unsigned char y,uint8 n)
{
	unsigned char point;
	unsigned int temp;
	temp=x*20+y/8;
	point=0xf7-y%8;
	if(n)point|=0xf8;
	else point&=0xf7;
	wr_data(temp&0xff,temp>>8,0x24,0x02);	//设置写地址
	wr_data(0x00,0x00,point,0x00);
}


//画线子程序,x1/y1/x2/y2,分别表示起点和终点的坐标、draw=1表示画直线为0表示清除直线
void Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,uint8 n)
{
	unsigned char x, y, HalfCount, i; 
	int Feel = 0,DeltaX, DeltaY; 
	char Flag; 
    DeltaX = x2 - x1; 
    DeltaY = y2 - y1; 
    if (abs(DeltaY) < abs(DeltaX))    //abs()为取绝对值函数 
    { 
        if (DeltaX < 0) 
  		{ 
      		i = x1; x1 = x2; x2 = i; 
      		i = y1; y1 = y2; y2 = i; 
   			DeltaX = x2 - x1; 
            DeltaY = y2 - y1; 
  		} 
  		if (DeltaY < 0) Flag = -1; 
  		else Flag = 1; 
  		DeltaY = abs(DeltaY); 
  		HalfCount = DeltaX >> 1; 
  		x = x1; y = y1; 
  		for (i = 0; i <= DeltaX; i++) 
  		{ 
      		Point(x, y, n); //打点 
   			x++; 
      		Feel += DeltaY; 
      		if (Feel > HalfCount) 
   			{ 
             	Feel -= DeltaX; 
    			y += Flag; 
      		} 
  		} 
    } 
    else 
    { 
  		if (DeltaY < 0) 
  		{ 
      		i = x1; x1 = x2; x2 = i; 
      		i = y1; y1 = y2; y2 = i; 
      		DeltaX = x2 - x1; 
      		DeltaY = y2 - y1; 
  		} 
  		if (DeltaX < 0) Flag = -1; 
  		else Flag = 1; 
  		DeltaX = abs(DeltaX); 
  		HalfCount = DeltaY >> 1; 
  		x = x1; y = y1; 
  		for (i = 0; i <=DeltaY; i++) 
  		{ 
      		Point(x, y, n); //打点 
      		y++; 
      		Feel += DeltaX; 
      		if (Feel > HalfCount) 
      		{ 
          		Feel -= DeltaY; 
       			x += Flag; 
      		} 
  		} 
	} 
}



//画圆子程序,其中(x0,y0)表示圆心,R表示半径
//圆方程为(x-x0)^2+(y-y0)^2=R^2
//先打第一象限内的1/4段圆弧(顺时针和反时针各打一次),再依据对称原理打出其他3段圆弧
void Circle(unsigned char x0,unsigned char y0,unsigned char R,uint8 n)
{
	unsigned char i,j=0;
	Point(x0,y0,n);
	for(i=0;i<=R;i++)
   	{
   		while(1)
      	{
      		if(R*R-i*i<=j*j) break;
      		j++;
      	}
		//第一象限打点
      	Point(x0-j,y0+i,n);
	  	Point(x0-i,y0+j,n);
		//第二象限打点
      	Point(x0+j,y0+i,n);
	  	Point(x0+i,y0+j,n);
		//第三象限打点
      	Point(x0+j,y0-i,n);
      	Point(x0+i,y0-j,n);
		//第四象限打点
      	Point(x0-j,y0-i,n);
	  	Point(x0-i,y0-j,n);
	  	j=0;
   	}
}





void lcd_init()
	{

	wr_data(0x00,0x00,0x40,0x02);	//设置文本显示首地址
	wr_data(0x14,0x00,0x41,0x02);	//设置文本显示宽度
	wr_data(0x00,0x00,0x42,0x02);	//设置图形显示首地址
	wr_data(0x14,0x00,0x43,0x02);	//设置图形显示宽度
	wr_data(0x00,0x00,0xa0,0x00);	//光标形状设置
	wr_data(0x00,0x00,0x81,0x00);	//显示方式设置,“或”
	wr_data(0x00,0x00,0x98,0x00);	//显示开关设置
	}
	
void distest(uint8 x,uint8 y)
{
	Set_xy(x,y);
	WriteCommand(AUT_WR);
	WriteData(0xaa);
	WriteCommand(AUT_WO);
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P0.7控制BEEP,让BEEP鸣叫。
** 调试说明 :需将跳线JP5和LED短接。
*********************************************************************************************************
*/
int main (void)
{
char i,j;
    ControlPinIni();

	
	
	lcd_init();

	Circle(1,1,1,1);
	Circle(1,158,1,1);
	Circle(126,1,1,1);
	Circle(126,158,1,1);


 	for(i = 0;i<5;i++)
 	Circle(63,79,3+8*i,1);
 	
 	Line(7,7,120,152,1);
 	Line(7,152,120,7,1);
 	
 	for(i = 0;i<5;i++)
 	Circle(63,79,3+8*i,0);
 	
	Clear_LCD();


	DisHanZi(3,4,wang);
	DisHanZi(3,5,feng);


	while(1);
return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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