`
swordz
  • 浏览: 12907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

LCD Number 解法极致扩展

    博客分类:
  • ruby
阅读更多
LCD Number 具体介绍参见
http://www.iteye.com/topic/178880
原题和一些解法在这里:http://rubyquiz.com/quiz14.html

LCD Numbers感觉是一个比较经典的问题.涉及到编码,数据结构选择.研究了不少解法,希望有个即精炼,又好懂,扩展性又好的办法.一般解法三种类型:模版法(TEMPLATE),开关位,状态机(STATE MACHINE).这其中最好的是状态机法.用3横2竖这样5个笔划来表达一个LCD 字符,表达最精炼,扩展性也很好.
我专门研究了 电话接线器上的LCD屏,除了0-9数字外,还尽可能多的把字母也表示出来.A-F,HLNOPQU- 这些都可以处理,甚至S-5,T-7,1-I有时是相互替代的.
研究了几天,终于把电话接线器上的LCD显示完全实现了.显示的时候为了增加效果,采取一行行输出,最后看到整个LCD 显示.同时尽量做了全面的参数检测处理,如果有输入的字符不在能显示的LCD表中,将他们显示出来反馈给用户.自我感觉尽量做到完美了.
class LCD   

     #ALL LCD DIGIT CAN DIVIDE INTO 3 Horizon and 2 vertical line
     #order :h v h v h, 
     #horizon 2 type:  0:   ;1: - ;
     #vertical 4 type: 0:|  ;1:  |;2:| |;3   
     # change LCD_SYM to hash for flexible
      LCD_SYM = {"0"=>[1,2,0,2,1],
	      "1"=>[0,1,0,1,0],
	      "2"=>[1,1,1,0,1],
	      "3"=>[1,1,1,1,1],
	      "4"=>[0,2,1,1,0],
	      "5"=>[1,0,1,1,1],
	      "6"=>[1,0,1,2,1],
	      "7"=>[1,1,0,1,0],
	      "8"=>[1,2,1,2,1],
	      "9"=>[1,2,1,1,1],
              "A"=>[1,2,1,2,0], #for hex display
	      "B"=>[0,0,1,2,1],
	      "C"=>[1,0,0,0,1],
	      "D"=>[0,1,1,2,1],
	      "E"=>[1,0,1,0,1],
	      "F"=>[1,0,1,0,0],
	      "H"=>[0,2,1,2,0], 
	      "L"=>[0,0,0,0,1],
	      "N"=>[0,3,1,2,0], 	
	      "O"=>[0,3,1,2,1],
	      "P"=>[1,2,1,0,0],
	      "Q"=>[1,2,1,1,0],
	      "U"=>[0,2,0,2,1],
	      "-"=>[0,3,1,3,0]
             }   
  
  def initialize(scale = 1)   
    @draw = [[' '+' '*scale+'  ', # h0 
	     ' '+'-'*scale+'  '], # h1 
             ['|'+' '*scale+'  ', # v0 
              ' '+' '*scale+'| ', # v1
	      '|'+' '*scale+'| ', # v2
              ' '+' '*scale+'  ']] # v3, for 'no-' output  
    @sc = scale   
  end  
  
  def display(num)   
    number = num.to_s   
    0.upto(4) do |i|   
      line = ''  
      number.each_byte {|b| line << @draw[i%2][LCD_SYM[b.chr.upcase][i]] }   #LCD_SYM hash now 
      if i%2==1 # vertical line 
        @sc.times {puts line + "\n";sleep 0.8} # output line by line,not a whole
      else      # horizon line 
        puts  line + "\n"  
	sleep 0.8 #sleep 0.8 sec,enhance line by line effect
      end  
    end  
  end  
end  

def print_usage
  print "\nUsage: #{$0} [-s <size>] <symbols>\n",
        "    -s        scale size (positive integer), default is 2\n",
        "    symbols    symbols to display as lcd\n"
  exit 1
end
  
# ================================================================
# main
# ================================================================

if __FILE__ == $0
# get arguments and error checking on parameters
require 'getoptlong'

  print_usage & exit if ARGV.empty?	
  
  size = 2 # default scale
  opts = GetoptLong.new(
	 [ '--help', '-h', GetoptLong::NO_ARGUMENT ], 
	 [ "--size", "-s", GetoptLong::OPTIONAL_ARGUMENT] )
  opts.each do |opt, arg|
   case opt
     when '--help'
      puts "\nShow this message.\n"
      print_usage
      exit
     when  '--size'
      if arg.to_i.to_s != arg
       puts 'Error: size param is not a number'
       exit
      end
      size = arg.to_i
    end
   end

  print_usage & exit if ARGV.empty?
  
  disp_str = ARGV[0]

  reg =/[^0-9a-fA-FHhLlNno-qO-QUu-]/
 begin

  matches = disp_str.scan(reg)
  if not matches.empty?
     puts "u have input some chars not in LCD SYMBOL:" +matches.join
     puts "\n LCD SYMBOL:[0-9a-fA-FHhLlNno-qO-QUu-]\n"
     exit
  end

  lcd = LCD.new(size)   
  lcd.display(disp_str)  #display line by line,not a whole
 rescue NoMethodError
   puts "input some chars not include in LCD_SYMBOL"
 rescue =>err
   puts err	 
 end
end
分享到:
评论

相关推荐

    QT倒计时源代码lcdNumber应用实例

    QT倒计时源代码lcdNumber应用实例是一种在QT框架下实现倒计时功能的方法,它结合了`lcdNumber`部件,提供了丰富的功能,包括倒计时的重置、暂停以及自定义时间设置。这个实例在许多需要定时提醒或管理时间的应用场景...

    lcdnumber.7z

    标题中的“lcdnumber.7z”表明这是一个与液晶数字显示相关的项目,可能包含源代码、设计文件或资源。描述提到这是基于QT的实现,意味着它使用了QT这一跨平台的应用程序开发框架,来创建一个类似数码管风格的LCD数字...

    基于QT的LCD数字显示

    在本文中,我们将深入探讨如何使用QT框架实现LCD数字显示,这种显示方式类似于常见...在实际开发中,可以根据项目需求对LCDNumber进行进一步的扩展和优化,比如添加更多的控制按钮,或者与其他部件交互,提升用户体验。

    Qt使用lcdNumber显示LED数据时钟

    5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.... 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0....CSDN老板不让我上传联系方式。

    lcd-number.rar_number

    "lcd-number.rar_number" 提供的资源很可能是关于如何在LCD上显示数字的教程或代码库。这里我们将深入探讨LCD显示屏的工作原理、如何在LCD上显示数字以及可能涉及的编程技术。 LCD(Liquid Crystal Display)显示屏...

    Qt 用贴图的方式实现QLcdNumber显示的电子时钟

    QLcdNumber是Qt提供的一种用于显示数字的控件,通常用于模拟LCD显示器的效果。在这个项目中,我们将学习如何自定义QLcdNumber的外观,并利用贴图来展示时间,以创建出个性化且具有视觉吸引力的时钟界面。 首先,让...

    easyUI datagrid rownumber自适应宽度扩展JS

    easyUI datagrid 自动调整行号大小

    Java写的巨型LCD液晶时钟显示屏

    在Java编程领域,创建一个大型LCD液晶时钟显示屏是一项具有挑战性和实用性的任务。 LCD(Liquid Crystal Display)液晶显示屏常用于各种设备上显示时间和信息,因其低功耗、清晰度高等特点而广受欢迎。本项目显然...

    Android自定义numberpicker和原生numberpicker,timepicker

    4. 可以考虑扩展功能,比如添加步长控制、最小值和最大值限制,以及监听数值变化的回调接口。 接下来,我们讨论TimePicker。原生的TimePicker通常用于选择小时和分钟,有两种模式:数字(24小时制或12小时制)和...

    mylcd ok.rar

    LCD_write_number(7,0,0,BT1_time,"sec",10); // LCD_write_number(0,1,1,BT1_T,"C",0); // LCD_write_number(0,0,0,D882_P,"mW",0); LCD_write_new();//把缓存里的数据写入LCD */ // PORTD=0xff; /...

    NumberSequence

    例如,当接近预设的号码范围上限时,可能需要扩展范围;或者在合并公司数据时,可能需要重新规划Number Sequence以保持一致性。 总之,了解并正确使用AX中的Number Sequence对于企业的数据管理和流程效率至关重要。...

    Number of shape does not match the number of table records解决方法

    ### ArcGIS中“Number of shape does not match the number of table records”问题解析及解决方法 #### 问题背景 在使用ArcGIS进行空间数据分析时,可能会遇到一个常见的问题:“Number of shape does not match ...

    bignumber.min.js下载

    bignumber.min.js是一个用于任意精度算术的 JavaScript 库。 众所周知,数字运算的精度问题是一个让人很旦疼的问题,而java中有BigDecimal类对数字精度问题进行处理,经过一番查询,发现前段有一个宝藏精度处理类big...

    test TFT english number dispaly_stm32lcd_

    标题 "test TFT english number dispaly_stm32lcd_" 提示我们这是一项关于在TFT(Thin Film Transistor)液晶显示器上使用STM32微控制器显示英文数字的测试项目。STM32是一款基于ARM Cortex-M内核的微控制器,广泛...

    android NumberPicker修改选中内容的颜色等

    在Android开发中,`NumberPicker` 是一个非常实用的组件,常用于选择数字或进行上下滑动的操作,比如设置日期、时间或者选择序号。在默认情况下,`NumberPicker` 的样式是系统预设的,但有时候为了满足个性化需求...

    前端项目-bignumber.js.zip

    7. **API扩展**:库提供丰富的API,如绝对值、求余数、取整、比较大小等,开发者可以根据需求选择使用。 在实际项目中,`bignumber.js`通常与前端框架(如React、Vue等)或构建工具(Webpack、Rollup等)结合使用,...

    jquery数字跳动插件Animate Number.zip

    它通过jQuery的animate方法扩展了基本的数字动画能力,添加了数属性和阶跃函数,使得动画效果更为生动且富有表现力。 1. **数属性**:这个插件支持设置数字的递增或递减速度、起始和结束值、动画持续时间等参数。...

    自定义Numberpicker

    Numberpicker是Android系统中一个用于显示并选择数字的控件,通常用于滑动选择日期、时间或者数值。在默认情况下,Numberpicker具有特定的颜色、字体样式和显示数量。然而,为了满足不同应用的设计需求,开发者可能...

Global site tag (gtag.js) - Google Analytics