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

📄 main.c

📁 /*** *** *** *** *** *** *** *** *** *** *** *** **/ //**此映射表用来映射LED模块不译码时
💻 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 + -