搜索
bottom↓
回复: 9

怎样将AVR不同的io组成一个新的8位数码管的数据段口

[复制链接]

出0入4汤圆

发表于 2013-12-27 15:08:00 | 显示全部楼层 |阅读模式
如题,在做液晶屏或数码管的PCB板的时候,为了元器件布局的方便常常将不同的IO口组合作为液晶屏或数码管的数据口。如果这样做程序应该怎样编写?

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-27 15:39:47 | 显示全部楼层
将各个IO口按顺序重新定义成一个8位数据?

出0入96汤圆

发表于 2013-12-27 15:50:55 | 显示全部楼层
用函数进行二次定义啊,将要显示的内容放到一个数组或变量中,用函数实现IO的真正更新!
例如数码管的8段定义为H FGEDCBA 有2位数码管,行选为COL1 COL2
  1. // h f g e d c b a  
  2. const unsigned char code segtable[16] = {
  3.         0x5f,0x06,0x3b,0x2f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x59,0x3e,0x79,0x71,
  4. };
  5. //

  6. // h f g e d c b a
  7. void show_l0(unsigned char aa)
  8. {
  9. //A
  10.         if(segtable[aa]&0x01)PORTB|=(1<<0);//pb0
  11.         else PORTB&=~(1<<0);
  12.         //B
  13.         if(segtable[aa]&0x02)PORTC|=(1<<0;//pc0
  14.         else PORTC&=~(1<<0);
  15.         //C
  16.         if(segtable[aa]&0x04)PORTD|=(1<<0);//pd0
  17.         else PORTD&=~(1<<0);
  18.         //D
  19.         if(segtable[aa]&0x08)PORTB|=(1<<1)//pb1;
  20.         else PORTB&=~(1<<1);
  21.         //E
  22.         if(segtable[aa]&0x10PORTB|=(1<<2)//pb2;
  23.         else PORTB&=~(1<<2);
  24.         //G
  25.         if(segtable[aa]&0x20)PORTB|=(1<<3)//pb3;
  26.         else PORTB&=~(1<<3);
  27.         //F
  28.         if(segtable[aa]&0x40)PORTB|=(1<<4)//pb4;
  29.         else PORTB&=~(1<<4);
  30.         //H
  31.         if(segtable[aa]&0x80)PORTB|=(1<<5)//pb5;
  32.         else PORTB&=~(1<<5);
  33. }
复制代码

出0入4汤圆

 楼主| 发表于 2013-12-27 15:59:26 | 显示全部楼层
gallle 发表于 2013-12-27 15:50
用函数进行二次定义啊,将要显示的内容放到一个数组或变量中,用函数实现IO的真正更新!
例如数码管的8段定 ...

谢谢,数码管可以用。要是液晶屏并行驱动也可以吗,网上有说用共同体的,不知怎样设置。

出0入162汤圆

发表于 2013-12-27 16:21:37 | 显示全部楼层
本帖最后由 AWEN2000 于 2013-12-27 16:34 编辑

宏定义

然后一个一个赋值

#define D_A   PORTA_PORTA7    //数码管A段对应端口
#define D_B   PORTB_PORTB1    //数码管B段对应端口
#define D_C   PORTC_PORTC6    //数码管C段对应端口
#define D_D   PORTC_PORTC0    //数码管D段对应端口
#define D_E   PORTD_PORTD7    //数码管E段对应端口
#define D_F   PORTB_PORTB0    //数码管F段对应端口
#define D_G   PORTC_PORTC7    //数码管G段对应端口
#define D_P   PORTC_PORTC1    //数码管G段对应端口


if((i&0x01)!=0)
    D_A=0;
  if((i&0x02)!=0)
    D_B=0;
  if((i&0x04)!=0)
    D_C=0;
  if((i&0x08)!=0)
    D_D=0;
  if((i&0x10)!=0)
    D_E=0;
  if((i&0x20)!=0)
    D_F=0;
  if((i&0x40)!=0)
    D_G=0;

出0入96汤圆

发表于 2013-12-27 17:20:18 | 显示全部楼层
shuipaopao 发表于 2013-12-27 15:59
谢谢,数码管可以用。要是液晶屏并行驱动也可以吗,网上有说用共同体的,不知怎样设置。 ...

一样的道理啊,
将上图中的表格查表直接改成变量就OK了
segtable[aa]改成 aa就OK了,

例如并口要输出02,那边用
show_l0(02);就OK

出0入0汤圆

发表于 2013-12-27 17:48:28 | 显示全部楼层
5楼的方法就能实现。

出0入4汤圆

 楼主| 发表于 2013-12-28 08:13:10 | 显示全部楼层
gallle 发表于 2013-12-27 17:20
一样的道理啊,
将上图中的表格查表直接改成变量就OK了
segtable[aa]改成 aa就OK了,

谢谢,明白了

出0入4汤圆

 楼主| 发表于 2013-12-28 08:15:27 | 显示全部楼层
AWEN2000 发表于 2013-12-27 16:21
宏定义

然后一个一个赋值

谢谢,跟3楼一样,异曲同工。

出0入162汤圆

发表于 2013-12-28 10:24:54 | 显示全部楼层

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

本版积分规则

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

GMT+8, 2024-7-23 22:20

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

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