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

📄 no._c

📁 ICC编译绝对可用M16的HD7279驱动测试程序
💻 _C
字号:
/*------------------------------------------------------------
;------------------------------------------------------------
;		     HD7279 LIB  
;		     V0.1c
; 	  	     zhongwh
;		Copyright 2003-2005 
;   	Email: hfkj01@163.com
;        mtel : 13708004895
;		2005-9-28 15:38:52
;    ICC-AVR application builder
;-------------------------------------------------------------
;-------------------------------------------------------------
;   	Target : M16
;		Crystal: 8Mhz					
;-------------------------------------------------------------
;-------------------------------------------------------------*/
#include <iom16v.h> 
#include <macros.h> 
//HD7279_DATA
#define	 HD7279_DATA_H   PORTB|=BIT(PB0)
#define	 HD7279_DATA_L   PORTB&=~BIT(PB0)
//HD7279_CLK
#define	 HD7279_CLK_H   PORTB|=BIT(PB1)
#define	 HD7279_CLK_L   PORTB&=~BIT(PB1)
//HD7279_CS
#define	 HD7279_CS_H    PORTB|=BIT(PB2)
#define	 HD7279_CS_L    PORTB&=~BIT(PB2)
//DDR
#define  HD7279_DDR_H   DDRB|=BIT(PB0)
#define  HD7279_DDR_L   DDRB&=~BIT(PB0)
//
#define	 HD7279_DATA    PINB
//*** 函数定义 *** 
void long_delay(void);                         // 长延时 
void short_delay(void);                         // 短暂延时 
void write7279(unsigned char, unsigned char);   // 写入到HD7279 
unsigned char read7279(unsigned char);      // 从HD7279读出 
void send_byte(unsigned char);         // 发送一个字节 
unsigned char receive_byte(void);      // 接收一个字节 
void delay_us(int);                                  // 微秒延时 
void dely_ms(unsigned int);                          // 毫秒延时 

//*** 变量及I/O口定义 *** 
unsigned char digit[8]; 
unsigned char j,k,key_number; 
unsigned int tmr; 
unsigned long wait_cnter; 

//***I/O*** 
void port_init(void) 
{ 
 PORTB = 0x00; 
 DDRB  = 0x07; 
 PORTC = 0x00; 
 DDRC  = 0x07; 
  MCUCR = 0x02;
 GICR  = 0x40;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
} 

//****** HD7279A 指令 ****** 
#define CMD_RESET 0xa4 
#define CMD_TEST 0xbf 
#define DECODE0 0x80 
#define DECODE1 0xc8 
#define CMD_READ 0x15 
#define UNDECODE 0x90 
#define RTL_CYCLE 0xa3 
#define RTR_CYCLE 0xa2 
#define RTL_UNCYL 0xa1 
#define RTR_UNCYL 0xa0 
#define ACTCTL 0x98 
#define SEGON 0xe0 
#define SEGOFF 0xc0 
#define BLINKCTL 0x88 


