搜索
bottom↓
回复: 31

从51移植过来的HD7279(64键盘和8个数码)的测试程序,送给大家

[复制链接]

出0入0汤圆

发表于 2005-3-1 17:19:07 | 显示全部楼层 |阅读模式
今天把HD7279的测试程序移植到M16上,送给大家。

PORTB0-----CS

PORTB1-----CLK

PORTB2-----DATA

PORTB3-----KEY

我有原理图,但是不知道怎么发,如果谁要的话我可以传给他。



源代码如下:

#include <iom16v.h>

#include <macros.h>



//*** 函数定义 ***

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[5];

unsigned char key_number, j, k;

unsigned int tmr;

unsigned long wait_cnter;



//***I/O口初始化***

void port_init(void)

{

PORTA = 0x00;

DDRA  = 0x00;

PORTB = 0x00;

DDRB  = 0x07;

PORTC = 0x00; //m103 output only

DDRC  = 0x00;

PORTD = 0x00;

DDRD  = 0x00;

}



//****** 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



//****** 位定义 ******

#define PORTB0 0  

#define PORTB1 1

#define PORTB2 2

#define PORTB3 3

#define PORTB4 4

#define PORTB5 5

#define PORTB6 6

#define PORTB7 7



//*** 主程序 ***

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 (!(PINB&0x08))                                                // 如果有键按下

                        {

                                key_number=read7279(CMD_READ);                        // 读出键码

                                write7279(DECODE1+1,key_number/16);                // 在第2位显示键码高8位

                                write7279(DECODE1,key_number&0x0f);                // 在第1位显示键码低8位

                                while (!(PINB&0x08));                                                        // 等待按键放开

                                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);

                }

        }

}



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;

        PORTB&=~BIT(PORTB0);

        long_delay();

        for (i=0;i<8;i++)

        {

                if (out_byte&0x80)

                {

                        PORTB|=BIT(PORTB2);

                }

                else

                {

                        PORTB&=~BIT(PORTB2);

                }

                PORTB|=BIT(PORTB1);

                short_delay();

                PORTB&=~BIT(PORTA1);

                short_delay();

                out_byte=out_byte*2;

        }

        PORTB&=~BIT(PORTA2);

}



unsigned char receive_byte(void)

{

        unsigned char i, in_byte;

        PORTB|=BIT(PORTA2);                                // set to input mode

        long_delay();

        for (i=0;i<8;i++)

        {

                PORTB|=BIT(PORTA1);

                short_delay();

                in_byte=in_byte*2;

                if (PINB&0x04)

                {

                        in_byte=in_byte|0x01;

                }

                PORTB&=~BIT(PORTA1);

                short_delay();

        }

        PORTB&=~BIT(PORTA2);

        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++);

}



// ************************* 延时 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--;

  }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2005-3-1 17:27:17 | 显示全部楼层
原理图可以上传啊!要么发一份给我mymach@tom.com谢谢!

出0入0汤圆

 楼主| 发表于 2005-3-1 17:33:20 | 显示全部楼层
mymach 电子小生

给你发了

出0入0汤圆

发表于 2005-3-1 19:17:06 | 显示全部楼层
楼主大哥,我也想要一分原理图~~!   谢谢了!

at89c52@126.com
头像被屏蔽

出0入0汤圆

发表于 2005-3-1 19:36:50 | 显示全部楼层
呵呵,如果是共享的资料,最好能上传上论坛啊。你可以压缩成 zip 或rar 文件上传上来。

出0入0汤圆

发表于 2005-3-1 20:59:04 | 显示全部楼层
能否给我发一份,谢谢!

xusp@zelri.com.cn

出0入0汤圆

 楼主| 发表于 2005-3-1 23:49:31 | 显示全部楼层
我可以传的

但是我不知道怎么传啊

站长能不能告诉一下呢?

我源代码都告诉了我就不差原理图了

我试了好几次

那个FTP都连不上啊
头像被屏蔽

