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

📄 dm12864m串行.s

📁 EEPROM读写程序: 先向EEPROM写入一幅图片数据
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module dm12864m串行.c
	.area text(rom, con, rel)
	.dbfile E:\学习专区\AVR专区\个人创作区\AVR单片机开发平台\EEPROM读写演示程序\dm12864m串行.c
	.dbfunc e dm12864_inputbyte _dm12864_inputbyte fV
;            mid -> R20
;              i -> R22
;           comm -> R16
	.even
_dm12864_inputbyte::
	xcall push_gset2
	.dbline -1
	.dbline 33
; /****************************************************************************************
;            LCM(DM12864M-带字库,ST7920控制芯片)显示程序   
; 		                                                
;              程序功能:该程序是用AVR来控制对DM12864M
; 			           读写信号等的操作.
;              硬件连接:采用串行方式显示,分配PA.0,PA.1,PA.2
; 			           三个I/O口分别作为LCM片选CS,数据SID,时钟信
; 					   号CLK的控制。PA3置为低电平,用来串行选择信号。
; 		                PA4置位时开启背光。                                           
;  
; ****************************************************************************************/
; 
; #include <iom16v.h>
; #include <macros.h>
; #include <stdio.h>  
; #define LCDDDR        DDRA
; #define LCDDDR_IN     LCDDDR&=~BIT(PA1);
; #define LCDDDR_OUT    LCDDDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)|BIT(PA3)|BIT(PA4);
; /*===============================================================*/
; #define LCDCTL      PORTA   
; #define LCD_RS_H    LCDCTL |= BIT(PA0)  //片选               
; #define LCD_RS_L    LCDCTL &= ~BIT(PA0)                                           
; #define LCD_RW_H    LCDCTL |= BIT(PA1)  //数据                            
; #define LCD_RW_L    LCDCTL &= ~BIT(PA1)  
; #define LCD_EN_H    LCDCTL |= BIT(PA2)  //时钟                          
; #define LCD_EN_L    LCDCTL &= ~BIT(PA2) 
; #define LCD_PSB     LCDCTL &= ~BIT(PA3) //串行选择
; #define LCD_AK      LCDCTL |= BIT(PA4)  //开启背光
; #define  uchar unsigned char
; /***********************函数体部分*********************************/
; 
; void dm12864_inputbyte(uchar comm)  // 写入一字节数据
; {
	.dbline 36
;  	 uchar i;
; 	 uchar mid;
; 	 for (i=0;i<8;i++)
	clr R22
	xjmp L5
L2:
	.dbline 37
; 	 {
	.dbline 38
; 	  	 mid=comm&0x80;
	mov R20,R16
	andi R20,128
	.dbline 39
; 		 if (mid==0)
	brne L6
	.dbline 40
; 		 LCD_RW_L ;
	cbi 0x1b,1
	xjmp L7
L6:
	.dbline 42
; 		 else
; 		 LCD_RW_H ;
	sbi 0x1b,1
L7:
	.dbline 43
	sbi 0x1b,2
	.dbline 45
	cbi 0x1b,2
	.dbline 46
	lsl R16
	.dbline 47
L3:
	.dbline 36
	inc R22
L5:
	.dbline 36
	cpi R22,8
	brlo L2
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r mid 20 c
	.dbsym r i 22 c
	.dbsym r comm 16 c
	.dbend
	.dbfunc e dm12864_outputbyte _dm12864_outputbyte fc
;              i -> R16
;            mid -> R18
	.even
_dm12864_outputbyte::
	.dbline -1
	.dbline 50
; 		 LCD_EN_H ;
; 		 //delay(15);
; 		 LCD_EN_L; 
; 		 comm=comm<<1;
; 	  }
; }
; uchar dm12864_outputbyte(void)  //读取一字节数据
; {
	.dbline 51
;  	  uchar i,mid=0;
	clr R18
	.dbline 52
; 	  for (i=0;i<8;i++)
	clr R16
	xjmp L12
L9:
	.dbline 53
; 	  {
	.dbline 55
; 	   	  //delay(15);
;  		  LCDDDR_IN;
	cbi 0x1a,1
	.dbline 55
	.dbline 56
; 		  LCD_RS_H ;
	sbi 0x1b,0
	.dbline 57
; 		  mid=mid<<1;
	lsl R18
	.dbline 58
; 		  if ((PINA&0x02)==0)
	sbic 0x19,1
	rjmp L13
	.dbline 59
; 		  mid&=~BIT(PD0);
	andi R18,254
	xjmp L14
L13:
	.dbline 61
; 		  else
; 		  mid|=BIT(PD0);
	ori R18,1
L14:
	.dbline 62
	in R24,0x1a
	ori R24,31
	out 0x1a,R24
	.dbline 62
	.dbline 63
	sbi 0x1b,2
	.dbline 65
	cbi 0x1b,2
	.dbline 66
L10:
	.dbline 52
	inc R16
L12:
	.dbline 52
	cpi R16,8
	brlo L9
	.dbline 67
;  		  LCDDDR_OUT;
; 		  LCD_EN_H ;
; 		  //delay(15);
; 		  LCD_EN_L; 
; 	 }
; 	 return(mid);
	mov R16,R18
	.dbline -2
L8:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbsym r mid 18 c
	.dbend
	.dbfunc e DetectLCMBusyState _DetectLCMBusyState fV
;             BF -> R20
	.even
_DetectLCMBusyState::
	xcall push_gset1
	.dbline -1
	.dbline 72
; }
; 
; /*-----------------读取标志位,判断控制器是否为忙状态--------------*/
; void DetectLCMBusyState()
; {
	.dbline 73
;   	 char BF = 0x00;
	clr R20
	.dbline 74
;   	 LCDDDR_OUT;
	in R24,0x1a
	ori R24,31
	out 0x1a,R24
	.dbline 74
	.dbline 75
; 	 LCD_RS_H ;
	sbi 0x1b,0
	.dbline 76
; 	 LCD_EN_L ;
	cbi 0x1b,2
L16:
	.dbline 78
; 	 do
;     {
	.dbline 79
; 	   dm12864_inputbyte(0xfc);
	ldi R16,252
	xcall _dm12864_inputbyte
	.dbline 80
; 	   BF=dm12864_outputbyte();
	xcall _dm12864_outputbyte
	mov R20,R16
	.dbline 81
L17:
	.dbline 81
;     } while(BF==0x80);
	cpi R20,128
	breq L16
	.dbline 82
; 	LCD_RS_L ;
	cbi 0x1b,0
	.dbline 83
; 	LCD_EN_H ;
	sbi 0x1b,2
	.dbline -2
L15:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r BF 20 c
	.dbend
	.dbfunc e LCMWriteCommand _LCMWriteCommand fV
;              b -> R20
;              a -> R22
;     DisplayCmd -> R20
	.even
_LCMWriteCommand::
	xcall push_gset2
	mov R20,R16
	.dbline -1
	.dbline 89
; 	//delay(15);
; }
; 
; /*----------------------------写入命令-----------------------------*/
; void LCMWriteCommand(char DisplayCmd)
; {
	.dbline 91
;  	 uchar a,b;
; 	 a=DisplayCmd&0xf0;
	mov R22,R20
	andi R22,240
	.dbline 92
; 	 b=(DisplayCmd<<4)&0xf0;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	andi R24,240
	mov R20,R24
	.dbline 93
;  	 LCDDDR_OUT;
	in R24,0x1a
	ori R24,31
	out 0x1a,R24
	.dbline 93
	.dbline 94
; 	 LCD_RS_H ;
	sbi 0x1b,0
	.dbline 95
; 	 LCD_EN_L ;
	cbi 0x1b,2
	.dbline 96
; 	 dm12864_inputbyte(0xf8);
	ldi R16,248
	xcall _dm12864_inputbyte
	.dbline 97
; 	 dm12864_inputbyte(a);
	mov R16,R22
	xcall _dm12864_inputbyte
	.dbline 98
; 	 dm12864_inputbyte(b);
	mov R16,R20
	xcall _dm12864_inputbyte
	.dbline 99
; 	 LCD_EN_H ;
	sbi 0x1b,2
	.dbline 100
; 	 LCD_RS_L ;
	cbi 0x1b,0
	.dbline -2
L19:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r b 20 c
	.dbsym r a 22 c
	.dbsym r DisplayCmd 20 c
	.dbend
	.dbfunc e LCMWriteData _LCMWriteData fV
;              b -> R20
;              a -> R22
;    DisplayData -> R20
	.even
_LCMWriteData::
	xcall push_gset2
	mov R20,R16
	.dbline -1
	.dbline 106
; 	 //delay(15);
; }
; 
; /*-----------------------写入一字节数据--------------------------*/
; void LCMWriteData(char DisplayData)
; {
	.dbline 108
;  	 uchar a,b;
; 	 a=DisplayData&0xf0;
	mov R22,R20
	andi R22,240
	.dbline 109
; 	 b=(DisplayData<<4)&0xf0;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	andi R24,240
	mov R20,R24
	.dbline 110
;  	 LCDDDR_OUT;
	in R24,0x1a
	ori R24,31
	out 0x1a,R24
	.dbline 110
	.dbline 111
; 	 LCD_RS_H ;
	sbi 0x1b,0
	.dbline 112
; 	 LCD_EN_L ;
	cbi 0x1b,2
	.dbline 113
; 	 dm12864_inputbyte(0xfa);
	ldi R16,250
	xcall _dm12864_inputbyte
	.dbline 114
; 	 dm12864_inputbyte(a);
	mov R16,R22
	xcall _dm12864_inputbyte
	.dbline 115
; 	 dm12864_inputbyte(b);
	mov R16,R20
	xcall _dm12864_inputbyte
	.dbline 116
; 	 LCD_EN_H ;
	sbi 0x1b,2
	.dbline 117
; 	 LCD_RS_L ;
	cbi 0x1b,0
	.dbline -2
L20:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r b 20 c
	.dbsym r a 22 c
	.dbsym r DisplayData 20 c
	.dbend
	.dbfunc e LCMSetXYAddress _LCMSetXYAddress fV
;     DisplayRow -> R22
;     DisplayCol -> R20
	.even
_LCMSetXYAddress::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 123
; 	 //delay(15);
; }
; 
; /*------------设置显示位置DisplayCol(1~8),DisplayRow(1~4)---------*/
; void LCMSetXYAddress(char DisplayCol,char DisplayRow)
; {
	.dbline 124
;     switch(DisplayRow)
	clr R23
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L25
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L26
	cpi R22,3
	ldi R30,0
	cpc R23,R30
	breq L27
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	breq L28
	xjmp L22
X0:
	.dbline 125
;     {
L25:
	.dbline 126
;         case 1:LCMWriteCommand(0x7f + DisplayCol);
	mov R16,R20
	subi R16,129    ; addi 127
	xcall _LCMWriteCommand
	.dbline 127
;         break;
	xjmp L23
L26:
	.dbline 128
;         case 2:LCMWriteCommand(0x8f + DisplayCol);
	mov R16,R20
	subi R16,113    ; addi 143
	xcall _LCMWriteCommand
	.dbline 129
;         break;
	xjmp L23
L27:
	.dbline 130
;         case 3:LCMWriteCommand(0x87 + DisplayCol);
	mov R16,R20
	subi R16,121    ; addi 135
	xcall _LCMWriteCommand
	.dbline 131
;         break;
	xjmp L23
L28:
	.dbline 132
;         case 4:LCMWriteCommand(0x97 + DisplayCol);
	mov R16,R20
	subi R16,105    ; addi 151
	xcall _LCMWriteCommand
	.dbline 133
; 	    break;
L22:
L23:
	.dbline -2
L21:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r DisplayRow 22 c
	.dbsym r DisplayCol 20 c
	.dbend
	.dbfunc e LCMDisplayASC _LCMDisplayASC fV
;   ASCCharacter -> y+4
;     DisplayRow -> R22
;     DisplayCol -> R20
	.even
_LCMDisplayASC::

⌨️ 快捷键说明

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