// 
main() 
{    
   port_init(); 
   while (1) 
   { 
      for (tmr=0;tmr<0x2000;tmr++);   // 上电延时 
      send_byte(CMD_RESET);         // 复位HD7279A 

//****************************************** 
//              测试指令演示 
//****************************************** 
      send_byte(CMD_TEST);            // 测试指令 
      for (j=0;j<3;j++)               // 延时约3秒 
      { 
         dely_ms(100); 
      } 
      send_byte(CMD_RESET);            // 清除显示 

//********************************************** 
//        闪烁指令及键盘接口测试 
// 将用户按键的键码显示出来, 如果10秒内无按键 
// 或按S0键即进入下一步演示 
//********************************************** 
      wait_cnter=0; 
      key_number=0xff; 
      write7279(BLINKCTL,0xfc);         // 第1、2两位设为闪烁显示 
      write7279(UNDECODE,0X08);         // 在第1位显示下划线'_' 
      write7279(UNDECODE+1,0x08);         // 在第2位显示下划线'_' 
      do 
      { 
         if (!(PIND&0x04))                  // 如果有键按下 
         { 
            key_number=read7279(CMD_READ);         // 读出键码 
            write7279(DECODE1+1,key_number/16);      // 在第2位显示键码高8位 
            write7279(DECODE1,key_number&0x0f);      // 在第1位显示键码低8位 
            while (!(PIND&0x04));                     // 等待按键放开 
            wait_cnter=0; 
         } 
         wait_cnter++; 
      } while (key_number!=0 && wait_cnter<0x30000);   // 如果按键为‘0’和超时则进入下一步演示 
      write7279(BLINKCTL,0xff);                  // 清除闪烁设置 

//****************************************** 
//            快速计数演示 
//****************************************** 
     for (j=0;j<5;j++)               // 计数初始值为00000 
      { 
         digit[j]=0; 
         write7279(DECODE0+j,digit[j]); 
      } 
      while (digit[4]<2)               // 如果计数达到20000就停止 
      { 
         digit[0]++; 
         if (digit[0]>9) 
         { 
            digit[0]=0; 
            digit[1]++; 
            if (digit[1]>9) 
            { 
               digit[1]=0; 
               digit[2]++; 
               if (digit[2]>9) 
               { 
                  digit[2]=0; 
                  digit[3]++; 
                  if (digit[3]>9) 
                  { 
                     digit[3]=0; 
                     digit[4]++; 
                     if (digit[4]>9) 
                     { 
                        digit[4]=0; 
                     } 
                  } 
               } 
            } 
         } 
         write7279(DECODE0,digit[0]); 
         if (digit[0]==0) 
         { 
            write7279(DECODE0+1,digit[1]); 
            if (digit[1]==0) 
            { 
               write7279(DECODE0+2,digit[2]); 
               if (digit[2]==0) 
               { 
                  write7279(DECODE0+3,digit[3]); 
                  if (digit[3]==0) 
                  { 
                     write7279(DECODE0+4,digit[4]); 
                  } 
               } 
            } 
         } 
      } 
      dely_ms(150); 
      send_byte(CMD_RESET);            // 清除显示 

//************************************************* 
//         下载数据但不译码指令测试 
//************************************************* 
      write7279(UNDECODE+7,0x49);         // 在第8位按不译码方式显示一字符'三' 
      dely_ms(80); 

//************************************************* 
//               循环左/右移测试 
//      "三"字向右运动3次,再向左运动3次 
//************************************************* 
      for (j=0;j<23;j++) 
      { 
         send_byte(RTR_CYCLE);      // 循环右移23次 
         dely_ms(12); 
      } 
      for (j=0;j<23;j++) 
      { 
         send_byte(RTL_CYCLE);      // 循环左移23次 
         dely_ms(12); 
      } 

//********************************************* 
//      译码方式0及左移指令测试 
//********************************************* 
      for (j=0;j<16;j++) 
      { 
         send_byte(RTL_UNCYL);      // 不循环左移指令 
         write7279(DECODE0,j);      // 译码方式0指令,显示在第1位 
         dely_ms(50); 
      } 
      dely_ms(150); 
      send_byte(CMD_RESET); 

//********************************************* 
//      译码方式1及右移指令测试 
//********************************************* 
      for (j=0;j<16;j++) 
      { 
         send_byte(RTR_UNCYL);      // 不循环左移指令 
         write7279(DECODE1+7,j);      // 译码方式0指令,显示在第8位 
         dely_ms(50); 
      } 
      dely_ms(150); 

//********************************************* 
//              消隐指令测试 
//********************************************* 
      k=0xff; 
      for (j=0;j<6;j++) 
      { 
         k=k/2; 
         write7279(ACTCTL,k);      // 每隔一秒钟增加一个消隐位 
         dely_ms(100); 
      } 
      write7279(ACTCTL,0xff);         // 恢复8位显示 
      dely_ms(100); 
      send_byte(CMD_RESET);         // 清除显示 

//********************************************** 
//         段点亮指令和段关闭指令 
//********************************************** 
      for (j=0;j<64;j++) 
      { 
         write7279(SEGON,j);         // 将64个显示段逐个点亮 
         write7279(SEGOFF,j-1);      // 同时将前一个显示段关闭 
         dely_ms(20); 
      } 
   } 
   return 0;
} 

void write7279(unsigned char cmd, unsigned char dta) 
{ 
   send_byte (cmd); 
   send_byte (dta); 
} 

unsigned char read7279(unsigned char command) 
{ 
   send_byte(command); 
   return(receive_byte()); 
} 

void send_byte(   unsigned char out_byte) 
{ 
   unsigned char i; 
   HD7279_CS_L;
   long_delay(); 
   for (i=0;i<8;i++) 
   { 
      if (out_byte&0x80) 
      { 
         HD7279_DATA_H; 
      } 
      else 
      { 
         HD7279_DATA_L; 
      } 
      HD7279_CLK_H; 
      short_delay(); 
      HD7279_CLK_L; 
      short_delay(); 
      out_byte=out_byte*2; 
   } 
   HD7279_DATA_L; 
} 


unsigned char receive_byte(void)  
{  
   unsigned char i, in_byte; 
   HD7279_DDR_L;
   HD7279_DATA_H;   
   long_delay();  
   for (i=0;i<8;i++)  
   {  
      HD7279_CLK_H;  
      short_delay();  
      in_byte=in_byte*2;  

      if (HD7279_DATA&1==1)  
      {  
         in_byte=in_byte|0x01;  
      }  
      HD7279_CLK_L; 
      short_delay();  
   }  
   HD7279_DATA_L;
   HD7279_DDR_H;
   return (in_byte);  
}  



void long_delay(void) 
{ 
   unsigned char i; 
   for (i=0;i<0x30;i++); 
} 

void short_delay(void) 
{ 
   unsigned char i; 
   for (i=0;i<8;i++); 
} 
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{uchar dd;
 dd=receive_byte();
  write7279(DECODE1+1,dd/16);      // 在第2位显示键码高8位 
  write7279(DECODE1,dd&0x0f);      // 在第1位显示键码低8位 
}
// ************************* 延时 n*ms ************************* 

void delay_us(int time)    //微秒级延时 
 { 
 do 
 time--; 
 while(time>1); 
 } 

void dely_ms(unsigned int time) 
 { 
 while(time!=0) 
  { 
  delay_us(1000); 
  time--; 
  } 
 }  

⌨️ 快捷键说明

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