⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.s

📁 avr单片机 128*64液晶显示器
💻 S
字号:
	.module lcd12864.c
	.area text(rom, con, rel)
	.dbfile E:\iccavr代码\实验五_12864汉显LCD模块\lcd12864.c
	.dbfunc e DelaymS _DelaymS fV
;              j -> R20,R21
;              k -> R22,R23
;              i -> R16,R17
	.even
_DelaymS::
	rcall push_gset2
	.dbline -1
	.dbline 37
; //******************************************************************************
; //                                                                             *
; //    FileName   : 实验板12864lcd.c           ICCAVR V6.31A编译                *
; //    Function   : 1602字符型LCD的显示 (8位数据方式)                           *
; //    Date       : 2006-12-14                                                  *
; //    Version    : 1.0                                                         *
; //                                                                             *
; //    Author     : 开关电源              hongtusy@163.com                      *
; //    Company    : 电子信息技术咨询网    http://www.itsn.cn                    *
; //                                                                             *
; //***************************描述与记事*****************************************
; //实验板的AVR程序,驱动12864LCM(可显示4行,每行8个汉字)模块显示实验练习。
; //说明:RS高显示/低指令输入    RW高读/低写    EN高读数据/下降沿写数据
; //记事:本程序旨在对LCD驱动的理解与演示,程序适合初学者使用。
; //具体电路可参照使用指南里的说明。共4×8个汉字。
; //使用器件:ATMEGA8535,可更换。          使用默认的片内RC振荡器,1MHz。
; //接线定义:PD4,5,6,7为RS,R/W,EA,RST(可不用)。数据位为PC口。
; //使用的开关:SW2-1,2,3,4.SW1-1,2,3,4,5,6,7,8.SW2-5为背光开关。 SW3-8为系统复位端。
; //PSB脚为串并行模式选择。SW2-7为高并行模式,SW2-8为低串行模式。
; //记事:
; //******************************************************************************
; #include <string.h>             //字符串操作函数库
; #include <iom8535v.h>           //头文件,ATmega8535单片机的寄存器定义
; #include "macros.h"             //可以使用NOP()以及SEI()等指令.
; 
; typedef unsigned char  uchar;    //宏
; typedef unsigned int   uint;
; 
; /************************************************
; 函 数 名:    DelaymS()
; 功    能:    毫秒级延时函数
; 输入参数:     延迟时间/系统晶体
; 输出参数:    做相应的延迟处理
; 描    述:    /
; ***********************************************/
; void DelaymS (uint i)            //延时函数,参数i为延时时间
; {
	.dbline 39
;     uint j,k;                        //双重延时
; 	for (j=0;j<i;j++)
	clr R20
	clr R21
	rjmp L5
L2:
	.dbline 40
; 	{
	.dbline 41
	clr R22
	clr R23
	rjmp L9
L6:
	.dbline 41
L7:
	.dbline 41
	subi R22,255  ; offset = 1
	sbci R23,255
L9:
	.dbline 41
	ldi R24,50
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brsh L6
	.dbline 42
L3:
	.dbline 39
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 39
	cp R20,R16
	cpc R21,R17
	brlo L2
	.dbline -2
L1:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r j 20 i
	.dbsym r k 22 i
	.dbsym r i 16 i
	.dbend
	.dbfunc e init_mcu _init_mcu fV
	.even
_init_mcu::
	.dbline -1
	.dbline 52
; 	    for (k=0;k<=50;k++);
; 	}
; }
; /************************************************
; 函 数 名:    init_mcu()
; 功    能:    单片机初始化函数
; 输入参数:     /
; 输出参数:    /
; 描    述:    相关口方向的设置等
; ***********************************************/
; void init_mcu(void)
; {
	.dbline 53
;  	DDRC = 0xff;                      //PC口为推挽1输出,数据位
	ldi R24,255
	out 0x14,R24
	.dbline 54
; 	DDRD = 0xff;                      //PD口为推挽1输出,控制信号
	out 0x11,R24
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e write_data _write_data fV
;              h -> R20
	.even
_write_data::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 64
; }
; /********************************************************
;   子程序名:   write_data()
;   功    能:   写入一字节数据
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; void write_data(uchar h)
; {
	.dbline 65
;  	 PORTC = h;                  //先将数据送出
	out 0x15,R20
	.dbline 66
; 	 PORTD |= (1<<PD4);   //RS=1,数据
	sbi 0x12,4
	.dbline 67
; 	 PORTD &= ~(1<<PD5);  //R/W=0,写
	cbi 0x12,5
	.dbline 68
; 	 PORTD &= ~(1<<PD6);  //EN=0 ,使能,产生一个下降沿。
	cbi 0x12,6
	.dbline 69
; 	 DelaymS (1);
	ldi R16,1
	ldi R17,0
	rcall _DelaymS
	.dbline 70
; 	 PORTD |= (1<<PD6);   //EN=1 ,除能
	sbi 0x12,6
	.dbline -2
L11:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r h 20 c
	.dbend
	.dbfunc e write_code _write_code fV
;              h -> R20
	.even
_write_code::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 80
; }
; /********************************************************
;   子程序名:   write_code()
;   功    能:   写入一字节指令/地址
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; void write_code(uchar h)
; {
	.dbline 81
;  	 PORTC = h;                  //先将地址送出
	out 0x15,R20
	.dbline 82
; 	 PORTD &= ~(1<<PD4);  //RS=0,命令或数据
	cbi 0x12,4
	.dbline 83
; 	 PORTD &= ~(1<<PD5);  //R/W=0,写
	cbi 0x12,5
	.dbline 84
; 	 PORTD &= ~(1<<PD6);  //EN=0 ,使能,产生一个下降沿。
	cbi 0x12,6
	.dbline 85
; 	 DelaymS (1);
	ldi R16,1
	ldi R17,0
	rcall _DelaymS
	.dbline 86
; 	 PORTD |= (1<<PD6);   //EN=1 ,除能
	sbi 0x12,6
	.dbline -2
L12:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r h 20 c
	.dbend
	.dbfunc e init_lcd _init_lcd fV
	.even
_init_lcd::
	.dbline -1
	.dbline 96
; }
; /********************************************************
;   子程序名:   init_lcd()
;   功    能:   初始化LCD
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; void init_lcd(void)
; {
	.dbline 97
;  	 PORTD &= ~(1<<PD7);  //RS=0,低电平复位,然后变高后可以正常工作。也可以直接接高电平或NC不用。
	cbi 0x12,7
	.dbline 98
; 	 DelaymS (1);
	ldi R16,1
	ldi R17,0
	rcall _DelaymS
	.dbline 99
; 	 PORTD |= (1<<PD7);   //RS=1,开始工作
	sbi 0x12,7
	.dbline 101
; 	 
; 	 write_code(0x01);           //清除屏幕
	ldi R16,1
	rcall _write_code
	.dbline 102
; 	 write_code(0b00000011);     //光标回到原点
	ldi R16,3
	rcall _write_code
	.dbline 103
; 	 write_code(0b00000111);     //设定,光标右移,位址加一
	ldi R16,7
	rcall _write_code
	.dbline 104
; 	 write_code(0b00001111);     //显示状态开关,整体显示,光标显示,光标位置反白
	ldi R16,15
	rcall _write_code
	.dbline 105
; 	 write_code(0b00010111);     //光标向右移动
	ldi R16,23
	rcall _write_code
	.dbline 106
; 	 write_code(0b00111011);     //功能设定,8位数据口,基本指令集 
	ldi R16,59
	rcall _write_code
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e display_lcd _display_lcd fV
;              i -> R20
;              p -> R22,R23
	.even
_display_lcd::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 123
; 	 //write_code(0b01000000);     //设定CGRAM位址(列)
; 	 //write_code(0b10000000);     //设定DDRAM位址(行)
; }
; /********************************************************
;   子程序名:   display_lcd()
;   功    能:   刷新显示一屏数据,独立的LCD显示程序,用户将显存buf内容更新后,只要调用此程序即可更新显示。
;   输入参数:   显存buf
;   输出参数:   /
;   描    述:   在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
;   此12864LCD使用的是ST7920为驱动芯片。可以显示ASCII码的前128个值,此时为半字宽,数据为8位,
;   即输入的8位数据的最高位为0,范围为0x00~0x7f,比如0x00为空格,0x61为小写字母a,0x7e为~。
;   若最高位为1,则可以显示汉字,且此时为一个字宽,两个字节代表一个汉字。起始数据为0x8000,代表一个字的空格,
;   0x8001代表汉字“啊”,0xffff代表汉字“翰”。
;   也可以使用自定义字库或显示图片等。
; ********************************************************/
; void display_lcd(uchar *p)
; {
	.dbline 125
; 	 uchar i;
; 	 write_code(0x80);     //第一行起始地址,0b10000000B=0x80.即DDRAM位址

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -