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

📄 7279.txt

📁 7279按键数码管显示程序绝对好用啊
💻 TXT
字号:
void FlashLED(unsigned char No)
{
    char i;
    Send7279Byte(0x88);    //发闪烁指令   
    i=0x1;
    while (No)
    {
        i=i<<1;
        No--;
    }
    Send7279Byte(~i);   //1闪烁
    NOSELECT7279;         //置CS高电平 
}
FlashLED(0);    //第一位闪烁
FlashLED(1);    //第二位闪烁
FlashLED(8);    //关闪烁
我想知道为什么0是第一位闪,1是第二位闪,8是关啊?怎么算的啊?有人指导一下吗?
以下是send7279Byte的程序段
void Send7279Byte(unsigned char ch)
{    
    char i;
    SELECT7279;         //置CS低电平 
    Delay1us(100);        //延时50μ
    
    for (i=0;i<8;i++)
    {    
        if (ch&0x80)    //输出7位到HD7279A的DATA端 
        {
            Set7279DAT;
        }
        else
        {
            Clr7279DAT;
        }
        Set7279CLK;        //置CLK高电平 
        ch=ch<<1;        //待发数据左移 
        Delay1us(20);    //延时8μ
        Clr7279CLK;        //置CLK低电平 
        Delay1us(20);    //延时50μ
    }
    Clr7279DAT;            //发送完毕,DATA端置低,返
} 
是C8051单片机的7279键盘显示上的部分程序,我看不懂这块地方~ 


以下是整个实验的源程序,请大虾参考分析,为小弟解决一下,谢谢
#i nclude "c8051f020.h"                
#i nclude <intrins.h>

sbit    HD7279_DAT=P1^7;
sbit    HD7279_CLK=P1^6;

#define NOSELECT7279      P5 |= 0x80        //SPICS4(P57)=1
#define SELECT7279      P5 &= ~(0x80)      //SPICS4(P57)=0;
#define Set7279DAT      HD7279_DAT=1
#define Clr7279DAT      HD7279_DAT=0
#define Set7279CLK      HD7279_CLK=1
#define Clr7279CLK      HD7279_CLK=0
 
void SYSCLK_Init (void);             //初始化时钟
void Delay1us(unsigned char T);
void Delay1ms(unsigned char T);
void Delay1s(unsigned char T);
void Timer0_Init (void);             //初始化定时器
void PORT_Init (void);               //初始化IO口
void SPI0_Init (void);               //初始化SPI0
void Send7279Byte(unsigned char ch);
void Test7279(bit LoopFlag);


void main (void) 
{
    WDTCN = 0xde;
    WDTCN = 0xad;           //关看门狗
     SYSCLK_Init ();         //初始化时钟
    Timer0_Init();            //初始化定时器
    PORT_Init ();           //初始化IO口
//    SPI0_Init ();           //初始化SPI0
    CPT1CN |= 0x80;            //使能比较器1
    REF0CN = 0x03;          //使能片内参考电压
     EA=1;                    //开中断
    Test7279(1);
}


void SYSCLK_Init (void)  
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 18.432MHz crystal
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up
   //while (!(OSCXCN & 0x80)) ;        // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
//    OSCICN = 0x07;   //interal 16MHZ
}

                           
void PORT_Init (void)                  // 初始化IO口
{   
   XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   //EMI0TC  = 0x21;
   //P74OUT  = 0xFF;                                      
   //P0MDOUT = 0x15;
   //P1MDOUT |= 0x3C;                  
    //P1.2-P1.5推挽输出
   //P1 &= 0xc3;                    
    //P1.2-P1.5=0
}

void SPI0_Init (void)                  //初始化SPI0
{
   SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge
                                       // 8-bit data words
   SPI0CFG|=0xC0;                       //CKPOL =1;

   SPI0CN = 0x03;                      // Master mode; SPI enabled; flags
                                       // cleared
   SPI0CKR = SYSCLK/2/8000000-1;       // SPI clock <= 8MHz (limited by 
                                       // EEPROM spec.)
}

unsigned char Count1ms;
void Timer0_Init (void)                //定时器0初始化,定时1ms
{
       CKCON|=0x8;
       TMOD|=0x1;                           //定时器0方式1,16Bit
    Count1ms=10;
       TR0 = 0;                           // STOP Timer0
       TH0 = (-SYSCLK/1000) >> 8;           // set Timer0 to overflow in 1ms
       TL0 = -SYSCLK/1000;
       TR0 = 1;                              // START Timer0
       IE|= 0x2; 
}

void Timer0_ISR (void) interrupt 1     // 定时器0中断服务程序
{
    TH0 = (-SYSCLK/1000) >> 8;  
       TL0 = -SYSCLK/1000;
    if (Count1ms) Count1ms--;
}



