51单片机对602LCD显示器的驱动设计

;硬件连接:1602lcd显示000000hz短接p1.4--p3.5则显示0000010hz
;lcd1602显示在不增加外部计数硬件的情况下,本试验软件可测最高频率达到460khz
;工作原理:
;1s 钟内对输入脉冲所计数的次数则为频率值。
;16位二进制加法计数器的最大计数值为 65535。
;设置定时器 0 工作在定时方式1,定时1s。
;设置定时器 1 工作在计数方式1,对输入脉冲进行计数,溢出产生中断。
;将定时器 1中断定义为优先。在中断处理程序里对中断次数进行计数。1s到后,
;将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送lcd1602显示?
;信号来源:
;1、软件里对 p1.4定时取反,形成输出脉冲,接到 p3.5 可自测。
; 显示结果:p1.4 → p3.5 显示: 000010 (hz)
;如果有条件的话,可使用专用设备(信号发生器和频率计)进行校正。
;频率计的程序
;包含:外部中断设置,中断服务程序,定时程序,定时服务程序
;以及数据处理,显示,包括 三位十进制数转化为四位bcd码,
;------------------------------------------------------------
beepbitp3.7
lcd_rsbitp2.0
lcd_rwbitp2.1
lcd_enbitp2.2
lcd_xequ3fh;lcd地址变量
timer_hequ30h;定时器高位字节单元
timer_lequ31h;定时器低位字节单元
timcountequ32h;时间中断数
int_gequ35h;中断计数缓冲单元高地址
int_hequ34h;中断计数缓冲单元中地址
int_lequ33h;中断计数缓冲单元低地址
t_sequ36h;数据显示低位
t_mequ37h;数据显示中位
t_hequ38h;数据显示高位
t_gequ39h;数据显示最高位
;----------------------------------------------------------
org0000h
jmpmain;主程序开始
org000bh
jmptimer_int;定时器t0中断服务程序
org001bh;定时器t1中断服务程序
jmptimer1
org0030h
;----------------------------------------------------------
main:
movsp,#60h;设置sp指针
lcallpro_set;初始化
callset_lcd
lcalltim_t0
;-----------------------------------------------------------
;lcd1602是慢速显示器件,故100ms显示一次。
;-----------------------------------------------------------
main1:
movr5,40
main2:
acalldelay1;3ms
djnzr5,main2
acallsbin_sbcd
callconv
jmpmain1
;------------------------------------------------------------
;t1计数器中断服务子程序
;计t1计数器溢出次数
;------------------------------------------------------------
timer1:
inc2ah
reti
;------------------------------------------------------------
;初始化程序
;------------------------------------------------------------
pro_set:mova,#00h
movb,#00h
mov2ah,a
movp0,#0ffh
movp1,#0ffh
movp2,#0ffh
movint_h,#00h
movint_l,#00h
movint_g,#00h
movt_s,#00h
movt_h,#00h
movt_m,#00h
movt_g,#00h
movtimcount,#00h
movtimer_h,#04ch;定时50ms
movtimer_l,#10h;
clrbeep
setbp3.5;p3.5端口置输入状态
ret;t1(timer1的外部输入脚)
;-----------------------------------------------------
;lcd初始化设置
;-----------------------------------------------------
set_lcd:
clrlcd_en
callinit_lcd;初始化lcd
calldelay1
movdptr,#info1;指针指到显示信息1
mova,#1;显示在第一行
calllcd_show
movdptr,#info2;指针指到显示信息2
mova,#2;显示在第二行
calllcd_show
ret
;-----------------------------------------------------
info1:db“cymometer”,0;lcd第一行显示信息
info2:db“freq:hz”,0;lcd第二行显示信息
;-----------------------------------------------------
;lcd接口初始化
;8位i/o控制
;-----------------------------------------------------
init_lcd:
mova,#38h;双列显示,字形5*7点阵
callwcom
calldelay1
mova,#38h;双列显示,字形5*7点阵
callwcom
calldelay1
mova,#38h;双列显示,字形5*7点阵
callwcom
calldelay1
mova,#0ch;开显示,关光标,
callwcom
calldelay1
mova,#01h;清除lcd显示屏
callwcom
calldelay1
ret
;----------------------------------------------------
lcd_show:;在lcd的第一行或第二行显示信息字符
cjnea,#1,line2;判断是否为第一行
line1:mova,#80h;设置lcd的第一行地址
callwcom;写入命令
callclr_line;清除该行字符数据
mova,#80h;设置lcd的第一行地址
callwcom;写入命令
jmpfill
line2:mova,#0c0h;设置lcd的第二行地址
callwcom;写入命令
callclr_line;清除该行字符数据
mova,#0c0h;设置lcd的第二行地址
callwcom
fill:clra;填入字符
movca,@a+dptr;由消息区取出字符
cjnea,#0,lc1;判断是否为结束码
ret
lc1:callwdata;写入数据
incdptr;指针加1
jmpfill;继续填入字符
ret
;---------------------------------------------------
clr_line:;清除该行lcd的字符
movr0,#24
cl1:mova,#’’
callwdata
djnzr0,cl1
ret
;-----------------------------------------------------
;写指令、数据使能子程序
;-----------------------------------------------------
enable:;写指令使能
clrlcd_rs;rs=l,lcd_rw=l,d0-d7=指令码,e=高脉冲
clrlcd_rw
setblcd_en
calldelay0
clrlcd_en
ret
enable1:;写数据使能
setblcd_rs;rs=h,rw=l,d0-d7=数据,e=高脉冲
clrlcd_rw
setblcd_en
calldelay0
clrlcd_en
ret
delay0:movr7,#250;延时500微秒
djnzr7,$
ret
;----------------------------------------------------
;写入命令子程序
;----------------------------------------------------
wcom:;以8位控制方式将命令写至lcd
movp0,a;写入命令
callenable
ret
;----------------------------------------------------
;写入数据子程序
;----------------------------------------------------
wdata:;以8位控制方式将数据写至lcd
movp0,a;写入数据
callenable1
ret
;---------------------------------------------------
;在lcd第二行显示字符
;a=ascdata,b=linexpos
;---------------------------------------------------
lcdp2:;在lcd的第二行显示字符
pushacc;
mova,b;设置显示地址
adda,#0c0h;设置lcd的第二行地址
callwcom;写入命令
popacc;由堆栈取出a
callwdata;写入数据
ret
;-------------------------------------------------------
;ascii转换并在第二行显示数字子程序
;-------------------------------------------------------
conv:;mova,t_g
movlcd_x,#6;设置位置
;callshow_dig2
mova,t_h
;inclcd_x;加载小时数据
callshow_dig2;显示数据
mova,t_m;加载分钟数据
inclcd_x;设置位置
callshow_dig2;显示数据
mova,t_s;加载秒数数据
inclcd_x;设置位置
callshow_dig2;显示数据
ret
;----------------------------------------------------
show_dig2:
movb,#16
divab
adda,#30h
pushb
movb,lcd_x
calllcdp2
popb
mova,b
adda,#30h
inclcd_x
movb,lcd_x
calllcdp2
ret
;-----------------------------------------------------
delay1:;延时3ms
movr6,#15
d2:movr7,#100
djnzr7,$
djnzr6,d2
ret
;-----------------定时器设置------------------------
;设置定时器0工作在定时方式1,定时器1工作在计数方式1
;---------------------------------------------------------
tim_t0:movtmod,#0d1h
movth0,timer_h;设置定时初值高位
movtl0,timer_l;设置定时初值低位
movth1,#00h;清t1计数器
movtl1,#00h
movie,#8ah;开中断总允许,允许t0溢出中断
setbpt1
setbtr1
setbtr0;定时器开始工作
ret
;--------------------------------------------------------
;定时器0中断服务程序
;--------------------------------------------------------
timer_int:
clrtr0;关闭定时器
movtl0,timer_l;重新赋初值
movth0,timer_h;
inctimcount;定时1s,时间单位
mova,timcount;查看数量值
cplp1.4;产生自测信号
cjnea,#20,t_end;如果没有到1s返回
clrtr1;关闭计数器t1
movtimcount,#00h;到1s则清零
movint_l,tl1;取出计数值低位
movint_h,th1;取出计数值高位
movint_g,2ah;取出溢出计数值位
movth1,#00h
movtl1,#00h
mov2ah,#00h
setbtr1
t_end:setbtr0;重新开始定时操作
reti
;---------------------------------------------------------------
;三字节二进制整数转换成四字节bcd码子程序
;二进制数从低位到高位分别存放在int_l、int_h、int_g单元中
;bcd码从低位到高位分别存放在t_s、t_m、t_h、t_g单元中
;---------------------------------------------------------------
sbin_sbcd:
pushpsw
setbpsw.3;设置当前寄存器
clrpsw.4
clra;清累加器
movt_g,a
movt_h,a;清除出口单元,准备转换
movt_m,a
movt_s,a
movr5,int_g
movr7,int_l;设置二进制数起始地址
movr6,int_h
movr2,#24
clrc
hh1:
mova,r7
rlca
movr7,a
mova,r6
rlca
movr6,a
mova,r5
rlca
movr5,a
mova,t_s;得到低位数据
addca,t_s;累加
daa;十进制调整
movt_s,a;保存数据
mova,t_m;得到第二位数据
addca,t_m;累加
daa;十进制调整
movt_m,a;保存结果
mova,t_h;得到第三位
addca,t_h;累加
daa
movt_h,a;保存
mova,t_g;得到第四位
addca,t_g;累加
;daa
movt_g,a
djnzr2,hh1;
poppsw
ret
;----------------------------------------------------------------
end;告诉编译器本程序到此结束。

