版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、原创1602液晶初始化程序(2007-12-22 18:10:40)标签:1602液晶it/科技汇编语言液晶初始化,显示数字,按秒计数RS EQU P2.0RW EQU P2.1E EQU P2.2IN_0 EQU P0SECL EQU 40H;秒低位SECH EQU 41H;秒高位MH1EQU 42H;冒号MINL EQU 43H;分低位MINH EQU 44H;分高位MH2EQU 45H;冒号HOURL EQU46H;时低位HOURH EQU 47H;时高位*ORG 0000HAJMP STARTORG 000BHAJMP INTT_0START:MOV SP,#70HMOV R2,#20
2、ACALL INIT_LCDMOV R5,#00HMOV IN_0,#84HACALL ENABLEMOV TH0,#3fHMOV TLO,#ObOHMOV TMOD,#01HACALLSJCZSTART1:SETB EASETB ET0;初始化液晶;写入显示起始地址(第一行第五个位置;50MSSETB TR0LCALL WDATAAJMP START1时间初值*SJCZ: MOV 40H,#8显示初值是08:08:08MOV 41H,#0MOV 42H,#10MOV 43H,#8MOV 44H,#0MOV 45H,#10MOV 46H,#8MOV 47H,#0RET;*T0 定时器中断*IN
3、TT_0:PUSH ACCMOV R2,#20MOV HOURH,#0MOV TLO,#ObOHMOV TH0,#3fHDJNZ R2,TTINC SECLMOV A,SECLCJNE A,#0AH,TTINC SECHMOV SECL,#0MOV A,SECHCJNE A,#06H,TTMOV SECH,#0INC MINLMOV A,MINLCJNE A,#0AH,TTMOV MINL,#0INC MINHMOV A,MINHCJNE A,#06H,TTMOV MINH,#0INC HOURLMOV A,HOURLCJNE A,#04H,TT2MOV A,HOURHCJNE A,#02H,
4、TT1MOV HOURL,#0AJMP TT;送定时初值;秒记数,到60S就清0;分记数,到60分请0时记数,到24时清0TT2:CJNE A,#OAH,TTMOV HOURL ,#0INC HOURHAJMP TTTT1:MOV A,HOURLCJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT:POP ACCRETI;* 液晶初始化*INIT_LCD:CALL DELAYL启动MOV IN_0,#01HACALL ENABLEMOV IN_0,#38H点阵ACALL ENABLEMOV IN_0,#0FH闪烁ACALL ENABLEMOV IN_0,#
5、06HACALL ENABLEMOV IN_0,#0C0H个位置)ACALL ENABLERET;* 写数据程序 *WDATA:MOV IN_0,#84H;写入显示起始地址(第,;延时20ms,等待LCD完成电源的;清屏并光标复位;设置显示模式:8位2行5x7;显示器开、光标开、光标允许;文字不动,光标自动右移;写入显示起始地址(第二行第一行第五个位置ACALL ENABLEMOV R1,#8MOV R0,#47HWDATA1:MOV A,R0MOV DPTR,#TABLEMOVC A,A+DPTRMOV IN_0,ASETB RSCLR RWCLR EACALLCHECKBUSYSETB E
6、DEC RO写入数据忙检测DJNZ R1,WDATA1MOV R1,#8RET*J显示字母表*TABLE:DB 30H,31H,32H,33H,34H,35H;0 1 2 3 4 5DB 36H,37H,38H,39H,3AH,80H,2EH;6 7 8 9 :空格.*J写指令 *ENABLE: CLR RS;写入控制命令的子程序CLR RWCLR EACALLCHECKBUSYSETB ERET;* 程序忙检测*CHECKBUSY:MOV IN_0,#0FFHCLR RSSETB RWCLR ENOPSETB EJB P0.7,CHECKBUSY环等待RET;判断液晶显示器是否忙的子程序;如
7、果P1.7为高电平表示忙就循*延时程序*DELAY:MOV R6,#50DEL:MOV R7,#48DJNZ R7,$DJNZ R6,DELRET;长延时20msDELAYL: MOV R7,#100D1:MOV R6,#98DJNZ R6,$DJNZ R7,D1RETEND51单片机的1602没做过,只做过其他的控制。做过 PIC,不过写51的也不难,熟悉一下指令集就行了,思路都是一样的,大体上,单片机的任务就是把AD结果读出来放到一个寄存器中,然后向 1602中送数,时序是这样:写地址使能开 一一送地址数一一写地址使能关一一写数据使能开一一送AD结果() 也就是数据)一一写数据使能关,破折
8、号处需要加3-5毫秒的延时。具体1602的寄存器地址和硬件的接 线形式在它的PDF上有,这个你得自己去查查,因为1602有好几种,地址有所差异。需要的话我看改天给你调个程序上来。补充:查表可以,用间接寻址还是很方便的。以前的思路也许可以给你参考一下,我当时的做法是把转换结果按权值做除法,也就是比如254,先除以100得到2,余数送临时寄存器,再用余数除以 10,得到5,还有余数 4,然后将这三个数分别送进 1602就行了。毕竟1602只是个字符屏,我觉得这种做法可取。这种做法做过 12864显示的三相表,用于显示各种电力参数。不过遗憾的是PIC的中档单片机没有乘法器,所以连乘除法指令都没有,用
9、累加的办法非常慢,我用倍加的办法写了函数。好在它内置AD,就当时的应用来讲,精度还是可以满足设计要求的。顺便请教你的电压基准一般用什么芯片?我一直没找到合适的,好的都太贵也没必要。补充:用除法没问题,我就这么做的,当时用的是PIC16F877A,它没有除法,要是用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 ;十
10、位结果 res1 equ 0x22 ;个位结果org 0x00nopnopajmp main 主程序J J J J J J J J J J J J1- I1/ J J J J J J J J J J J J J J J J J main:Icall initialmainloop:Icall ADconvertmov B,#0x64div ABlcall data_convertmov res100,A ;得到百位mov A,Bmov B,#0x0adiv ABlcall data_convertmov res10,A ;得到十位mov A,Blcall data_convertmov res
11、1,A ;得到个位lcall data_w ;写电压数值lcall delay1sajmp mainloop; 数据转换;data_convert:add A,#0x30ret;写数据;data_w:mov P1,#0x8alcall enable_wmov A,res100mov P1,Alcall enable_data ;写百位数mov P1,#0x8blcall enable_wmov A,res10mov P1,Alcall enable_data ; 写十位数mov P1,#0x8clcall enable_wmov A,res1mov P1,Alcall enable_data
12、;写个位数 ret;AD转换;ADconvert:setb P3.1wait:mov A,P3 ;使能AD转换anl A,#OOOOO1OOb ; 等待AD转换结束jnz wait ;否则继续等待mov A,PO ;存放转换结果ret,初始 口化;initial:mov PO,#OOOOOOOObnopmov P1,#OOOOOOOObnopmov P2,#00000000bnopmov P3,#00000000bnoplcall initial_lcdret; 液晶初始化;;第一行显示 Voltage: V;第二行显示 Current: Ainitial_lcd:lcall delay15m
13、smov P1,#0x38lcall delay5msmov P1,#0x38lcall delay5msmov P1,#0x38lcall delay15msmov P1,#0x38 ;显示模式设置为16字*2行lcall enable_wmov P1,#0x0c ;不显示光标lcall enable_wmov P1,#0x06 ;显示方向正向且屏不移动lcall enable_wmov P1,#0x01 ;清屏lcall enable_wmov P1,#0x82 ;第一行第三字lcall enable_wmov P1,#0x56lcall enable_data ;Vmov P1,#0x8
14、3lcall enable_wmov P1,#0x6fIcall enable_data ;omov P1,#0x84Icall enable_wmov P1,#0x6clcall enable_data ;lmov P1,#0x85lcall enable_wmov P1,#0x74lcall enable_data ;tmov P1,#0x86lcall enable_wmov P1,#0x61lcall enable_data ;amov P1,#0x87lcall enable_wmov P1,#0x67lcall enable_data ;gmov P1,#0x88lcall ena
15、ble_wmov P1,#0x65lcall enable_data ;emov P1,#0x89lcall enable_wmov P1,#0x3alcall enable_data ;:mov P1,#0x8dlcall enable_wmov P1,#0x56lcall enable_data ;Vmov P1,#0xc2 ;第二行第三字lcall enable_wmov P1,#0x43lcall enable_data ;Cmov P1,#0xc3lcall enable_wmov P1,#0x75lcall enable_data ;umov P1,#0xc4lcall enabl
16、e_wmov P1,#0x72lcall enable_data ;rmov P1,#0xc5lcall enable_wmov P1,#0x72Icall enable_data ;rmov P1,#0xc6Icall enable_wmov P1,#0x65lcall enable_data ;emov P1,#0xc7lcall enable_wmov P1,#0x6elcall enable_data ;nmov P1,#0xc8lcall enable_wmov P1,#0x74lcall enable_data ;tmov P1,#0xc9lcall enable_wmov P1,
17、#0x3alcall enable_data ;:mov P1,#0xcdlcall enable_wmov P1,#0x41lcall enable_data ;Aret;与地址使冃能;enable_w:mov P2,#00000000blcall judgementsetb P2.2ret;写数据使能;enable_data:setb P2.0clr P2.1clr P2.2lcall judgementsetb P2.2ret 判忙,J J J J J J J J J J J J JJ J J J J J J J J J J J J J J J Jjudgement:mov P1,#0x
18、ffclr P2.0setb P2.1clr P2.2nopnopnopsetb P2.2jb P1.7,judgementret;延时 5毫秒;delay5ms:mov R6,#0x32delaymark:mov R7,#0x28djnz R7,$djnz R6,delaymarkret;延时 15 毫秒;delay15ms:mov R7,#0x64delaylongmark:mov R6,#0x3cdjnz R6,$djnz R7,delaylongmarkret 延时1秒J J J J J J J J J J J J J Jl1 -4 I丿 J J J J J J J J J J J J
19、 J J Jdelay1s:mov R7,#0x64delaylongmark2:mov R6,#0x3cdjnz R6,$djnz R7,delaylongmark2retend这个程序我编译过了没有问题,不过硬件电路我还没来得及试,现学现卖哈,上班还是有点忙的,让你久 等啦。程序实现的是:第一行:Voltage : V,Voltage前和V后面有两个空格,也就是居中,第二行是:Current : A,格式也一样也是居中,不过电流的我没有给你写,因为写起来也一样,送数操作都是一样的 无非地址不一样。另外我没用过ADC0809,所以启动AD转换的思路上我是参照 PIC的内部AD转换来的, 大体
20、上是这样:使能AD转换,判断并等待AD转换结束,取转换结果并读入保存。如果0809只是一路AD,那么你可以再添加一片做双路,这样就可以同时检测电流了。除法的个十百位结果我做了一下处理,直接 在真值上加了 30H,这样就可以直接当作数据送入液晶,不必查表,其实那个小小的子程序只有一行,直 接写进主循环会更快, 毕竟lcall需要两个机器周期。不过这样看起来层次性好点。请指教,希望多多交流。补充:汗最后这个延时1S子程序里面的值我忘记改了,当时直接复制的延时15毫秒的,你改改吧,否则理论上刷新会很快。事实上我估计得再加两层延时才能到秒级。不好意思哈单片机的ADC0832数字LCD1602电压表程序
21、SET_LCD:CLR LCD_ENCALL INIT_LCD ;初始化 LCDCALL DELAY1MOV DPTR,#INFO1 ;指针指到显示信息1MOV A,#1 ;显示在第一行CALL LCD_SHOWMOV DPTR,#INFO2 ;指针指到显示信息2MOV A,#2 ;显示在第二行CALL LCD_SHOWRETINFO1: DB "DIGITALVOLTMETER",0 ;LCD第一行显示信息INFO2: DB " VOLTAGE: V ",0 ;LCD第二行显示信息;LCD接口初始化INIT_LCD:MOV A,#38H ;双列显示,字
22、形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显示屏CALL WCOMCALL DELAY1RETDELAY1:;延时 5MSMOV R6,#25DEL1: MOV R7,#100DJNZ R7,$DJNZ R6,DEL1RET;在LCD的第一行或第二行显示信息字符LCD_SHOW:CJNE A,#1,
23、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: CLR A ;填入字符MOVC A,A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RE
24、TLC1: CALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RETCLR_LINE:;清除该行 LCD的字符MOV R0,#24CL1: MOV A,#''CALL WDATADJNZ R0,CL1RET ;写指令使能子程序;RS=L,RW=L,D0-D7=指令码,E=高脉冲WCOM:MOV P0,ACLR LCD_RSCLR LCD_RW SETB LCD_EN CALL DELAY0CLR LCD_ENRET;写数据使能子程序;RS=H,RW=L,D0-D7=数据,E=高脉冲WDATA:MOV P0,ASETB LCD_RSCLR
25、 LCD_RWSETB LCD_ENCALL DELAY0CLR LCD_ENRETDELAY0: MOV R7,#250 ;延时 500微秒DJNZ R7,$RET ;在LCD第二行指定位置显示字符;(A)=ASCII数据,(B)=位置变量LCDP2:PUSH ACC ;入栈保护 AMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出 ACALL WDATA ;写入数据RET ;ASCII转换并在第二行显示数字子程序LCD_CONV:MOV A,R4 ;加载数据MOV LCD_X,#10 ;设置位置CALL
26、SHOW_DIG2A ;显示数据INC LCD_X ;设置位置MOV A,#'.'MOV B,L CD_XCALL LCDP2 ;显示小数点MOV A,R5 ;加载数据INC LCD_X ;设置位置CALL SHOW_DIG2B ;显示数据RET ;整数部分转换为 ASCII码,送显示;只显示一位数SH0W_DIG2A:MOV B,#16DIV ABMOV A,B ;只取整数部分的个位ADD A,#30H ;转换为 ASCII 码MOV B,LCD_X ;地址变量送 BCALL LCDP2 ;送显示RET;小数部分转换为 ASCII码,送显示;显示两位数SHOW_DIG2B:M
27、OV B,#16DIV ABADD A,#30H ;转换为 ASCII 码PUSH BMOV B,LCD_X ;地址变量送 BCALL LCDP2 ;送显示POP BMOV A,BADD A,#30H ;转换为 ASCII 码INC LCD_XMOV B,LCD_X ;地址变量送 BCALL LCDP2 ;送显示RET ;AD0832初始化与AD转换子程序 ;(A )= AD转换值AD_CONV:SETB AD_CS ; 一个转换周期开始CLR AD_CLKCLR AD_CS ;CS置0,片选有效SETB AD_DAT ;DI 置 1,起始位NOPSETB AD_CLK ;第一个脉冲CLR AD_DAT ;在负跳变之前加一个 DI反转操作CLR AD_CLKSETB AD_DAT ;DI置1,设为单通道NOPSETB AD_CLK ;第二个脉冲CL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年玻璃石材家具项目安全调研评估报告
- 2026年水电站安全生产培训模拟题及答案详解
- 2026年厦门医院考试模拟题目及答案详解
- 2026年临沂大学招聘辅导员模拟题及答案详解
- 2026年标准河南安全员c证模拟试卷(含答案)
- 2026年后勤保洁模拟试题(含答案)
- 2026年古代会试殿模拟试题目(含答案)
- 财务管理综合习题及答案详解
- 2026年危急值模拟题及答案详解
- 2026-2031年中国电子测量仪器行业前景研究与投资前景评估报告
- 在线网课学习课堂《人工智能(北理)》单元测试考核答案
- 2026年中国华电集团有限公司校园招聘笔试备考试题及答案解析
- 碳酸钙深加工项目预可行性研究评测报告(新)
- 2026中国农机配件市场发展现状及投资策略分析报告
- 自考13174概率论与数理统计(工)高频考点重点
- 仲利国际租赁在线测评题库及答案
- 广东2026公需课《加快培育发展新质生产力》题库及答案
- 2024火力发电厂运煤设备抑尘技术规范第4部分:输送及转运设备抑尘
- 阿克苏地区天全物资再生利用有限责任公司年2000辆报废汽车拆解项目环评报告
- 铁路防雷及接地工程技术规范(TB 10180-2016)
- 炮车施工方案
评论
0/150
提交评论