发表于:2010/1/18 20:41:59
#0楼
1 系统功能介绍
1.多功能显示器能通过按键二和按键三来调整lcd显示站名,方便乘客能随时知道列车即将到达哪站,给需要下车的乘客作好提示的准备。
2.多功能显示器同时显示温度、时间、几日期,并且通过按键4选择调节时间还是日期。再用按键二和按键三来调整时间和日期(按一下4键调整时间、再按一下4键调整日期、再按一下返回)
3.单片机多功能显示器的功能如下:
l 使用ts1602-lcd显示器来显示。
l 时间显示格式为“时分”、日期为英文的前三个字母加几号(比如“5月31号”,显示为“may[31]” 。
l 由于盛方sf-51学习板中,按键一和ds18b20温度传感器用跳线选择(锁紧插座左边,带有18b20、ant字符的,在18b20一侧的为选通温度传感器 ,在ant则是选通第一个按键)。所以有3个按键来作功能设置,可以设置现在的时间及显示定时设置时间以及站名。
l 盛方sf-51学习板中的4个led发光二极管,分别用于检测ds18b20存在,ds18b20存在且复位后在读数据前还能检测到ds18b20,程序在执行到已经读到温度数据后的标志显示,在调用ts1602显示后还能正常返回的标志。(就是说4个led全亮才能说明ds18b20存在并且正常工作)
l 具体站名用拼音代替,比如下面的程序是从上海到北京的列车显示,上海用shai代替,北京用bjin(即最后一个字母显示全了,前面的都用第一个字母代替)。上海(shai)→无锡(wuxi)→南京(njin)→徐州(xzhou)→济南(jnan)→唐山(tshan)→天津(tjin)→北京(bjin)。
2 系统结构框图
具体接口电路在以下sf-51电路图中有详细的说明,在这里就不在详细叙述
700){this.width=700;} border=0>
图1.2.1、ts11620(和ts1602一样)液晶与单片机的接口电路
700){this.width=700;} border=0>
图1.2.2、检测ds18b20是否正常工作的4个led与单片机的借口电路
700){this.width=700;} border=0>
图1.2.3、所有89s51芯片的各个管脚
700){this.width=700;} border=0>
图1.2.4、显示效果图
3 软件流程图
700){this.width=700;} border=0>
4 程序清单
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e equ 90h
rw equ 91h ;;;; lcd定义
rs equ 92h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
miao equ 70h
fen equ 71h
shi equ 72h ;;;;;;时间单元
fenb equ 60h
shib equ 61h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
yue equ 74h
jihao equ 75h ;;;;;;几月几号
yueb equ 62h
jihaob equ 63h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ms_50 equ 7dh ;定时器产生20*50ms中断;
;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;
ys equ 58h
yd equ 56h
temper_l equ 29h ;用于保存读出温度的低8位
temper_h equ 28h ;用于保存读出温度的高8位
flag1 equ 38h ;是否检测到ds18b20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
b equ 0f0h
org 0000h
ljmp main
org 001bh
ljmp time1
org 0050h
main:
mov 81h,#20h ;sp
mov shi,#12h ;初始化
mov fen,#12h
mov miao,#00h
mov yue,#05
mov jihao,#31h
mov 8dh,#4ch ;t1设初值
mov 8bh,#01h
mov 89h,#10h ;t1选择模式一
mov 0a8h,#88h ;中断允许ie
setb 8eh ;启动t1
mov ms_50,#20
mov yd,#0a8h
mov ys,#01h
main1: lcall main3
lvvv: lcall main0
lzxc: jnb 83h,l4
jnb 81h,liii
jnb 82h,leee
lcall main1
l4: jnb 83h,$
lcall key
liii: jnb 81h,$
mov a,ys
dec a
mov ys,a
mov a,ys
xrl a,#00h
jnz lzxc
mov ys,#01h
ljmp lzxc
leee: jnb 82h,$
mov a,ys
inc a
mov ys,a
mov a,ys
xrl a,#09h
jnz lzxc
mov ys,#01h
lcall lzxc
time1: push 0d0h
push 0e0h
mov 8dh,#4ch
mov 8bh,#01h
mov a,ms_50
cjne a,#20,l06
clr 7ch
sjmp l07
l06: cjne a,#10,l07
setb 7ch
l07: djnz ms_50,ret1
mov ms_50,#20
mov a,miao
add a,#01h ;miao+1
da a
mov miao,a
xrl a,#60h
jnz ret1
mov miao,#00h
mov a,fen
add a,#01h ;fen+1
da a
mov fen,a
xrl a,#60h
jnz ret1
mov fen,#00h
mov a,shi
add a,#01h
da a
mov shi,a
xrl a,#24h
jnz ret1
mov shi,#00h
mov a,jihao
add a,#01
da a
mov jihao,a
xrl a,#32h
jnz ret1
mov jihao,#01h
mov a,yue
add a,#01
mov yue,a
cjne a,#13,ret1
mov yue,#01
ljmp ret1
ret1: pop 0e0h
pop 0d0h
reti
key: clr 8eh
jnb 83h,l6
jnb 81h,l08
jnb 82h,l08
sjmp l11
l6: jnb 83h,$
lcall triqi
delay4: mov r4,#05h ;1ms延迟
d55: mov r5,#250
nop
djnz r5,$
djnz r4,d55
ret
l08:
;;;;;;;;;;;;调时间;;;;;;;;;;;;;;;;显示延时
jb 81h,l09
luu: nop
lasd: jnb 81h,luu
mov a,shi
add a,#01h
da a
mov shi,a
mov shib,shi
mov a,shi
cjne a,#24h,l11
mov shi,#00h
sjmp l11
l09: jb 82h,l11
ltt: nop
jnb 82h,ltt
mov a,fen
add a,#01h
da a
mov fen,a
mov fenb,fen
xrl a,#60h
jnz l11
mov fen,#00h
l11: lcall delay0
mov r7,#80h
lcall lcd_wcmd
mov r7,#43h
lcall lcd_wdat
mov r7,#81h
lcall lcd_wcmd
mov r7,#3eh
lcall lcd_wdat
mov r7,#86h
lcall lcd_wcmd
mov a,fen
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#85h
lcall lcd_wcmd
mov a,fen
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#84h
lcall lcd_wcmd
mov r7,#83h
lcall lcd_wcmd
mov a,shi
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#82h
lcall lcd_wcmd
mov a,shi
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#86h
lcall lcd_wcmd
mov a,fen
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#87h
lcall lcd_wcmd
mov r7,#20h
lcall lcd_wdat
ljmp key
triqi:
jnb 83h,l66
jnb 81h,lf08
jnb 82h,lf08
ljmp l111
l66: jnb 83h,$
setb 8eh
ljmp main0
lf08:
;;;;;;;;;;;;调日期;;;;;;;;;;;;;;;;显示延时
jb 81h,l099
luuu: nop
lasdd: jnb 81h,luuu
mov a,yue
add a,#01
mov yue,a
mov a,yue
cjne a,#13,l111
mov yue,#01
sjmp l111
l099: jb 82h,l111
lttt:nop
jnb 82h,lttt
mov a,jihao
add a,#01h
da a
mov jihao,a
mov a,jihao
xrl a,#32h
jnz l111
mov jihao,#00h
l111: lcall delay0
mov r7,#81h
lcall lcd_wcmd
mov r7,#20h
lcall lcd_wdat
mov r7,#88h
lcall lcd_wcmd
mov r7,#3eh
lcall lcd_wdat
mov r7,#8fh
lcall lcd_wcmd
mov r7,#5dh
lcall lcd_wdat
mov r7,#8eh
lcall lcd_wcmd
mov a,jihao
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8dh
lcall lcd_wcmd
mov a,jihao
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ch
lcall lcd_wcmd
mov r7,#5bh
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#8bh
lcall lcd_wcmd
mov dptr,#tab3
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ah
lcall lcd_wcmd
mov dptr,#tab2
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#89h
lcall lcd_wcmd
mov dptr,#tab1
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
ljmp triqi
;;;;;;;;;;;lcd初始化;;;;;;;;;;;;;;;;;;;;;;;
main0: mov 90h,#00h
clr 92h
mov 81h,#60h
lcall delay5ms
mov r7,#38h ;设置显示模式,设置16x2显示,5x7点阵,8位数据接口
lcall lcd_wcmd
lcall delay5ms
mov r7,#0ch ;设置显示开或关及光标,开显示,不显示光标
lcall lcd_wcmd
lcall delay5ms
mov r7,#06h ;设置显示开或关及光标,地址指针及光标加一
lcall lcd_wcmd
lcall delay5ms
mov r7,#01h ;显示清屏
lcall lcd_wcmd
lcall delay5ms
lcall delay10ms
lcall delay10ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时间显示程序
dis0:
mov r7,#80h
lcall lcd_wcmd
mov r7,#54h
lcall lcd_wdat
mov 90h,#00h
mov r7,#86h
lcall lcd_wcmd
mov a,fen
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#85h
lcall lcd_wcmd
mov a,fen
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#84h
lcall lcd_wcmd
mov c,7ch
jc l41
mov r7,#3ah
lcall lcd_wdat
ljmp lgg
l41: mov r7,#20h
lcall lcd_wdat
lgg: mov r7,#83h
lcall lcd_wcmd
mov a,shi
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#82h
lcall lcd_wcmd
mov a,shi
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;日期显示程序
mov r7,#8fh
lcall lcd_wcmd
mov r7,#5dh
lcall lcd_wdat
mov r7,#8eh
lcall lcd_wcmd
mov a,jihao
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8dh
lcall lcd_wcmd
mov a,jihao
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ch
lcall lcd_wcmd
mov r7,#5bh
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#8bh
lcall lcd_wcmd
mov dptr,#tab3
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ah
lcall lcd_wcmd
mov dptr,#tab2
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#89h
lcall lcd_wcmd
mov dptr,#tab1
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
;;;;;;;;;;;;;;;;te;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0b1h
lcall lcd_wcmd
mov r7,#54h
lcall lcd_wdat
mov r7,#0b2h
lcall lcd_wcmd
mov r7,#65h
lcall lcd_wdat
;;;;;;;;;;;;;→;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0a8h
lcall lcd_wcmd
mov r7,#7eh
lcall lcd_wdat
mov r7,#0a9h
lcall lcd_wcmd
mov r7,#20h
lcall lcd_wdat
;;;;;;;;;;;;*c;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0b6h
lcall lcd_wcmd
mov r7,#0a5h
lcall lcd_wdat
mov r7,#0b7h
lcall lcd_wcmd
mov r7,#63h
lcall lcd_wdat
;;;;;;;;;;;;;;;站名;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lkjh: mov r7,#0aah
lcall lcd_wcmd
mov dptr,#tab01
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0abh
lcall lcd_wcmd
mov dptr,#tab02
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0ach
lcall lcd_wcmd
mov dptr,#tab03
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0adh
lcall lcd_wcmd
mov dptr,#tab04
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0aeh
lcall lcd_wcmd
mov dptr,#tab05
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
;;;;;;;;;;;;;温度显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0b5h ;设置显示位置
lcall lcd_wcmd
mov dptr,#tab ;指定查表启始地址
mov a,a_bit ;取个位数
movc a,@a+dptr ;查个位数的7段代码
mov r7,a;送出个位的7段代码
lcall lcd_wdat
acall d1ms ;显示1ms
mov r7,#0b4h ;设置显示位置
lcall lcd_wcmd
mov a,b_bit ;取十位数
mov dptr,#tab
movc a,@a+dptr ;查十位数的7段代码
mov r7,a ;送出十位的7段代码
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lcall delay8
lcall lzxc
tab01: db 20h,53h,57h,4eh,58h,4ah,54h,54h,42h
tab02: db 20h,48h,75h,4ah,5ah,69h,53h,4ah,4ah
tab03: db 20h,61h,58h,69h,68h,4eh,68h,69h,69h
tab04: db 20h,69h,69h,6eh,6fh,61h,61h,6eh,6eh
tab05: db 20h,20h,20h,20h,75h,6eh,6eh,20h,20h
ljmp lzxc
delay8:
mov r1,#150
delay7:
mov r4,#05h ;1ms延迟
d555: mov r2,#250
nop
djnz r2,$
djnz r4,d555
djnz r1,delay7
ret
delay0: mov r4,#04h ;1ms延迟
dd: mov r5,#123
nop
djnz r5,$
djnz r4,dd
ret
tab: db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
tab1: db 20h,4ah,46h,4dh,41h,4dh,4ah,4ah,41h,53h,4fh,4eh,44h
tab2: db 20h,61h,65h,61h,70h,61h,75h,75h,75h,65h,63h,6fh,65h
tab3: db 20h,6eh,62h,72h,72h,79h,6eh,6ch,67h,74h,74h,76h,63h
lcd_wcmd:
call buzycheck
clr rs
clr rw
clr e
nop
nop
mov 0a0h,r7
nop
nop
nop
nop
setb e
nop
nop
nop
nop
clr e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;写入字符显示数据到lcd
lcd_wdat:
call buzycheck
setb rs
clr rw
clr e
nop
nop
mov 0a0h,r7
nop
nop
nop
nop
setb e
nop
nop
nop
nop
clr e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试lcd忙碌状态
buzycheck:
clr rs
setb rw
setb e
nop
nop
nop
nop
buzycheck1:
nop
jb 0a7h,buzycheck1
clr e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时5ms
delay5ms:
mov r6,#25
delay5ms1:
mov r5,#100
djnz r5,$
djnz r6,delay5ms1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时10ms
delay10ms:
mov r6,#36
delay10ms1:
mov r5,#127
djnz r5,$
djnz r6,delay10ms1
ret
;;;;;;;;;;;;;;;;;温度处理程序;;;;;;;;;;;;;;;;;;;;;;;
main3:
lcall get_temper ;调用读温度子程序
l789: mov 90h,#00h
mov a,29h
mov c,40h ;将28h中的最低位移入c
rrc a
mov c,41h
rrc a
mov c,42h
rrc a
mov c,43h
rrc a
mov 29h,a
lcall display
l456: clr 84h
ljmp lvvv
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;这是ds18b20复位初始化子程序
init_1820:
setb 80h
nop
clr 80h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主机发出延时537微秒的复位低脉冲
mov r1,#3
tsr1: mov r0,#107
djnz r0,$
djnz r1,tsr1
setb 80h ;然后拉高数据线
nop
nop
nop
mov r0,#25h
tsr2:
jnb 80h,tsr3 ;等待ds18b20回应
djnz r0,tsr2
ljmp tsr4 ;延时
tsr3:
setb flag1 ;置标志位,表示ds1820存在
clr 87h ;检查到ds18b20就点亮p1.7led
ljmp tsr5
tsr4:
clr flag1 ;清标志位,表示ds1820不存在
;clr p1.1
ljmp tsr7
tsr5:
mov r0,#117
tsr6:
djnz r0,tsr6 ;时序要求延时一段时间
tsr7:
setb 80h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;读出转换后的温度值
get_temper:
setb 80h
lcall init_1820 ;先复位ds18b20
jb flag1,tss2
;clr p1.2
lcall l789 ;判断ds1820是否存在?若ds18b20不存在则返回
tss2:
clr 86h ;ds18b20已经被检测到!!!!!!!!!!!!!!!!!!
mov a,#0cch ;跳过rom匹配
lcall write_1820
mov a,#44h ;发出温度转换命令
lcall write_1820
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;这里通过调用显示子程序实现延时一段时间,等待ad转换结束,12位的话750微秒
lcall display
lcall init_1820 ;准备读温度前先复位
mov a,#0cch ;跳过rom匹配
lcall write_1820
mov a,#0beh ;发出读温度命令
lcall write_1820
lcall read_18200 ;将读出的温度数据保存到35h/36h
clr 85h ;clr p1.4
lcall l789
;;;;;;;;;;;;;;;;;;;;;;写ds18b20的子程序(有具体的时序要求)
write_1820:
mov r2,#8 ;一共8位数据
clr c
wr1:
clr 80h
mov r3,#6
djnz r3,$
rrc a
mov 80h,c
mov r3,#23
djnz r3,$
setb 80h
nop
djnz r2,wr1
setb 80h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;读ds18b20的程序,从ds18b20中读出两个字节的温度数据
read_18200:
mov r4,#2 ;将温度高位和低位从ds18b20中读出
mov r1,#29h ;低位存入29h(temper_l),高位存入28h(temper_h)
re00:
mov r2,#8 ;数据一共有8位
re01:
clr c
setb 80h
nop
nop
clr 80h
nop
nop
nop
setb 80h
mov r3,#9
re10:
djnz r3,re10
mov c,80h
mov r3,#23
re20:
djnz r3,re20
rrc a
djnz r2,re01
mov @r1,a
dec r1
djnz r4,re00
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示子程序
display: mov a,29h ;将29h中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
ret
d1ms: mov r7,#80
djnz r7,$
ret
end
本文转自
www.sfmcu.com
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=109141&Name=sfmcu
1.多功能显示器能通过按键二和按键三来调整lcd显示站名,方便乘客能随时知道列车即将到达哪站,给需要下车的乘客作好提示的准备。
2.多功能显示器同时显示温度、时间、几日期,并且通过按键4选择调节时间还是日期。再用按键二和按键三来调整时间和日期(按一下4键调整时间、再按一下4键调整日期、再按一下返回)
3.单片机多功能显示器的功能如下:
l 使用ts1602-lcd显示器来显示。
l 时间显示格式为“时分”、日期为英文的前三个字母加几号(比如“5月31号”,显示为“may[31]” 。
l 由于盛方sf-51学习板中,按键一和ds18b20温度传感器用跳线选择(锁紧插座左边,带有18b20、ant字符的,在18b20一侧的为选通温度传感器 ,在ant则是选通第一个按键)。所以有3个按键来作功能设置,可以设置现在的时间及显示定时设置时间以及站名。
l 盛方sf-51学习板中的4个led发光二极管,分别用于检测ds18b20存在,ds18b20存在且复位后在读数据前还能检测到ds18b20,程序在执行到已经读到温度数据后的标志显示,在调用ts1602显示后还能正常返回的标志。(就是说4个led全亮才能说明ds18b20存在并且正常工作)
l 具体站名用拼音代替,比如下面的程序是从上海到北京的列车显示,上海用shai代替,北京用bjin(即最后一个字母显示全了,前面的都用第一个字母代替)。上海(shai)→无锡(wuxi)→南京(njin)→徐州(xzhou)→济南(jnan)→唐山(tshan)→天津(tjin)→北京(bjin)。
2 系统结构框图
具体接口电路在以下sf-51电路图中有详细的说明,在这里就不在详细叙述
700){this.width=700;} border=0>
图1.2.1、ts11620(和ts1602一样)液晶与单片机的接口电路
700){this.width=700;} border=0>
图1.2.2、检测ds18b20是否正常工作的4个led与单片机的借口电路
700){this.width=700;} border=0>
图1.2.3、所有89s51芯片的各个管脚
700){this.width=700;} border=0>
图1.2.4、显示效果图
3 软件流程图
700){this.width=700;} border=0>
4 程序清单
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e equ 90h
rw equ 91h ;;;; lcd定义
rs equ 92h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
miao equ 70h
fen equ 71h
shi equ 72h ;;;;;;时间单元
fenb equ 60h
shib equ 61h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
yue equ 74h
jihao equ 75h ;;;;;;几月几号
yueb equ 62h
jihaob equ 63h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ms_50 equ 7dh ;定时器产生20*50ms中断;
;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;
ys equ 58h
yd equ 56h
temper_l equ 29h ;用于保存读出温度的低8位
temper_h equ 28h ;用于保存读出温度的高8位
flag1 equ 38h ;是否检测到ds18b20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
b equ 0f0h
org 0000h
ljmp main
org 001bh
ljmp time1
org 0050h
main:
mov 81h,#20h ;sp
mov shi,#12h ;初始化
mov fen,#12h
mov miao,#00h
mov yue,#05
mov jihao,#31h
mov 8dh,#4ch ;t1设初值
mov 8bh,#01h
mov 89h,#10h ;t1选择模式一
mov 0a8h,#88h ;中断允许ie
setb 8eh ;启动t1
mov ms_50,#20
mov yd,#0a8h
mov ys,#01h
main1: lcall main3
lvvv: lcall main0
lzxc: jnb 83h,l4
jnb 81h,liii
jnb 82h,leee
lcall main1
l4: jnb 83h,$
lcall key
liii: jnb 81h,$
mov a,ys
dec a
mov ys,a
mov a,ys
xrl a,#00h
jnz lzxc
mov ys,#01h
ljmp lzxc
leee: jnb 82h,$
mov a,ys
inc a
mov ys,a
mov a,ys
xrl a,#09h
jnz lzxc
mov ys,#01h
lcall lzxc
time1: push 0d0h
push 0e0h
mov 8dh,#4ch
mov 8bh,#01h
mov a,ms_50
cjne a,#20,l06
clr 7ch
sjmp l07
l06: cjne a,#10,l07
setb 7ch
l07: djnz ms_50,ret1
mov ms_50,#20
mov a,miao
add a,#01h ;miao+1
da a
mov miao,a
xrl a,#60h
jnz ret1
mov miao,#00h
mov a,fen
add a,#01h ;fen+1
da a
mov fen,a
xrl a,#60h
jnz ret1
mov fen,#00h
mov a,shi
add a,#01h
da a
mov shi,a
xrl a,#24h
jnz ret1
mov shi,#00h
mov a,jihao
add a,#01
da a
mov jihao,a
xrl a,#32h
jnz ret1
mov jihao,#01h
mov a,yue
add a,#01
mov yue,a
cjne a,#13,ret1
mov yue,#01
ljmp ret1
ret1: pop 0e0h
pop 0d0h
reti
key: clr 8eh
jnb 83h,l6
jnb 81h,l08
jnb 82h,l08
sjmp l11
l6: jnb 83h,$
lcall triqi
delay4: mov r4,#05h ;1ms延迟
d55: mov r5,#250
nop
djnz r5,$
djnz r4,d55
ret
l08:
;;;;;;;;;;;;调时间;;;;;;;;;;;;;;;;显示延时
jb 81h,l09
luu: nop
lasd: jnb 81h,luu
mov a,shi
add a,#01h
da a
mov shi,a
mov shib,shi
mov a,shi
cjne a,#24h,l11
mov shi,#00h
sjmp l11
l09: jb 82h,l11
ltt: nop
jnb 82h,ltt
mov a,fen
add a,#01h
da a
mov fen,a
mov fenb,fen
xrl a,#60h
jnz l11
mov fen,#00h
l11: lcall delay0
mov r7,#80h
lcall lcd_wcmd
mov r7,#43h
lcall lcd_wdat
mov r7,#81h
lcall lcd_wcmd
mov r7,#3eh
lcall lcd_wdat
mov r7,#86h
lcall lcd_wcmd
mov a,fen
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#85h
lcall lcd_wcmd
mov a,fen
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#84h
lcall lcd_wcmd
mov r7,#83h
lcall lcd_wcmd
mov a,shi
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#82h
lcall lcd_wcmd
mov a,shi
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#86h
lcall lcd_wcmd
mov a,fen
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#87h
lcall lcd_wcmd
mov r7,#20h
lcall lcd_wdat
ljmp key
triqi:
jnb 83h,l66
jnb 81h,lf08
jnb 82h,lf08
ljmp l111
l66: jnb 83h,$
setb 8eh
ljmp main0
lf08:
;;;;;;;;;;;;调日期;;;;;;;;;;;;;;;;显示延时
jb 81h,l099
luuu: nop
lasdd: jnb 81h,luuu
mov a,yue
add a,#01
mov yue,a
mov a,yue
cjne a,#13,l111
mov yue,#01
sjmp l111
l099: jb 82h,l111
lttt:nop
jnb 82h,lttt
mov a,jihao
add a,#01h
da a
mov jihao,a
mov a,jihao
xrl a,#32h
jnz l111
mov jihao,#00h
l111: lcall delay0
mov r7,#81h
lcall lcd_wcmd
mov r7,#20h
lcall lcd_wdat
mov r7,#88h
lcall lcd_wcmd
mov r7,#3eh
lcall lcd_wdat
mov r7,#8fh
lcall lcd_wcmd
mov r7,#5dh
lcall lcd_wdat
mov r7,#8eh
lcall lcd_wcmd
mov a,jihao
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8dh
lcall lcd_wcmd
mov a,jihao
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ch
lcall lcd_wcmd
mov r7,#5bh
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#8bh
lcall lcd_wcmd
mov dptr,#tab3
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ah
lcall lcd_wcmd
mov dptr,#tab2
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#89h
lcall lcd_wcmd
mov dptr,#tab1
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
ljmp triqi
;;;;;;;;;;;lcd初始化;;;;;;;;;;;;;;;;;;;;;;;
main0: mov 90h,#00h
clr 92h
mov 81h,#60h
lcall delay5ms
mov r7,#38h ;设置显示模式,设置16x2显示,5x7点阵,8位数据接口
lcall lcd_wcmd
lcall delay5ms
mov r7,#0ch ;设置显示开或关及光标,开显示,不显示光标
lcall lcd_wcmd
lcall delay5ms
mov r7,#06h ;设置显示开或关及光标,地址指针及光标加一
lcall lcd_wcmd
lcall delay5ms
mov r7,#01h ;显示清屏
lcall lcd_wcmd
lcall delay5ms
lcall delay10ms
lcall delay10ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时间显示程序
dis0:
mov r7,#80h
lcall lcd_wcmd
mov r7,#54h
lcall lcd_wdat
mov 90h,#00h
mov r7,#86h
lcall lcd_wcmd
mov a,fen
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#85h
lcall lcd_wcmd
mov a,fen
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#84h
lcall lcd_wcmd
mov c,7ch
jc l41
mov r7,#3ah
lcall lcd_wdat
ljmp lgg
l41: mov r7,#20h
lcall lcd_wdat
lgg: mov r7,#83h
lcall lcd_wcmd
mov a,shi
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#82h
lcall lcd_wcmd
mov a,shi
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;日期显示程序
mov r7,#8fh
lcall lcd_wcmd
mov r7,#5dh
lcall lcd_wdat
mov r7,#8eh
lcall lcd_wcmd
mov a,jihao
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8dh
lcall lcd_wcmd
mov a,jihao
swap a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ch
lcall lcd_wcmd
mov r7,#5bh
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#8bh
lcall lcd_wcmd
mov dptr,#tab3
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#8ah
lcall lcd_wcmd
mov dptr,#tab2
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#89h
lcall lcd_wcmd
mov dptr,#tab1
mov a,yue
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
;;;;;;;;;;;;;;;;te;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0b1h
lcall lcd_wcmd
mov r7,#54h
lcall lcd_wdat
mov r7,#0b2h
lcall lcd_wcmd
mov r7,#65h
lcall lcd_wdat
;;;;;;;;;;;;;→;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0a8h
lcall lcd_wcmd
mov r7,#7eh
lcall lcd_wdat
mov r7,#0a9h
lcall lcd_wcmd
mov r7,#20h
lcall lcd_wdat
;;;;;;;;;;;;*c;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0b6h
lcall lcd_wcmd
mov r7,#0a5h
lcall lcd_wdat
mov r7,#0b7h
lcall lcd_wcmd
mov r7,#63h
lcall lcd_wdat
;;;;;;;;;;;;;;;站名;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lkjh: mov r7,#0aah
lcall lcd_wcmd
mov dptr,#tab01
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0abh
lcall lcd_wcmd
mov dptr,#tab02
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0ach
lcall lcd_wcmd
mov dptr,#tab03
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0adh
lcall lcd_wcmd
mov dptr,#tab04
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
mov r7,#0aeh
lcall lcd_wcmd
mov dptr,#tab05
mov a,ys
movc a,@a+dptr
mov r7,a
lcall lcd_wdat
;;;;;;;;;;;;;温度显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r7,#0b5h ;设置显示位置
lcall lcd_wcmd
mov dptr,#tab ;指定查表启始地址
mov a,a_bit ;取个位数
movc a,@a+dptr ;查个位数的7段代码
mov r7,a;送出个位的7段代码
lcall lcd_wdat
acall d1ms ;显示1ms
mov r7,#0b4h ;设置显示位置
lcall lcd_wcmd
mov a,b_bit ;取十位数
mov dptr,#tab
movc a,@a+dptr ;查十位数的7段代码
mov r7,a ;送出十位的7段代码
lcall lcd_wdat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lcall delay8
lcall lzxc
tab01: db 20h,53h,57h,4eh,58h,4ah,54h,54h,42h
tab02: db 20h,48h,75h,4ah,5ah,69h,53h,4ah,4ah
tab03: db 20h,61h,58h,69h,68h,4eh,68h,69h,69h
tab04: db 20h,69h,69h,6eh,6fh,61h,61h,6eh,6eh
tab05: db 20h,20h,20h,20h,75h,6eh,6eh,20h,20h
ljmp lzxc
delay8:
mov r1,#150
delay7:
mov r4,#05h ;1ms延迟
d555: mov r2,#250
nop
djnz r2,$
djnz r4,d555
djnz r1,delay7
ret
delay0: mov r4,#04h ;1ms延迟
dd: mov r5,#123
nop
djnz r5,$
djnz r4,dd
ret
tab: db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
tab1: db 20h,4ah,46h,4dh,41h,4dh,4ah,4ah,41h,53h,4fh,4eh,44h
tab2: db 20h,61h,65h,61h,70h,61h,75h,75h,75h,65h,63h,6fh,65h
tab3: db 20h,6eh,62h,72h,72h,79h,6eh,6ch,67h,74h,74h,76h,63h
lcd_wcmd:
call buzycheck
clr rs
clr rw
clr e
nop
nop
mov 0a0h,r7
nop
nop
nop
nop
setb e
nop
nop
nop
nop
clr e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;写入字符显示数据到lcd
lcd_wdat:
call buzycheck
setb rs
clr rw
clr e
nop
nop
mov 0a0h,r7
nop
nop
nop
nop
setb e
nop
nop
nop
nop
clr e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试lcd忙碌状态
buzycheck:
clr rs
setb rw
setb e
nop
nop
nop
nop
buzycheck1:
nop
jb 0a7h,buzycheck1
clr e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时5ms
delay5ms:
mov r6,#25
delay5ms1:
mov r5,#100
djnz r5,$
djnz r6,delay5ms1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时10ms
delay10ms:
mov r6,#36
delay10ms1:
mov r5,#127
djnz r5,$
djnz r6,delay10ms1
ret
;;;;;;;;;;;;;;;;;温度处理程序;;;;;;;;;;;;;;;;;;;;;;;
main3:
lcall get_temper ;调用读温度子程序
l789: mov 90h,#00h
mov a,29h
mov c,40h ;将28h中的最低位移入c
rrc a
mov c,41h
rrc a
mov c,42h
rrc a
mov c,43h
rrc a
mov 29h,a
lcall display
l456: clr 84h
ljmp lvvv
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;这是ds18b20复位初始化子程序
init_1820:
setb 80h
nop
clr 80h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主机发出延时537微秒的复位低脉冲
mov r1,#3
tsr1: mov r0,#107
djnz r0,$
djnz r1,tsr1
setb 80h ;然后拉高数据线
nop
nop
nop
mov r0,#25h
tsr2:
jnb 80h,tsr3 ;等待ds18b20回应
djnz r0,tsr2
ljmp tsr4 ;延时
tsr3:
setb flag1 ;置标志位,表示ds1820存在
clr 87h ;检查到ds18b20就点亮p1.7led
ljmp tsr5
tsr4:
clr flag1 ;清标志位,表示ds1820不存在
;clr p1.1
ljmp tsr7
tsr5:
mov r0,#117
tsr6:
djnz r0,tsr6 ;时序要求延时一段时间
tsr7:
setb 80h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;读出转换后的温度值
get_temper:
setb 80h
lcall init_1820 ;先复位ds18b20
jb flag1,tss2
;clr p1.2
lcall l789 ;判断ds1820是否存在?若ds18b20不存在则返回
tss2:
clr 86h ;ds18b20已经被检测到!!!!!!!!!!!!!!!!!!
mov a,#0cch ;跳过rom匹配
lcall write_1820
mov a,#44h ;发出温度转换命令
lcall write_1820
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;这里通过调用显示子程序实现延时一段时间,等待ad转换结束,12位的话750微秒
lcall display
lcall init_1820 ;准备读温度前先复位
mov a,#0cch ;跳过rom匹配
lcall write_1820
mov a,#0beh ;发出读温度命令
lcall write_1820
lcall read_18200 ;将读出的温度数据保存到35h/36h
clr 85h ;clr p1.4
lcall l789
;;;;;;;;;;;;;;;;;;;;;;写ds18b20的子程序(有具体的时序要求)
write_1820:
mov r2,#8 ;一共8位数据
clr c
wr1:
clr 80h
mov r3,#6
djnz r3,$
rrc a
mov 80h,c
mov r3,#23
djnz r3,$
setb 80h
nop
djnz r2,wr1
setb 80h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;读ds18b20的程序,从ds18b20中读出两个字节的温度数据
read_18200:
mov r4,#2 ;将温度高位和低位从ds18b20中读出
mov r1,#29h ;低位存入29h(temper_l),高位存入28h(temper_h)
re00:
mov r2,#8 ;数据一共有8位
re01:
clr c
setb 80h
nop
nop
clr 80h
nop
nop
nop
setb 80h
mov r3,#9
re10:
djnz r3,re10
mov c,80h
mov r3,#23
re20:
djnz r3,re20
rrc a
djnz r2,re01
mov @r1,a
dec r1
djnz r4,re00
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示子程序
display: mov a,29h ;将29h中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
ret
d1ms: mov r7,#80
djnz r7,$
ret
end
本文转自
www.sfmcu.com
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=109141&Name=sfmcu