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 + -
显示快捷键?