;the LCM 1602 driving program ;font test:0123456789 ;font test:abcdefghijklmnopqrstuvwxyz ;font test:ABCDEFGHIJKLMYOPQRSTUVWXYZ ;程序来自《单片机原理与应用及C51程序设计》的208~209页,有修改 ;仿真用的是万利的ME52仿真机,环境为MEDWIN2.39,时钟频率12MHz ;多谢周老兄赠送的这只仿真机,操作非常顺手 ;开始了 RS EQU P2.7 RW EQU P2.6 E EQU P2.5 ORG 00H AJMP START ORG 50H ;主程序 START: MOV SP,#50H ACALL INIT MOV A,#10000000B ;写入显示缓冲区起始地址为第1行,第1列 ACALL WC51R MOV A,#01000001B ACALL WC51DDR MOV A,#01000010B ACALL WC51DDR MOV A,#01000011B ACALL WC51DDR MOV A,#11000100B ACALL WC51DDR MOV A,#11111111B ACALL WC51DDR MOV A,#00101101B ACALL WC51DDR MOV A,#"G" ;按书上的方法是MOV A,"G",但有问题 ACALL WC51DDR MOV A,#00111111B ACALL WC51DDR ;MOV P2,#0FFH ;开始怕端口有问题,测试了一下 ;MOV P0,#0FFH ;开始怕端口有问题,测试了一下 LOOP: AJMP START ;让LCM反复显示,不怕累倒它 ;初始化子程序 INIT: MOV A,#00000001B ;清屏 ACALL WC51R ;调用写命令子程序 MOV A,#00111000B ;使用8位数据,显示两行,5*7的字型 LCALL WC51R ;调用写命令子程序 MOV A,#00001110B ;显示器开,光标开,字符不闪烁 LCALL WC51R MOV A,#00000110B ;字符不动,光标自动右移一格 LCALL WC51R RET ;检查LCD忙子程序 F_BUSY: PUSH ACC PUSH DPH PUSH DPL PUSH PSW WAIT: CLR RS ;选择LCM的指令寄存器 SETB RW ;读指令 CLR E ;LCM关 SETB E ;开LCM MOV A,P0 ;读出LCM的状态,送到A寄存器 CLR E ;关LCM JB ACC.7,WAIT;判断读出LCM数据的第7位是否为1, ;为1则表示LCM忙,这时跳转到WAIT继续等待,否则往下 POP PSW POP DPL POP DPH POP ACC ACALL DELAY RET ;写入命令子程序 WC51R: ACALL F_BUSY CLR E ;关LCM CLR RS ;选择LCM的指令寄存器 CLR RW ;写入模式 SETB E ;开LCM MOV P0,ACC ;把指令数据写入LCM CLR E ;关LCM ACALL DELAY RET ;写数据子程序 WC51DDR: ACALL F_BUSY CLR E ;关LCM SETB RS ;选择LCM的数据寄存器 CLR RW ;写入模式 SETB E ;开LCM MOV P0,ACC ;把显示数据写入LCM CLR E ;关LCM ACALL DELAY RET ;延时子程序 DELAY: MOV R6,#200 ;原先是5 ,想看慢动作,改为200了 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET END |