出0入0汤圆

发表于 2005-3-2 00:08:30 | 显示全部楼层
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=401689&bbs_page_no=1&bbs_id=1010



与上传图片是一样的。



另:如果你有数码相机,拍摄一下制作实物,我们就能整理成网站上的应用范例了。谢谢。

出0入0汤圆

 楼主| 发表于 2005-3-2 00:25:36 | 显示全部楼层
收到了

明天传上来了

出0入0汤圆

发表于 2005-6-15 08:37:46 | 显示全部楼层
你有没有通过实际测试啊?我发现不能读出键盘号来。

出0入0汤圆

发表于 2005-6-15 08:47:01 | 显示全部楼层
unsigned char receive_byte(void)

{

   unsigned char i, in_byte;

   PORTB|=BIT(PORTA2);   //应该是PORTB2 吧?         

   long_delay();

   for (i=0;i<8;i++)

   {

      PORTB|=BIT(PORTA1); //同上

      short_delay();

      in_byte=in_byte*2;

      if (PINB&0x04)      //请问:PB2不是设为输出了吗?

      {

         in_byte=in_byte|0x01;

      }

      PORTB&=~BIT(PORTA1); //同上

      short_delay();

   }

   PORTB&=~BIT(PORTA2);    //同上

   return (in_byte);

}

出0入0汤圆

发表于 2005-6-16 12:38:10 | 显示全部楼层
程序读键盘号段是错误的,根本不能读出键盘号来。

出0入0汤圆

 楼主| 发表于 2005-6-16 12:51:10 | 显示全部楼层
这回呢?



//*** 变量及I/O口定义 ***

unsigned char digit[8];

unsigned char j,k;//key_number;

unsigned int tmr;

unsigned long wait_cnter;





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;

        PORTB&=~BIT(PORTB0);

        long_delay();

        for (i=0;i<8;i++)

        {

                if (out_byte&0x80)

                {

                        PORTB|=BIT(PORTB2);

                }

                else

                {

                        PORTB&=~BIT(PORTB2);

                }

                PORTB|=BIT(PORTB1);

                short_delay();

                PORTB&=~BIT(PORTB1);

                short_delay();

                out_byte=out_byte*2;

        }

        PORTB&=~BIT(PORTB2);

}



unsigned char receive_byte(void)

{

        unsigned char i, in_byte;

        PORTB|=BIT(PORTB2);                                // set to input mode

        long_delay();

        for (i=0;i<8;i++)

        {

                PORTB|=BIT(PORTB1);

                short_delay();

                in_byte=in_byte*2;

                DDRB&=~BIT(PORTB2);

                _NOP();

                if ((PINB&(1<<2))==(1<<2))

                {

                        in_byte=in_byte|0x01;

                }

                DDRB|=BIT(PORTB2);

            _NOP();

                PORTB&=~BIT(PORTB1);

                short_delay();

        }

        PORTB&=~BIT(PORTB2);

        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++);

}

出0入0汤圆

发表于 2005-6-21 10:00:05 | 显示全部楼层
你真的测试过了吗?



unsigned char receive_byte(void)

{

   unsigned char i, in_byte;

   PORTB|=BIT(PORTB2);       //  改位 DDRB  = 0x03;   

   long_delay();

   for (i=0;i<8;i++)

   {

      PORTB|=BIT(PORTB1);

      short_delay();

      in_byte=in_byte*2;

      DDRB&=~BIT(PORTB2);

      _NOP();

      if ((PINB&(1<<2))==(1<<2))

      {

         in_byte=in_byte|0x01;

      }

      DDRB|=BIT(PORTB2);

       _NOP();

      PORTB&=~BIT(PORTB1);

      short_delay();

   }

   PORTB&=~BIT(PORTB2);   //  改为DDRB  = 0x07;

   return (in_byte);

}





再测试测试吧!

出0入0汤圆

发表于 2005-10-24 09:42:50 | 显示全部楼层
这个包可用

