📄 main.c
字号:
//****************************************************************************************
//** 文件名:main.c
//** Copyright (c) 2003
//** 创建人:Himai (WYJ)
//** 日期:2003.10.26
//** 描述:此程序用于演示LED模块
//**
//** 版本:1.0
//**************************************************************************************
#include "def.h"
#include "44b.h"
#define BOARD_TYPE (*(volatile INT8U *)0xa040038)
//**7289的片选信号写入地址为0x0a0c0010
//**定义7289的片选信号使能为数据d0为0
#define cs_disable {(*(volatile unsigned char *)0x0a0c0020)=0xff;}
//**定义7289的片选信号使能为数据d0为1
#define cs_enable {(*(volatile unsigned char *)0x0a0c0020)=0xf7;}
//**定义7289的串行数据线用F口bit5仿真,操作时注意保存F口其它位的设置和数值
#define setdata_1 {rPDATF=(0x020|DATASHADOW);DATASHADOW=rPDATF;} //output logic true on data line
#define setdata_0 {rPDATF=(0x1df&DATASHADOW);DATASHADOW=rPDATF;} //output logic false on data line
//**定义7289的通信时钟信号用F口的bit8仿真,操作时注意保存其它位的设置和数值
#define setclock_1 {rPDATF=(0x100|DATASHADOW);DATASHADOW=rPDATF;} //clock turn high
#define setclock_0 {rPDATF=(0x0ff&DATASHADOW);DATASHADOW=rPDATF;} //clock turn low
//**定义一个变量保护F口的数据
int DATASHADOW;
//**此映射表用来映射LED模块不译码时,显示的字符和必须输入的数据的关系
//**每段和对应比特位的关系见示意图
// g
// --- ---
// b | a |f | | <---显示0时点亮的段为gfedcb
// ---
// c | |e | | 那么写入数据为0x7e
// --- ---
// d
// bit: 7 6 5 4 3 2 1 0
// 段位: g f e d c b a
char mapda[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
//****************************************************************************************
//**函数名:mydelay()
//**参 数:i,j
//**返回值:无
//**功 能:实现延迟等待
//**备 注:
//**************************************************************************************
volatile void mydelay(unsigned int i,unsigned int j)
{
int m,n;
for (m=0;m<=i;m++)
{
for (n=0;n<j;n++);
}
}
//****************************************************************************************
//**函数名:ledinit()
//**参 数:无
//**返回值:无
//**功 能:实现F口以及led模块的初始化
//**备 注:
//**************************************************************************************
void ledinit(void){
//**将F口的bit5和bit8设置为输出工作方式,同时设定无需上拉电阻
rPCONF=0x92555;
rPUPF =0x1ff;
DATASHADOW=0x01ff;
//**使片选失效,设定数据和时钟线均为高,初始化led
cs_disable;
setdata_1;
setclock_1;
//**等待
mydelay(10,1000);
}
//****************************************************************************************
//**函数名:sendledcmd()
//**参 数:7289命令字,参考7289资料
//**返回值:无
//**功 能:传送单字节命令到7289
//**备 注:
//**************************************************************************************
void sendledcmd(char context)
{
int count;
//**将时钟和数据线均设为低,
setclock_0;
mydelay(20,10);
setdata_0;
//**使能片选
mydelay(20,10);
cs_enable;
mydelay(35,10);
//**传送8比特,由高位到低位
for (count=0x80;count>0;count>>=1)
{
//**如果此位为1,则数据线送1否则送0
if(context &count)
{
setdata_1;
}
else
{
setdata_0;
}
mydelay(3,10);
//**时钟翻转为高,等待7289取数据
setclock_1;
mydelay(3,10);
//**时钟翻转为低,7289取数据结束
setclock_0;
mydelay(4,10);
}
//**一个字节传送完毕,片选失效
cs_disable;
mydelay(4,10);
}
//****************************************************************************************
//**函数名:sendleddata()
//**参 数:7289命令字,参考7289资料
//**返回值:无
//**功 能:传送单字节命令到7289
//**备 注:
//**************************************************************************************
void sendleddata(char i,char context)
{
char a[2];
int count,k;
setclock_0; //clock low
mydelay(3,100);
setdata_0; //data low
a[0]=0x90+i; //set the display location
a[1]=context;//set the digit mapdata as the byte follow the command byte
mydelay(3,10);
cs_enable;
mydelay(3,10);
for (k=0;k<2;k++){
for (count=0x80;count>0;count>>=1)
{ //send a byte
if(a[k] &count)
{
setdata_1;
}
else
{
setdata_0;
}
mydelay(3,10);
setclock_1; //set clock high
mydelay(3,10); //it is time for 7289 to receive command or data.
setclock_0; //set clock low
mydelay(4,10);
}
mydelay(3,10);
}
//disable the chip select
cs_disable ;
mydelay(3,10);
}
//****************************************************************************************
//**函数名:main()
//**参 数:无
//**返回值:无
//**功 能:演示7289控制的led模块
//**备 注:
//**************************************************************************************
void Main(void)
{
int i,lednum=4;
INT8U boardtype;
//**初始化端口和7289
boardtype=BOARD_TYPE;//读入板类型号,d7位为1时,识别键盘为4×4,led4位,否则键盘为4×5,led8位
if((boardtype&0x80)!=0) lednum=4;
else lednum=8;
ledinit();
//**发送命令字,清除所有显示
sendledcmd(0xa4);
mydelay(10,1000);
i=0;
//**发送测试命令字,使所有段和点闪烁
sendledcmd(0xbf);
mydelay(10,1000);
sendledcmd(0xa4);
for(;;)
{
sendleddata(i%lednum,mapda[i%10]);
mydelay(1000,1000);
i++;
if(i==40) i=0;
//sendledcmd(0xa4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -