Chinaunix

标题: 问一个可行性的问题 [打印本页]

作者: ivyharry    时间: 2007-04-06 12:34
标题: 问一个可行性的问题
单纯使用bash, 能不能达到这个效果:
用 date +%H%M%S 得到一个6位的时间(hhmmss)
然后使用bash将其转换成LCD显示

比如说 date +%H%M%S 得到

092731

我想让它显示成:

         -    -     -   -     -   
        | |  | |     |   |     |   |
              -     -         -
        | |    |   |     |     |   |
         -    -     -         -


我想了半天
觉得不怎么可能
就算是使用sed 和awk也几乎没什么可能
还是我太笨了??:em12::em12:
作者: doctorjxd    时间: 2007-04-06 12:41
banner命令也许可以满足你的要求。
或许有启发。
  1.   banner -w 50 "`date \"+%H %M %S\"`" | awk 'BEGIN{W=50;for(i=0;i<200;i++)for(ii=0;ii<W;ii++) data[i*W+ii]=" ";}{for(i=1;i<=length($0);i++) data[(NR-1)*W+(i-1)]=substr($0,i,1); } END{for(ii=W;ii>0;ii--){for(i=0;i<NR;i++) printf("%s",data[i*W+ii]);printf("\n");}}'  
复制代码


[ 本帖最后由 doctorjxd 于 2007-4-6 19:12 编辑 ]
作者: nbrr    时间: 2007-04-06 12:45
banner出来的不是LCD显示,还是自己写function换吧
作者: 寂寞烈火    时间: 2007-04-06 12:50
估计挺麻烦的, 没多大意义~
作者: 一梦如是    时间: 2007-04-06 12:55
ANSI控制码,或tput命令。您自己搜and研究下吧
作者: ivyharry    时间: 2007-04-06 20:50
banner 那个确实不怎么可行
研究一下tput看看

实在不行就只有用perl 了
作者: 大蚂蚁    时间: 2007-04-07 04:09
楼主函数写好后别忘了贴上来分享
作者: shitou9000    时间: 2007-04-07 12:14
用个最通俗的while+cut+case+printf就ok了

。。。。。
想错了。。最少你的echo要支持定位。

[ 本帖最后由 shitou9000 于 2007-4-7 12:16 编辑 ]
作者: vkill    时间: 2007-04-07 19:08
把1-9的LCD显示先写到对应文件,再来合并怎么样?这样有临时文件
作者: ivyharry    时间: 2007-04-08 00:12
原帖由 vkill 于 2007-4-7 06:08 发表
把1-9的LCD显示先写到对应文件,再来合并怎么样?这样有临时文件




也这样想过
但是不能做到在一行显示
只能是一列
作者: 大蚂蚁    时间: 2007-04-08 06:32
数组构造阵列,参考下本版shell版俄罗斯方块程序,也许会有收获
作者: woodie    时间: 2007-04-08 17:42
试着写了一个,楼主试一试:
  1. F0=' -
  2. | |
  3.    
  4. | |
  5. - '
  6. F1='   
  7.   |
  8.    
  9.   |
  10.    '
  11. F2=' -
  12.   |
  13. -
  14. |  
  15. - '
  16. F3=' -
  17.   |
  18. -
  19.   |
  20. - '
  21. F4='   
  22. | |
  23. -
  24.   |
  25.    '
  26. F5=' -
  27. |  
  28. -
  29.   |
  30. - '
  31. F6=' -
  32. |  
  33. -
  34. | |
  35. - '
  36. F7=' -
  37.   |
  38.    
  39.   |
  40.    '
  41. F8=' -
  42. | |
  43. -
  44. | |
  45. - '
  46. F9=' -
  47. | |
  48. -
  49.   |
  50. - '


  51. digi ()
  52. {
  53.   eval echo \"\$F$1\"
  54. }

  55. lcd ()
  56. {
  57.   { eval $*|grep -q '[^0-9]';}&&{ echo only digital charachters allowed;return 1;}
  58.   eval paste -d\" \" $($*|sed 's/./ <(digi &)/g')
  59. }

  60. lcd date +%H%M%S
复制代码


测试环境:
GNU bash, version 2.05b.0(1)
作者: woodie    时间: 2007-04-09 09:10
晕!上面的F*的变量中的减号前后的空格有些被莫名其妙地丢掉了,看来论坛的BBCODE代码还是有点问题。请注意F*中每个减号前后都有且只有一个空格。
看来只好上传个附件了。
请将文件扩展名改为.txt后查看,unix格式文本。

[ 本帖最后由 woodie 于 2007-4-9 09:11 编辑 ]

lcd.zip

444 Bytes, 下载次数: 18

测试脚本


作者: iamkey9    时间: 2007-04-09 11:19
说一下我的思路:


8端数码管
-                 [BK][-][BK] [BK]
| |                [|] [BK][|] [BK]
-                 [BK][-][BK] [BK]
| |                [|] [BK][|] [BK]
- .               [BK][-][BK] [.]
  

要横向显示的话,根据行走
1-0 可以表示为

1.1  (1的第一行)          ...         0.1
|
1.5  (1的第五行)          ...         0.5                 

如 12345

取值时候走矩阵
1.1 2.1 3.1 4.1 5.1
1.2 2.2 3.2 4.2 5.2
...
1.5 2.5 3.5 4.5 5.5

应该可以完美显示.

[ 本帖最后由 iamkey9 于 2007-4-9 11:31 编辑 ]
作者: awk就是awp加ak    时间: 2007-04-09 14:29
  1. date +%H%M%S |awk '
  2. function initTable(){

  3.         lcdTable[0,2,1] = 1;
  4.         lcdTable[0,1,2] = 2;
  5.         lcdTable[0,3,2] = 2;
  6.         lcdTable[0,1,4] = 2;
  7.         lcdTable[0,3,4] = 2;
  8.         lcdTable[0,2,5] = 1;

  9.         lcdTable[1,3,2] = 2;
  10.         lcdTable[1,3,4] = 2;

  11.         lcdTable[2,2,1] = 1;
  12.         lcdTable[2,3,2] = 2;
  13.         lcdTable[2,2,3] = 1;
  14.         lcdTable[2,1,4] = 2;
  15.         lcdTable[2,2,5] = 1;

  16.         lcdTable[3,2,1] = 1;
  17.         lcdTable[3,3,2] = 2;
  18.         lcdTable[3,2,3] = 1;
  19.         lcdTable[3,3,4] = 2;
  20.         lcdTable[3,2,5] = 1;

  21.         lcdTable[4,1,2] = 2;
  22.         lcdTable[4,3,2] = 2;
  23.         lcdTable[4,2,3] = 1;
  24.         lcdTable[4,3,4] = 2;

  25.         lcdTable[5,2,1] = 1;
  26.         lcdTable[5,1,2] = 2;
  27.         lcdTable[5,2,3] = 1;
  28.         lcdTable[5,3,4] = 2;
  29.         lcdTable[5,2,5] = 1;

  30.         lcdTable[6,2,1] = 1;
  31.         lcdTable[6,1,2] = 2;
  32.         lcdTable[6,2,3] = 1;
  33.         lcdTable[6,1,4] = 2;
  34.         lcdTable[6,3,4] = 2;
  35.         lcdTable[6,2,5] = 1;

  36.         lcdTable[7,2,1] = 1;
  37.         lcdTable[7,3,2] = 2;
  38.         lcdTable[7,3,4] = 2;

  39.         lcdTable[8,2,1] = 1;
  40.         lcdTable[8,1,2] = 2;
  41.         lcdTable[8,3,2] = 2;
  42.         lcdTable[8,2,3] = 1;
  43.         lcdTable[8,1,4] = 2;
  44.         lcdTable[8,3,4] = 2;
  45.         lcdTable[8,2,5] = 1;

  46.         lcdTable[9,2,1] = 1;
  47.         lcdTable[9,1,2] = 2;
  48.         lcdTable[9,3,2] = 2;
  49.         lcdTable[9,2,3] = 1;
  50.         lcdTable[9,1,4] = 2;
  51.         lcdTable[9,3,4] = 2;
  52.         lcdTable[9,2,5] = 1;
  53. }

  54. function printLCD(pLCD, pCount, i, j){

  55.         for (j = 1; j <= 5; j++){
  56.                 for (i = 1; i <= pCount * 3; i++) printf !pLCD[i,j] ? " " : (pLCD[i,j] == 1 ? "-" : "|");
  57.                 printf "\n";
  58.         }
  59. }

  60. function setLCD(pLCD, pPos, pNumber, i, j){

  61.         for (i = 1; i <= 3; i++) for (j = 1; j <= 5; j++) pLCD[pPos*3 + i,j] = lcdTable[pNumber,i,j];
  62. }

  63. BEGIN {
  64.         initTable();       
  65. }

  66. {
  67.         count = split($0, arr, "");

  68.         for (i = 0; i < count; i++) setLCD(lcd, i, arr[i+1]);

  69.         printLCD(lcd, count);
  70. }'
复制代码

作者: dbcat    时间: 2007-04-09 19:34
搞个矩阵就行了..........上面已经实现了..
作者: awk就是awp加ak    时间: 2007-04-09 20:10
帮主也来凑热闹呀~
作者: ivyharry    时间: 2007-04-10 06:22
....

matrix matrix

确实这样一来简单点了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2