250 likes | 475 Views
液晶显示 164 接口实验. 实验目的 实验器材 硬件接线 软件功能 程序清单 备注说明. <<<. 实验目的 :. 掌握点阵字符型液晶显示 (LCD) 编程方法. 实验器材 :. 1. 单片机 2.LCD( 液晶显示屏 ) 3.74HC164(8 位移位寄存器 ). 16151413121110090807060504030201. VCC. Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0. B A CP CR. MOS1 SPSCK PTC3 PTC2 PTC1 PTC0 SS. 74HC164.
E N D
液晶显示164接口实验 • 实验目的 • 实验器材 • 硬件接线 • 软件功能 • 程序清单 • 备注说明 <<<
实验目的: 掌握点阵字符型液晶显示(LCD)编程方法
实验器材: 1.单片机 2.LCD(液晶显示屏) 3.74HC164(8位移位寄存器)
16151413121110090807060504030201 VCC Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 B A CP CR MOS1 SPSCK PTC3 PTC2 PTC1 PTC0 SS 74HC164 LCD(HD44780) MC68HC908GP32 VCC VCC 硬件接线:
软件功能: • 开始运行时,LCD显示“Wait Receiving..” • 等待接收字符,当收到16个字符时,显示之,重复此功能
程序说明 口地址定义 SPI地址定义 SCI串行通信口定义 变量定义 系统初始化 主程序 LCD初始化子程序 LCD命令执行子程序 74HC164初始化 LCD显示子程序 中断矢量 程序清单:
*--------------程序说明--------------------------* *文件名LCD.ASM *硬件连接:74HC164的Q0-Q7分别接LCD的DB0-DB7; * 74HC164的MR,CLK接分别MCU的PTC3,SCK; * 74HC164的B接MCU的VCC(+5V); * 74HC164的A接MCU的MOSI; * LCD的E,R/W,RS分别接的PTC2,PTC1,PTC0。 *程序描述:1.开始运行时,LCD显示“Wait Receiving..” * 2.等待接收字符,当收到16个字符时显示之, * 重复此功能。 *目的:掌握点阵字符型液晶显示(LCD)编程方法 *备注说明:从PC机输入被显示的16个字符,以串行通信方 * 式发送到单片机,在液晶屏上显出这些字符。 *-------------------------------------------------*
*-----口地址定义------------------------------- PTC EQU $0002 ;C口数据寄存器 LCD-RS EQU 0 ;LCD寄存器选择信号接PTC0 LCD-RW EQU 1 ;读写信号接PTC1 LCD-E EQU 2 ;LCD使能信号接PTC2 HC164-CR EQU 3 ;74HC164(移位寄存器) ;清除端接PTC3 DDRC EQU $0006 ;C口数据方向寄存器 *----SPI(串行外设接口)地址定义------------------- SPCR EQU $0010 ;SPI控制寄存器 SPSCR EQU $0011 ;SPI状态和控制寄存器 BIT-SPTE EQU 3 ;SPI发送器空标志位 SPDR EQU $0012 ;SPI数据寄存器
*----SCI串行通信口地址------------------------ SCS1 EQU $0016 ;串行通信接口状态寄存器地址 SCDR EQU $0018 ;串行通信接口数据寄存器地址 *----变量定义--------------------------------- ORG $0090 BYTEDISPLY RMB 1 ;临时存放一个字符 LCD-BUFFER RMB 16 ;存放16字节 FlashStartAddr equ $8000 ;程序开始地址(因芯片不同可以更改) **********************************************
*---------主程序----------------------------- ORG ORG FlashStartAddr MainInit: ;复位后程序从此开始执行 ;系统初始化 SEI ;禁止所有中断 LDHX #$023F ;堆栈初始化,放入GP32的RAM最高端 TXS JSR Init0 ;调系统初始化子程序Init0,初始学习时跳过此处 ;I/O初始化 NOP ;初始化 LDA #%00111010 ;SPI初始化设置:禁止中断, ;主机方式,时钟低电平有SPSCK启动移位、 ;脉冲,普通推拉模式,允许SPI STA SPCR LDA #%00000000 ;禁止中断,禁止错误检测, ;时钟分频系数为2 STA SPSCR
LDA DDRC ;初始化E,RW,RS控制信号 ORA #%00001111 ;PTC3-0为输出 STA DDRC LDHX #$00 DISPLAY1: ;把要显示的16个初始字符 ;放入LCD-BUFFER中 LDA DISPLAYBYTES,X STA LCD-BUFFER,X AIX #1 CPHX #$10 BNE DISPLAY1 ;循环16次 BRA START
DISPLAYBYTES FCB "WAIT RECEIVING.." START: JSR INIT-74HC164;初始化74HC164 ;(移位寄存器) JSR INIT-LCD;LCD初始化 JSR SHOW-LCD-BUFFER;把LCD-BUFFER中的 ;16个字符送LCD显示
LDHX #$00 DISPLAY2: ;从PC机接收16个字符放入LCD- ;BUFFER开始的内存中 BRCLR 5,SCS1,* ;与PC机串行通信,判断接收器 ;是否满 LDA SCDR ;读SCI数据寄存器 STA LCD-BUFFER,X AIX #1 CPHX #$10 BNE DISPLAY2 JMP START ***************************************************
*---INIT-LCD(LCD初始化子程序)------------------ *入口:无 *功能:初始化LCD(HD44780) *调用子程序:LCDCOMMAND(LCD命令执行子程序) *占用CPU内部寄存器:A,X *---------------------------------------------- INIT-LCD: BCLR LCD-RS,PTC ;令LCD的RS=0,R/W=0, ;进行LCD初始化 BCLR LCD-RW,PTC LDA #%00111000 ;功能设置:8位数据接口, ;2行显示,5*10点阵模式 JSR LCDCOMMAND
LDA #%00001000 ;显示开关控制:开显示, ;关光标显示,不闪烁 JSR LCDCOMMAND JSR INIT-74HC164 ;74HC164(移位寄存器) ;初始化 BCLR LCD-RS,PTC ;RS,RW清零开始清屏 BCLR LCD-RW,PTC BRCLR BIT-SPTE,SPSCR,* ;判断发送数据寄存器 ;是否为空 LDA #%00000001 ;清屏指令 JSR LCDCOMMAND LDHX #$2DF ;等待清屏完毕,时间>1.6ms
CLR-LCD-2-MS: ;延时 AIX #-1 CPHX #0 BNE CLR-LCD-2-MS LDA #%00000110;输入方式设置:数据读写 ;操作后,AC自动增1显示不动, ;光标左移 JSR LCDCOMMAND LDA #%00010100;光标移位设置:光标右 ;移一个字符位,AC自动加1 JSR LCDCOMMAND LDA #%00001100;显示开关设置:开显示, ;关光标显示,不闪烁 JSR LCDCOMMAND RTS
*----LCDCOMMAND(LCD命令执行子程序)---------- *入口:A *功能:对A中指令送LCD(HD44780),进行命令执行或 *字符显示 *占用CPU内部寄存器:A *------------------------------------------- LCDCOMMAND: PSHH ;保护现场 PSHX PSHA ;保护入口指令码 BRCLR BIT-SPTE,SPSCR,* ;测试状态,发送数据 ;寄存器是否为空
JSR INIT-74HC164 ;初始化74HC164芯片 PULA ;弹出入口指令码 STA SPDR ;把指令码发送出去 BRCLR BIT-SPTE,SPSCR,* ;测试发送完毕 NOP NOP BSET LCD-E,PTC ;LCD开始接受数据, ;置使能位为1
NOP NOP BCLR LCD-E,PTC ;LCD结束接受数据,置 ;使能位为0 LDHX #$0020 ;等待40us DBNZX * PULX ;恢复现场 PULH RTS ********************************************
*---INIT-74HC164(74HC164初始化)-------------- *入口:无 *功能:清空74HC164 *占用CPU内部寄存器:HX *------------------------------------------- INIT-74HC164: BCLR HC164-CR,PTC ;CR为0清除74HC164中的数据 BSET HC164-CR,DDRC LDHX #$0020 ;等待40us DBNZX * BSET HC164-CR,PTC ;清除完毕,74HC64的CR ;转为高电平 RTS
*----SHOW-LCD-BUFFEER(LCD显示子程序)-------* *入口:内存LCD-BUFFER开始的16个地址中存放要显 *示的字符编码 *功能:显示内存LCD-BUFFER开始的16字节数据 *调用:LCDCOMMAND子程序 *占用CPU内部寄存器:A,HX *------------------------------------------* SHOW-LCD-BUFFER: ;进行显示数据寄存器 ;(DD RAM)地址设置 BCLR LCD-RS,PTC BCLR LCD-RW,PTC ;设置前8个字符 ;首DDRAM地址
LDA #%10000000 JSR LCDCOMMAND LDHX #$0 ;显示前8个字符 SHOW-FIRST-8BYTE: BSET LCD-RS,PTC ;令LCDRS=1,R/W=0, ;写入数据到DD RAM中 BCLR LCD-RW,PTC LDA LCD-BUFFER,X ;将{LCD-BUFFER+X} ;的数据放入A作为入口 JSR LCDCOMMAND
AIX #1 CPHX #$8 BNE SHOW-FIRST-8BYTE LDA #%11000000 ;设置后8个字符首DD RAM地址 BCLR LCD-RS,PTC BCLR LCD-RW,PTC JSR LCDCOMMAND LDHX #$08 ;显示后8个字符 SHOW-NEXT-8BYTE: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0,写入 ;数据到DD RAM中
BCLR LCD-RW,PTC LDA LCD-BUFFER,X ;将{LCD-BUFFER+X}的数据 ;放入A作为入口 JSR LCDCOMMAND AIX #1 CPHX #$10 BNE SHOW-NEXT-8BYTE RTS ******************************************** --中断矢量--------------------------------* ORG $FFFE ;复位向量 DW MAININIT
系统初始化 • Init0: ;系统初始化Init0子程序 • LDA #%00000001 ;初始化CONFIG2 • STA $001E • LDA #%00111101 ;初始化CONFIG1 • STA $001F • CLR $0036 ;初始化PTCL • MOV #$01,$0036 • MOV #$01,$0038 • MOV #$2C,$0039 • MOV #$80,$003A • BSET 5,$0036 • BSET 7,$0037 • BSET 4,$0036 • RTS