找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4151|回复: 16
收起左侧

如果数码管段选单片机IO口是不规则的,怎么输出呢?

  [复制链接]
ID:410399 发表于 2018-11-9 11:01 | 显示全部楼层 |阅读模式
最近接触IAP15w4K61S4的芯片,做一个数码管相关的实验。芯片的IO口有点散乱,我连好数码管写着程序的时候,发现8位段选IO口是不规则的

P2.5,P2.6,P2.7,P7.4                                                //数码管位控制IO
P0.4,P0.3,P0.2,P0.1,P0.0,P4.6,P4.5,P7.7                //数码管段控制IO


我连的是这样,求教一下这样怎么输出数码管,找了挺久,都是P0直接查表的,求教大神!!!
回复

使用道具 举报

ID:422945 发表于 2018-11-9 12:15 | 显示全部楼层
按位操作呗。如果分着写乱,就做成子函数或者结构体
回复

使用道具 举报

ID:423533 发表于 2018-11-9 13:07 | 显示全部楼层
按位选择输出
回复

使用道具 举报

ID:410399 发表于 2018-11-9 13:41 | 显示全部楼层
jennyli010 发表于 2018-11-9 12:15
按位操作呗。如果分着写乱,就做成子函数或者结构体

嗯嗯,就是有点乱闲麻烦
回复

使用道具 举报

ID:245053 发表于 2018-11-9 13:58 | 显示全部楼层
这个好办,段和位各做一个表,每个表的每一个值对应你想要输出的数据(这个数据要根据你自己的IO情况编制),查表输出就可以了 。
回复

使用道具 举报

ID:245053 发表于 2018-11-9 14:01 | 显示全部楼层
仔细看了一下,你这个IO配置确实有点乱,
回复

使用道具 举报

ID:63705 发表于 2018-11-9 14:01 | 显示全部楼层
同意楼上
回复

使用道具 举报

ID:7485 发表于 2018-11-9 14:15 | 显示全部楼层
这个简单,你按照你的段输出重新重新定位即可。根据你给出的段输出IO,P0.4是小数点,P0.3是“8”字的中间一横,你以此类推。你所谓的P7.7,大概是P4.7吧?

例如显示“1” ,是P4.7和P4.5(不知道你是高电平还是低电平有效)是10100000,16进制就是0A0H(0Xa0)。
回复

使用道具 举报

ID:421028 发表于 2018-11-9 14:29 | 显示全部楼层
在头文件宏定义吧,比如#define  DUAN_1 P0.4   #define DUAN_2  P0.3,这样就有规律了  
回复

使用道具 举报