软件将越来越成为定义汽车的决定性因素,OTA的未来也大有想象空间
宏碁发布史上最薄最强游戏本18.9毫米的GTX1080 一大波新机等着你
iPhone8“正脸”曝光:Home键消失,摄像头横排变竖排
江苏模拟运输振动试验机
运动跑步用什么样的耳机比较舒服,最适合跑步用的耳机排名
51单片机对602LCD显示器的驱动设计
“显卡交火”质量降低 AMD决定取消RDNA架构RX 5000系列显卡的“交火”支持
被传陷入资金困境的东贝营运问题集中爆发
第三代宽禁带半导体碳化硅功率器件的应用
无人机真实任务!英皇家空军指出应让更多玩家参与现实作战
富士通量子计算芯片即将量产 英特尔不甘落后推出双量子计算
百度ai开发者大会直播回放:科技让复杂的世界更简单
扩频系统的接收器灵敏度方程
彩色果蔬豆腐机
浅析ADI提供的两种信号调理解决方案
小米电视4最薄处仅硬币厚度 售价过万冲刺高端
采用TMS320F2812芯片实现某无动力弹的飞行控制系统的设计
纯电、增程之争无需定论,小米也双战略布局?
关于S公司的5G NR毫米波多天线OTA功率测试方案的分享和介绍
英特尔生于摩尔定律,也将死于摩尔定律