ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:22.05KB ,
资源ID:10515186      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-10515186.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(1602液晶初始化程序汇编.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

1602液晶初始化程序汇编.docx

1、1602液晶初始化程序汇编原创1602液晶初始化程序(2007-12-22 18:10:40)标签:1602液晶it/科技汇编语言 液晶初始化,显示数字,按秒计数 RS EQU P2.0 RW EQU P2.1 E EQU P2.2 IN_0 EQU P0 SECL EQU 40H ;秒低位 SECH EQU 41H ;秒高位 MH1 EQU 42H ;冒号 MINL EQU 43H ;分低位 MINH EQU 44H ;分高位 MH2 EQU 45H ;冒号 HOURL EQU 46H ;时低位 HOURH EQU 47H ;时高位;* ORG 0000H AJMP START ORG 00

2、0BH AJMP INTT_0START:MOV SP,#70H MOV R2,#20 ACALL INIT_LCD ;初始化液晶 MOV R5,#00H MOV IN_0,#84H ;写入显示起始地址(第一行第五个位置 ACALL ENABLE MOV TH0,#3fH ;50MS MOV TL0,#0b0H MOV TMOD,#01H ACALL SJCZSTART1:SETB EA SETB ET0 SETB TR0 LCALL WDATA AJMP START1;*时间初值*SJCZ: MOV 40H,#8 ;显示初值是 08:08:08 MOV 41H,#0 MOV 42H,#10

3、MOV 43H,#8 MOV 44H,#0 MOV 45H,#10 MOV 46H,#8 MOV 47H,#0 RET;*T0定时器中断*INTT_0: PUSH ACC MOV TL0,#0b0H ;送定时初值 MOV TH0,#3fH DJNZ R2,TT MOV R2,#20 INC SECL ;秒记数,到60S就清0 MOV A,SECL CJNE A,#0AH,TT INC SECH MOV SECL,#0 MOV A,SECH CJNE A,#06H,TT MOV SECH,#0 INC MINL ;分记数,到60分请0 MOV A,MINL CJNE A,#0AH,TT MOV

4、MINL,#0 INC MINH MOV A,MINH CJNE A,#06H,TT MOV MINH,#0 INC HOURL ;时记数,到24时清0 MOV A,HOURL CJNE A,#04H,TT2 MOV A,HOURH CJNE A,#02H,TT1 MOV HOURL,#0 MOV HOURH,#0 AJMP TTTT2: CJNE A,#0AH,TT MOV HOURL ,#0 INC HOURH AJMP TTTT1: MOV A,HOURL CJNE A,#0AH,TT MOV HOURL ,#0 INC HOURH AJMP TTTT: POP ACC RETI;*液晶

5、初始化*INIT_LCD: CALL DELAYL ;延时20ms,等待LCD完成电源的启动 MOV IN_0,#01H ;清屏并光标复位 ACALL ENABLE MOV IN_0,#38H ;设置显示模式:8位2行5x7点阵 ACALL ENABLE MOV IN_0,#0FH ;显示器开、光标开、光标允许闪烁 ACALL ENABLE MOV IN_0,#06H ;文字不动,光标自动右移 ACALL ENABLE MOV IN_0,#0C0H ;写入显示起始地址(第二行第一个位置) ACALL ENABLE RET;*写数据程序*WDATA: MOV IN_0,#84H ;写入显示起始地

6、址(第一行第五个位置 ACALL ENABLE MOV R1,#8 MOV R0,#47HWDATA1: MOV A,R0 MOV DPTR,#TABLE MOVC A,A+DPTR MOV IN_0,A ;写入数据 SETB RS CLR RW CLR E ACALL CHECKBUSY SETB E ; 忙检测 DEC R0 DJNZ R1,WDATA1 MOV R1,#8 RET;*显示字母表*TABLE: DB 30H,31H,32H,33H,34H,35H ;0 1 2 3 4 5 DB 36H,37H,38H,39H,3AH,80H,2EH ;6 7 8 9 : 空格 .;*写指令

7、*ENABLE: CLR RS ;写入控制命令的子程序 CLR RW CLR E ACALL CHECKBUSY SETB E RET;*程序忙检测*CHECKBUSY: MOV IN_0,#0FFH ;判断液晶显示器是否忙的子程序 CLR RS SETB RW CLR E NOP SETB E JB P0.7,CHECKBUSY ;如果P1.7为高电平表示忙就循环等待 RET;*延时程序*DELAY: MOV R6,#50DEL: MOV R7,#48 DJNZ R7,$ DJNZ R6,DEL RETDELAYL: MOV R7,#100 ;长延时20msD1: MOV R6,#98 DJ

8、NZ R6,$ DJNZ R7,D1 RET END51单片机的1602没做过,只做过其他的控制。做过PIC,不过写51的也不难,熟悉一下指令集就行了,思路都是一样的,大体上,单片机的任务就是把AD结果读出来放到一个寄存器中,然后向1602中送数,时序是这样:写地址使能开送地址数写地址使能关写数据使能开送AD结果()也就是数据)写数据使能关,破折号处需要加3-5毫秒的延时。具体1602的寄存器地址和硬件的接线形式在它的PDF上有,这个你得自己去查查,因为1602有好几种,地址有所差异。需要的话我看改天给你调个程序上来。补充:查表可以,用间接寻址还是很方便的。以前的思路也许可以给你参考一下,我当

9、时的做法是把转换结果按权值做除法,也就是比如254,先除以100得到2,余数送临时寄存器,再用余数除以10,得到5,还有余数4,然后将这三个数分别送进1602就行了。毕竟1602只是个字符屏,我觉得这种做法可取。这种做法做过12864显示的三相表,用于显示各种电力参数。不过遗憾的是PIC的中档单片机没有乘法器,所以连乘除法指令都没有,用累加的办法非常慢,我用倍加的办法写了函数。好在它内置AD,就当时的应用来讲,精度还是可以满足设计要求的。顺便请教你的电压基准一般用什么芯片?我一直没找到合适的,好的都太贵也没必要。补充:用除法没问题,我就这么做的,当时用的是PIC16F877A,它没有除法,要是

10、用51就方便了,一个DIV就解决了而且还快。补充:好的。稍等一会。我写写。补充:;P1口为数据;P2.0为RS;P2.1为RW;P2.2为E;P0为AD转换结果输入;P3.1为AD使能位,假设高电平有效;P3.2为AD等待,假设低电平为等待结束; res100 equ 0x20 ;百位结果 res10 equ 0x21 ;十位结果 res1 equ 0x22 ;个位结果; org 0x00 nop nop ajmp main;主程序;main: lcall initialmainloop: lcall ADconvert mov B,#0x64 div AB lcall data_conver

11、t mov res100,A ;得到百位 mov A,B mov B,#0x0a div AB lcall data_convert mov res10,A ;得到十位 mov A,B lcall data_convert mov res1,A ;得到个位 lcall data_w ;写电压数值 lcall delay1s ajmp mainloop;数据转换;data_convert: add A,#0x30 ret;写数据;data_w: mov P1,#0x8a lcall enable_w mov A,res100 mov P1,A lcall enable_data ;写百位数 mo

12、v P1,#0x8b lcall enable_w mov A,res10 mov P1,A lcall enable_data ;写十位数 mov P1,#0x8c lcall enable_w mov A,res1 mov P1,A lcall enable_data ;写个位数 ret;AD转换;ADconvert: setb P3.1wait: mov A,P3 ;使能AD转换 anl A,#00000100b ;等待AD转换结束 jnz wait ;否则继续等待 mov A,P0 ;存放转换结果 ret;初始化;initial: mov P0,#00000000b nop mov P

13、1,#00000000b nop mov P2,#00000000b nop mov P3,#00000000b nop lcall initial_lcd ret;液晶初始化;第一行显示 Voltage: V;第二行显示 Current: Ainitial_lcd: lcall delay15ms mov P1,#0x38 lcall delay5ms mov P1,#0x38 lcall delay5ms mov P1,#0x38 lcall delay15ms mov P1,#0x38 ;显示模式设置为16字*2行 lcall enable_w mov P1,#0x0c ;不显示光标 l

14、call enable_w mov P1,#0x06 ;显示方向正向且屏不移动 lcall enable_w mov P1,#0x01 ;清屏 lcall enable_w mov P1,#0x82 ;第一行第三字 lcall enable_w mov P1,#0x56 lcall enable_data ;V mov P1,#0x83 lcall enable_w mov P1,#0x6f lcall enable_data ;o mov P1,#0x84 lcall enable_w mov P1,#0x6c lcall enable_data ;l mov P1,#0x85 lcall

15、enable_w mov P1,#0x74 lcall enable_data ;t mov P1,#0x86 lcall enable_w mov P1,#0x61 lcall enable_data ;a mov P1,#0x87 lcall enable_w mov P1,#0x67 lcall enable_data ;g mov P1,#0x88 lcall enable_w mov P1,#0x65 lcall enable_data ;e mov P1,#0x89 lcall enable_w mov P1,#0x3a lcall enable_data ;: mov P1,#0

16、x8d lcall enable_w mov P1,#0x56 lcall enable_data ;V mov P1,#0xc2 ;第二行第三字 lcall enable_w mov P1,#0x43 lcall enable_data ;C mov P1,#0xc3 lcall enable_w mov P1,#0x75 lcall enable_data ;u mov P1,#0xc4 lcall enable_w mov P1,#0x72 lcall enable_data ;r mov P1,#0xc5 lcall enable_w mov P1,#0x72 lcall enable

17、_data ;r mov P1,#0xc6 lcall enable_w mov P1,#0x65 lcall enable_data ;e mov P1,#0xc7 lcall enable_w mov P1,#0x6e lcall enable_data ;n mov P1,#0xc8 lcall enable_w mov P1,#0x74 lcall enable_data ;t mov P1,#0xc9 lcall enable_w mov P1,#0x3a lcall enable_data ;: mov P1,#0xcd lcall enable_w mov P1,#0x41 lc

18、all enable_data ;A ret;写地址使能;enable_w: mov P2,#00000000b lcall judgement setb P2.2 ret;写数据使能;enable_data: setb P2.0 clr P2.1 clr P2.2 lcall judgement setb P2.2 ret;判忙;judgement: mov P1,#0xff clr P2.0 setb P2.1 clr P2.2 nop nop nop setb P2.2 jb P1.7,judgement ret;延时5毫秒;delay5ms: mov R6,#0x32delaymark

19、: mov R7,#0x28 djnz R7,$ djnz R6,delaymark ret;延时15毫秒;delay15ms: mov R7,#0x64delaylongmark: mov R6,#0x3c djnz R6,$ djnz R7,delaylongmark ret;延时1秒;delay1s: mov R7,#0x64delaylongmark2: mov R6,#0x3c djnz R6,$ djnz R7,delaylongmark2 ret; end这个程序我编译过了没有问题,不过硬件电路我还没来得及试,现学现卖哈,上班还是有点忙的,让你久等啦。程序实现的是:第一行: Vo

20、ltage: V,Voltage前和V后面有两个空格,也就是居中,第二行是:Current: A,格式也一样也是居中,不过电流的我没有给你写,因为写起来也一样,送数操作都是一样的无非地址不一样。另外我没用过ADC0809,所以启动AD转换的思路上我是参照PIC的内部AD转换来的,大体上是这样:使能AD转换,判断并等待AD转换结束,取转换结果并读入保存。如果0809只是一路AD,那么你可以再添加一片做双路,这样就可以同时检测电流了。除法的个十百位结果我做了一下处理,直接在真值上加了30H,这样就可以直接当作数据送入液晶,不必查表,其实那个小小的子程序只有一行,直接写进主循环会更快,毕竟lcall

21、需要两个机器周期。不过这样看起来层次性好点。请指教,希望多多交流。补充:汗最后这个延时1S子程序里面的值我忘记改了,当时直接复制的延时15毫秒的,你改改吧,否则理论上刷新会很快。事实上我估计得再加两层延时才能到秒级。不好意思哈单片机的ADC0832数字LCD1602电压表程序SET_LCD:CLR LCD_ENCALL INIT_LCD ;初始化 LCDCALL DELAY1MOV DPTR,#INFO1 ;指针指到显示信息1MOV A,#1 ;显示在第一行CALL LCD_SHOWMOV DPTR,#INFO2 ;指针指到显示信息2MOV A,#2 ;显示在第二行CALL LCD_SHOWR

22、ET;-INFO1: DB DIGITALVOLTMETER,0 ;LCD 第一行显示信息INFO2: DB VOLTAGE: V ,0 ;LCD 第二行显示信息;-;-; LCD 接口初始化;-INIT_LCD:MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#0CH ;开显示,关光标,CALL WCOMCALL DELAY1MOV A,#01H ;清除 LCD 显示

23、屏CALL WCOMCALL DELAY1RET;-DELAY1: ;延时5MSMOV R6,#25DEL1: MOV R7,#100DJNZ R7,$DJNZ R6,DEL1RET;=;在LCD的第一行或第二行显示信息字符;=LCD_SHOW:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置 LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置 LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置 LCD 的第二行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置 LCD 的第二行地址CALL WCOMFILL:

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2