点击此处下载armok0180888.rar

出0入0汤圆

发表于 2006-10-10 21:00:42 | 显示全部楼层
hfkj01

你这个读键怎么没用啊

读不出来的

出0入0汤圆

发表于 2007-7-10 15:27:10 | 显示全部楼层
en  ,这是读不出键盘的值来哦

出0入0汤圆

发表于 2007-7-10 20:40:35 | 显示全部楼层
发给我一份原理图吧

我也要用  yangyong-210@163.com

出0入0汤圆

发表于 2007-8-13 17:49:28 | 显示全部楼层
有没有谁做出来过啊,读不出键值啊~~~~

出0入0汤圆

发表于 2007-8-13 21:38:48 | 显示全部楼层
我原来也做了一个,不过,是汇编的,今天想找出来,结果没找到!应该是在办公室电脑里了!晕!现在办公室的资料拷不出来了!

出0入0汤圆

发表于 2007-8-23 16:20:04 | 显示全部楼层
谁的HD7279读出键号来了?我的只是0啊!

出0入0汤圆

发表于 2008-4-14 14:27:21 | 显示全部楼层
我需要啊chengfuqiu@163.com谢谢发一个啊

出0入0汤圆

发表于 2008-4-14 20:48:32 | 显示全部楼层
记一下

出0入0汤圆

发表于 2008-4-15 15:04:19 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-12-1 10:17:49 | 显示全部楼层
也给我一份原理图吧   tchellboy@hotmail.com

出0入0汤圆

发表于 2010-7-16 09:46:39 | 显示全部楼层
回复【13楼】mengxi
你真的测试过了吗?
unsigned char receive_byte(void)  
{  
   unsigned char i, in_byte;  
   portb|=bit(portb2);       //  改位 ddrb  = 0x03;   
   long_delay();  
   for (i=0;i&lt;8;i++)  
   {  
      portb|=bit(portb1);  
      short_delay();  
      in_byte=in_byte*2;  
      ddrb&amp;=~bit(portb2);  
      _nop();  
      if ((pinb&amp;(1&lt;&lt;2))==(1&lt;&lt;2))  
      {  
         in_byte=in_byte|0......
-----------------------------------------------------------------------

这个可以用,测试了,谢了啊

出0入0汤圆

发表于 2010-8-30 20:02:54 | 显示全部楼层
回复【26楼】hjk3344547
-----------------------------------------------------------------------

我试验过了,程序是对的。

                  DDRE&=~(1<<1);
                _NOP();          
                if (key_data_read!=0)//#define key_data_read (PINE&(1<<1))
                {
                        in_byte=in_byte|0x01;
                }
                dis_key_clk;//#define dis_key_clk (PORTE&=~(1<<0))
                DDRE|=(1<<1);
                //_NOP();
                short_delay();
我这么写的。define的内容贴在代码里了。

出0入0汤圆

发表于 2010-8-30 20:04:46 | 显示全部楼层
回复【26楼】hjk3344547
-----------------------------------------------------------------------

我用的是PORTE管脚。
这是代码
unsigned char receive_byte(void)
{
        unsigned char i, in_byte;
        en_key_data_write;//???????????
        long_delay();
        for (i=0;i<8;i++)
        {
                en_key_clk;
                short_delay();
                in_byte=in_byte*2;
                DDRE&=~(1<<1);
                _NOP();          
                if (key_data_read!=0)
                {
                        in_byte=in_byte|0x01;
                }
                dis_key_clk;
                DDRE|=(1<<1);
                //_NOP();
                short_delay();
        }
        dis_key_data_write;//???????????
        return (in_byte);
}

出0入0汤圆

发表于 2010-9-5 20:52:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-6 10:46:25 | 显示全部楼层

出0入0汤圆

发表于 2011-7-28 13:08:42 | 显示全部楼层
给我一份 行吗 原理图 zhouaheng8989@sina.com
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 04:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表