ID:418333 发表于 2018-11-9 14:33 | 显示全部楼层
刚接触单片机,我也有这个疑问,网上搜索的码表和自己的情况不同,因为大家IO角映射是不一样的,把别人的拿来用不一定适合自己,实际上只要搞懂了原理,针脚是可以乱插的,我自己写了html工具,就可以乱插针脚(自己配置段码和IO针脚映射),然后自动计算码表。但是我还没实际实验,有空的时候实验下。



  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <style type="text/css">
  5.         table.gridtable {
  6.                 font-family: verdana,arial,sans-serif;
  7.                 font-size:11px;
  8.                 color:#333333;
  9.                 border-width: 1px;
  10.                 border-color: #666666;
  11.                 border-collapse: collapse;
  12.         }
  13.         table.gridtable th {
  14.                 border-width: 1px;
  15.                 padding: 8px;
  16.                 border-style: solid;
  17.                 border-color: #666666;
  18.                 background-color: #dedede;
  19.         }
  20.         table.gridtable td {
  21.                 border-width: 1px;
  22.                 padding: 8px;
  23.                 border-style: solid;
  24.                 border-color: #666666;
  25.                 background-color: #ffffff;
  26.         }
  27.         table.gridtable caption {
  28.                 border-width: 1px 1px 0px 1px;
  29.                 padding: 8px;
  30.                 border-style: solid;
  31.                 border-color: #666666;
  32.                 font-weight: bold;
  33.                 background-color: #dedede;
  34.         }
  35. pre {
  36.   background:#f5f5f5;
  37.   color:#333;
  38.   padding:10px;
  39.   border: 1px solid #ccc;
  40.   font-size: 13px;
  41.   line-height: 1.4;
  42.   font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
  43.   border-radius: 4px;
  44.   overflow: auto;
  45. }
  46. </style>
  47. <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
  48. </head>
  49. <body>
  50. <table class="gridtable" name="pin">
  51.         <caption>数码管配置</caption>
  52.         <tr>
  53.                 <th>段码</th><th>段脚</th><th>IO脚</th>
  54.         </tr>
  55.         <tr>
  56.                 <td>a</td> <td>1</td>
  57.                 <td><select value="0" name="a"></select></td>
  58.         </tr>                                          
  59.         <tr>                                          
  60.                 <td>b</td> <td>2</td> <td><select value="1" name="b"></select></td>
  61.         </tr>                                          
  62.         <tr>                                          
  63.                 <td>c</td> <td>4</td> <td><select value="2" name="c"></select></td>
  64.         </tr>                                          
  65.         <tr>                                          
  66.                 <td>d</td> <td>5</td> <td><select value="3" name="d"></select></td>
  67.         </tr>                                          
  68.         <tr>                                          
  69.                 <td>e</td> <td>6</td> <td><select value="4" name="e"></select></td>
  70.         </tr>                                          
  71.         <tr>                                          
  72.                 <td>f</td> <td>7</td> <td><select value="5" name="f"></select></td>
  73.         </tr>                                          
  74.         <tr>                                          
  75.                 <td>g</td> <td>9</td> <td><select value="6" name="g"></select></td>
  76.         </tr>                                          
  77.         <tr>                                          
  78.                 <td>p</td><td>10</td><td><select value="7" name="p"></select></td>
  79.         </tr>
  80. </table>
  81. <br/>
  82. 字符与段码映射表:<input type="button" value="计算" id="calc"></input><br/><br/>
  83. <textarea style="height:100px;" id="code_map">
  84. 0:abcdef
  85. 1:bc
  86. 2:abged
  87. 3:abgcd
  88. 4:fgcb
  89. 5:afgcd
  90. 6:afeddcg
  91. 7:abc
  92. 8:abcdefg
  93. 9:gfabcd
  94. A:efabcg
  95. b:fedcg
  96. C:afed
  97. D:gcde
  98. E:afedg
  99. F:afeg
  100. </textarea>
  101. <pre id="code">

  102. </pre>
  103. <script>
  104. var template = "{7}{6}{5}{4}{3}{2}{1}{0}";

  105. var option = "";
  106. for(var i=0;i<8;i++){
  107.         option += '<option value="'+i+'">'+i+'</option>';
  108. }
  109. $("table[name=pin] select").each(function(idx, ele){
  110.         $(ele).html(option);
  111.         $(ele).val(idx);
  112. });

  113. function parse(){
  114.         var code_map_list = $("#code_map").val().split("\n");
  115.         var pin_map = {};
  116.         $("table[name=pin] select[name]").each(function(){
  117.                 var _this = $(this);
  118.                 pin_map[_this.attr('name')] = _this.val();
  119.         });
  120.         var table_positive = [];
  121.         var table_negative = [];
  122.         var char_positive = [];
  123.         var char_negative = [];
  124.         $.each(code_map_list,function(idx,code_map){
  125.                 code_map = $.trim(code_map);
  126.                 var split_idx = code_map.indexOf(":");
  127.                 if(code_map == "" || split_idx == -1){return;}
  128.                 var _c = code_map.split(":");
  129.                 var _char = _c[0];
  130.                 var _map_list = _c[1].split("");
  131.                 var bin_positive = template;//共阳极,低电平有效
  132.                 var bin_negative = template;//共阴极,高电平有效
  133.                 $.each(_map_list,function(_idx, _map){
  134.                         var pin = pin_map[_map];
  135.                         if(pin == undefined){alert("错误的段码:"+_map);throw "错误的段码:"+_map;}
  136.                         bin_positive = bin_positive.replace("{"+pin+"}",0);
  137.                         bin_negative = bin_negative.replace("{"+pin+"}",1);
  138.                 });
  139.                 bin_positive = bin_positive.replace(/\{\d\}/g,1);
  140.                 bin_negative = bin_negative.replace(/\{\d\}/g,0);
  141.                 var _p = parseInt(bin_positive,2).toString(16);
  142.                 var _n = parseInt(bin_negative,2).toString(16);
  143.                 table_positive.push(_p);
  144.                 table_negative.push(_n);
  145.                 char_positive.push({c:_char,hex:_p});
  146.                 char_negative.push({c:_char,hex:_n});
  147.         });
  148.        
  149.         var text = "//共阳码表\nchar code table_positive[] = {";
  150.         $.each(table_positive,function(idx,hex){
  151.                 text += idx == 0 ? "0x" + hex : ", 0x" + hex;
  152.         });
  153.         text += "};\n";
  154.        
  155.         text += "//共阴码表\nchar code table_negative[] = {";
  156.         $.each(table_negative,function(idx,hex){
  157.                 text += idx == 0 ? "0x" + hex : ", 0x" + hex;
  158.         });
  159.         text += "};\n\n";
  160.        
  161.         $.each(char_positive,function(idx,char_map){
  162.                 text += "char code positive_"+char_map['c'] + " = 0x" + char_map['hex'] + ";\n";
  163.         });
  164.         text += "\n";
  165.        
  166.         $.each(char_negative,function(idx,char_map){
  167.                 text += "char code negative_"+char_map['c'] + " = 0x" + char_map['hex'] + ";\n";
  168.         });
  169.        
  170.         console.info(text);
  171.         $("pre#code").text(text);
  172. }

  173. parse();

  174. $("#calc").click(parse);
  175. </script>
  176. </body>
  177. </html>
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:410399 发表于 2018-11-9 14:39 | 显示全部楼层
pcf2000 发表于 2018-11-9 14:01
仔细看了一下,你这个IO配置确实有点乱,

