论坛风格切换切换到宽版
  • 4757阅读
  • 15回复

请教个1602显示信号条的问题 [复制链接]

上一主题 下一主题
离线永远的FM
 
发帖
12110
只看楼主 倒序阅读 0楼 发表于: 2008-11-28
现在设计用1602配合单片机ad转换功能,用一个长度变化的黑条显示被测电压。我的程序设计思想是这样的:

取得ad 转换值(为a);

判断:当a在1~10之间时,显示一格;
a在11~20行之间,显示2格;
。。。。。。
在240~255之间,显示15格。
然后返回。
这个“格”是一个自定义字符(其实就是一个竖条),一个5x8位置能显示3个这样的格。

而且单片机平常空闲时要做的就是
键盘扫描和ad检测并显示。

请问我这样编程对吗?
判断时用if语句还是case语句好?我不想显示过程占用太多时间,不然会拖慢键盘扫描速度的。
或者大家集思广益教给我更好的方法。
离线BG4UVR
发帖
11287
只看该作者 1楼 发表于: 2008-11-28
建立一个10ms的定时器中断。

如果你想显示每秒刷新10次,那么设立一个变量,每中断一次加1,当变量为10时,清变量,设立一个标志。

主程序中,发现标志置位,就去做一次ad转换和显示。

另外,这个中断中还可以扫描键盘。

这个方法同样适合于更多个任务的复杂应用。
离线永远的FM
发帖
12110
只看该作者 2楼 发表于: 2008-11-28
'
建立一个10ms的定时器中断。
如果你想显示每秒刷新10次,那么设立一个变量,每中断一次加1,当变量为10时,清变量,设立一个标志。
主程序中,发现标志置位,就去做一次ad转换和显示。
另外,这个中断中还可以扫描键盘。
这个方法同样适合于更多个任务的复杂应用。
'

谢谢指导!!!
其实我现在迫切想知道的是,如何显示那个信号条?
就是说,对应一个变量0~255,怎样把它转换成一个长度变化的条条。
离线小比尔/5
发帖
2582
只看该作者 3楼 发表于: 2008-11-28
用除法,然后做循环就可以了
除法不慢的,一个djnz循环比subb,jc要快得多
离线永远的FM
发帖
12110
只看该作者 4楼 发表于: 2008-11-28
老大,讲的太简单了吧。。。。。
怎么除?得到的结果怎么用?那个信号条要怎样定义呢?我知道是要用自定义字符,显示方法是某段电压值对应一个长度的条条吗?(就是说如果要显示16个不同长度,我就要定义16个长度的表格)
离线BG4XCR
发帖
33381
只看该作者 5楼 发表于: 2008-11-28
你要自己定义字符就要自己写ram了。。
离线永远的FM
发帖
12110
只看该作者 6楼 发表于: 2008-11-28
!!!xcr所言极是。
一个1602最多可以定义7个自定义字符。其实定义3个就够了(一竖,两竖,三竖)。我想知道怎么把这三种竖线组合成信号条图形。
离线BG4XCR
发帖
33381
只看该作者 7楼 发表于: 2008-11-28
[quote=永远的fm]!!!xcr所言极是。
一个1602最多可以定义7个自定义字符。其实定义3个就够了(一竖,两竖,三竖)。我想知道怎么把这三种竖线组合成信号条图形。[/quote]
看看1602的文档。写ram就行了,自己做字模。。
离线BG4XCR
发帖
33381
只看该作者 8楼 发表于: 2008-11-29
。。。。。
离线BG4UVR
发帖
11287
只看该作者 9楼 发表于: 2008-11-29
[quote=永远的fm]!!!xcr所言极是。
一个1602最多可以定义7个自定义字符。其实定义3个就够了(一竖,两竖,三竖)。我想知道怎么把这三种竖线组合成信号条图形。[/quote]

每个格有4种状态,即:无、1竖、2竖、3竖

所以16个格共有4×16=64种状态,256/64=4 (每种状态表示的ad值单位数量)

你ad转换出来的结果只要除以4,就是状态值。不过应该不用查表,可以这样:

ad/=4;   //(ad转换的结果先转换成状态值)
x=ad/4; //要显示的“3竖”的个数(x)
y=ad%4; //最后一个要显示的字符(即空格或自定义字符1、2、3)(y=a/b/c/d)

最后的结果是:

1、先显示x个3竖字符(自定义的)
2、再显示一个y字符(也是自定义的,具体是哪一个,有上面的计算结果得出)
3、最后,记住在后面显示(16-x-1)个空格,以清除本行上一次可能显示出来的内容
离线小比尔/5
发帖
2582
只看该作者 10楼 发表于: 2008-11-29
呃,我只是提一下,因为以前做过。
方便的话,一竖、两竖、三竖可以定义为第1号、第2号、第3号字符
然后div ab后,可以得到一个主值和余数值
主值用来循环,显示“255”黑块的个数
然后判断余值是否为零,在黑块后面显示一个自定义字符。

我以前做过信号条,用了四个自定义字符:
▁ ,▁ ▄,▆ ,▆ █,然后用if和门限值判断,其实也不慢

¥x
¥▁
¥▁ ▄
¥▁ ▄ ▆
¥▁ ▄ ▆ █
离线bg5cvc
发帖
1106
只看该作者 11楼 发表于: 2008-11-29
技术帖
离线bg5cvc
发帖
1106
只看该作者 12楼 发表于: 2008-11-29
'
建立一个10ms的定时器中断。
如果你想显示每秒刷新10次,那么设立一个变量,每中断一次加1,当变量为10时,清变量,设立一个标志。
主程序中,发现标志置位,就去做一次ad转换和显示。
另外,这个中断中还可以扫描键盘。
这个方法同样适合于更多个任务的复杂应用。
'
我特欣赏这段 !!!  
离线BG2WAH
发帖
608
只看该作者 13楼 发表于: 2008-11-30
你可以到这里看看,但愿能对你有所帮助。
http://wcrsa.zhan.cn.yahoo.com/
离线BG4RFF
发帖
1581
只看该作者 14楼 发表于: 2008-12-01
'
每个格有4种状态,即:无、1竖、2竖、3竖
所以16个格共有4×16=64种状态,256/64=4 (每种状态表示的ad值单位数量)
你ad转换出来的结果只要除以4,就是状态值。不过应该不用查表,可以这样:
ad/=4;   //(ad转换的结果先转换成状态值)
x=ad/4; //要显示的“3竖”的个数(x)
y=ad%4; //最后一个要显示的字符(即空格或自定义字符1、2、3)(y=a/b/c/d)
最后的结果是:
1、先显示x个3竖字符(自定义的)
2、再显示一个y字符(也是自定义的,具体是哪一个,有上面的计算结果得出)
3、最后,记住在后面显示(16-x-1)个空格,以清除本行上一次可能显示出来的内容
'
我觉得是该模3
离线小比尔/5
发帖
2582
只看该作者 15楼 发表于: 2008-12-01
应该是与3

模4 = 与3
但是在keil里,写除、模4它也会自动优化成移和与的.