void Send7279Byte(unsigned char ch)
{    
    char i;
    SELECT7279;         //置CS低电平 
    Delay1us(50);        //延时50μ
    
    for (i=0;i<8;i++)
    {    
        if (ch&0x80)    //输出7位到HD7279A的DATA端 
        {
            Set7279DAT;
        }
        else
        {
            Clr7279DAT;
        }
        Set7279CLK;        //置CLK高电平 
        ch=ch<<1;        //待发数据左移 
        Delay1us(8);    //延时8μ
        Clr7279CLK;        //置CLK低电平 
        Delay1us(8);    //延时50μ
    }
    Clr7279DAT;            //发送完毕,DATA端置低,返
}
unsigned char Receive7279Byte(void)
{
    unsigned char i,ch;
    ch=0;        
    Set7279DAT;            //DATA端置为高电平,输入状
     Delay1us(50);        //延时50μ
    for (i=0;i<8;i++)
    {
        Set7279CLK;        //置CLK高电平
        Delay1us(8);    //延时8μ
        ch=ch<<1;        //接收数据左移1位
        if (HD7279_DAT)
            ch+=1;        //接收1位数据
        Clr7279CLK;        //置CLK低电平
        Delay1us(8);    //延时8μ
    }                   
    Clr7279DAT;            //接收完毕,DATA端重新置成
低电平(输出状态)
    return ch;
}
                        
void FlashLED(unsigned char No)
{
    char i;
    Send7279Byte(0x88);    //发闪烁指令 
    i=0x1;
    while (No)
    {
        i=i<<1;
        No--;
    }                                                                    
                                    
    Send7279Byte(~i);   //1闪烁
    NOSELECT7279;         //置CS高电平 
}

/*
void BlankLED(unsigned char ch)
{
    Send7279Byte(0x98);    //发消隐指令 
    Send7279Byte(ch);   //1-显示 0-消隐
    NOSELECT7279;         //置CS高电平 
}
*/

void MoveLeft(void)
{
    Send7279Byte(0xA1);    //发左移指令 
    NOSELECT7279;         //置CS高电平 
}

void MoveRight(void)
{
    Send7279Byte(0xA0);    //发右移指令 
    NOSELECT7279;         //置CS高电平 
}

unsigned char code BdSeg[]={
                    0x7e,0x30,0x6d,0x79, // 0 
1 2 3 
                       0x33,0x5b,0x5f,0x70, // 4 5 6 7
                       0x7f,0x7b,0x77,0x1f, // 8 9 a b
                       0x4e,0x3d,0x4f,0x47, // c d e f
                       0x00,0x01}; 

void DispLED(char *DispBuf,char ShowDot)//ShowDot 显示小数点位 
{
char i,ch;
    ShowDot--;
    for (i=0;i<6;i++)
    {
        ch=DispBuf[i];
        if ((ch>='a') && (ch<='f'))
        {
           ch-='a';ch+=0xa;
        }
        if ((ch>='A') && (ch<='F'))
        {
           ch-='A';ch+=0xa;
        }
        Send7279Byte(0x90+5-i);    //不译码
        if (ch==' ')
            Send7279Byte(0x00); 
        else
            if (ch=='-')
                 Send7279Byte(0x01); 
            else 
            {
                if (ShowDot==i)
                    Send7279Byte(0x80|BdSeg
[ch&0x0f]); 
                else
                    Send7279Byte(BdSeg
[ch&0x0f]); 
            }
    }
    NOSELECT7279;         //置CS高电平 
}

char GetKeyValue(void)
{
    char KeyValue;
    if (CPT1CN&0x40) return -1;    //无键按下 
    Send7279Byte(0x15);         //发读键盘指令 
    KeyValue=Receive7279Byte();
    NOSELECT7279;               //置CS高电平 
    return KeyValue; 
}

void WaitKeyOff(void)
{
    while  (!(CPT1CN&0x40));
}

void Test7279(bit LoopFlag)                                 
{
    char i,KeyValue;         
    Delay1ms(25);            //等待25ms复位时间 
    Send7279Byte(0xA4);      //发复位指令 
    NOSELECT7279;           //置CS高电平 
    if (LoopFlag==0) return;
    DispLED("123456",0);     //显示123456
    for (i=0;i<8;i++)
    {       
        Delay1s(1);
        MoveLeft();
    }

    DispLED("123456",0);     //显示123456
    Delay1s(1);

    DispLED("7890AB",2);     //显示7890ab
    Delay1s(1);

    DispLED("CDEF -",3);     //显示cdef -

    for (i=0;i<6;i++)
    {
        Delay1s(1);
        MoveRight();
    }

    DispLED("F    1",1);     //显示123456

    FlashLED(0);    //第一位闪烁
    Delay1s(10);
    FlashLED(1);    //第二位闪烁
    Delay1s(10);
    FlashLED(8);    //关闪烁

    //BlankLED(0x23); //注意:执行消隐后,键盘输入中断口不能恢复.

    for (;;)
    {    
        KeyValue=GetKeyValue(); 
         if(KeyValue!=-1)
          {
            Send7279Byte(0xC8);    //发送键码值,按方式1译码
下载显示 
            Send7279Byte(KeyValue%16);
            NOSELECT7279;         //置CS高电平 
            WaitKeyOff();
           }
    }
}
 
 

  void Delay1us(unsigned char us)
{
    while (us)
    {
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_();
      --us;
    }
}

void Delay1ms(unsigned char T)
{
    Count1ms=T;
    while (Count1ms);
}

void Delay1s(unsigned char T)
{
    while (T)
    {
        Delay1ms(200);
        Delay1ms(200);
        Delay1ms(200);
        Delay1ms(200);
        Delay1ms(200);
        T--;
    }
}

⌨️ 快捷键说明

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