嘿嘿嘿,配置的难受现在,不过先做着

  1.         j = LedOut[3];               
  2.         for(i = 0; i < 8; i++)               
  3.         {
  4.                 k[i] = j & 0x01;               
  5.                 j = j >> 1;                               
  6.         }
  7.         duanxuan(k[8]);                               
  8.        
  9.         j = LedOut[2];               
  10.         for(i = 0; i < 8; i++)
  11.         {
  12.                 k[i] = j & 0x01;
  13.                 j = j >> 1;
  14.         }
  15.         duanxuan(k[8]);

  16.        
  17. }
  18. void duanxuan(uchar code k[8])               
  19. {
  20.         sd1 = k[0];
  21.         sd2 = k[1];
  22.         sd3 = k[2];
  23.         sd4 = k[3];
  24.         sd5 = k[4];
  25.         sd6 = k[5];
  26.         sd7 = k[6];
  27.         sd8 = k[7];       
  28. }
复制代码


现在写成这样,sd对应段选IO,这样做可以不,再做2个表会不会麻烦一点的
回复

使用道具 举报

ID:409939 发表于 2018-11-9 15:21 | 显示全部楼层
建个位域结构,把端口号填进去。应该能直接可以干死的。简单。
回复

使用道具 举报

ID:378199 发表于 2018-11-9 15:22 | 显示全部楼层
按位操作输出
回复

使用道具 举报

ID:213173 发表于 2018-11-9 15:57 | 显示全部楼层
//定义数码管段控制IO口和数码管段码数组
sbit code0=P0^4;                                       
sbit code1=P0^3;
sbit code2=P0^2;
sbit code3=P0^1;
sbit code4=P0^0;
sbit code5=P4^6;
sbit code6=P4^5;
sbit code7=P7^7;       
uchar  code table[]={//0~F
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
//写一个8位数据函数
void PX(uchar i)
{   
    code0=i&0x01;i>>=1;       
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;i>>=1;
    code5=i&0x01;i>>=1;
    code6=i&0x01;i>>=1;
    code7=i&0x01;
}
//调用时PX(table[X]);就是对控制IO口赋值

评分

参与人数 1黑币 +30 收起 理由
uaas + 30 赞一个!

查看全部评分

回复

使用道具 举报

ID:275671 发表于 2018-11-9 16:02 | 显示全部楼层

P77=ACC7
P45=ACC6
P46=ACC5
P00=ACC4
P01=ACC3
P02=ACC2
P03=ACC1
P04=ACC0
回复

使用道具 举报

ID:410399 发表于 2018-11-9 16:31 | 显示全部楼层
我上一条回复是被吃了吗,2个小时了
回复

使用道具 举报

ID:123289 发表于 2018-11-10 17:08 | 显示全部楼层
本来就不需要规则!
否则PCB排版难度加大。通常是任意排放!
而你自己必须明白,再输入显示时,要做一个就换程序,将规则的字库等变换成符合LED排列阵列,而后再送显。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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