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

📄 595_1602_example.lst

📁 ATMEGA8做的595驱动1602
💻 LST
📖 第 1 页 / 共 4 页
字号:
    00CA D00B      RCALL	_sendBITS
    00CB 9563      INC	R22
    00CC 3061      CPI	R22,1
    00CD F3A0      BCS	0x00C2
    00CE D260      RCALL	0x032F
(0208) 	}
(0209) 	VRCK = 1;
    00CF 6088      ORI	R24,0x8
    00D0 8380      STD	Z+0,R24
(0210) 	IfPortChange = False;
    00D1 2422      CLR	R2
    00D2 92200063  STS	IfPortChange,R2
    00D4 D213      RCALL	pop_gset2
    00D5 9508      RET
_sendBITS:
  n                    --> R20
  Data                 --> R22
    00D6 D21B      RCALL	push_gset2
    00D7 2F60      MOV	R22,R16
(0211) }
(0212) 
(0213) /********************************************************
(0214) *  函数说明:发送串行数据函数                           *
(0215) *  输入:    要发送的字节                               *
(0216) ********************************************************/
(0217) void sendBITS(char Data)
(0218) {
(0219)     char n = 0;
    00D8 2744      CLR	R20
(0220) 	for (n = 0;n<8;n++)
    00D9 C014      RJMP	0x00EE
(0221) 	{
(0222) 	    VSCK = 0;
    00DA D254      RCALL	0x032F
    00DB 7E8F      ANDI	R24,0xEF
    00DC 8380      STD	Z+0,R24
(0223) 	    if (((Data<<n)& 0x80 )==0)
    00DD 2F06      MOV	R16,R22
    00DE 2F14      MOV	R17,R20
    00DF D237      RCALL	lsl8
    00E0 2F80      MOV	R24,R16
    00E1 7880      ANDI	R24,0x80
    00E2 F421      BNE	0x00E7
    00E3 D24B      RCALL	0x032F
(0224) 		{
(0225) 		    VSI = 0;
    00E4 7D8F      ANDI	R24,0xDF
    00E5 8380      STD	Z+0,R24
(0226) 		}
    00E6 C003      RJMP	0x00EA
(0227) 		else
(0228) 		{
(0229) 		    VSI = 1;
    00E7 D247      RCALL	0x032F
    00E8 6280      ORI	R24,0x20
    00E9 8380      STD	Z+0,R24
(0230) 		}
(0231) 		VSCK = 1;                                        //拉高时钟线
    00EA D244      RCALL	0x032F
    00EB 6180      ORI	R24,0x10
    00EC 8380      STD	Z+0,R24
    00ED 9543      INC	R20
    00EE 3048      CPI	R20,0x8
    00EF F408      BCC	0x00F1
    00F0 CFE9      RJMP	0x00DA
    00F1 D1F6      RCALL	pop_gset2
    00F2 9508      RET
_LCDDelay:
  TimeCounter          --> R20
  Time                 --> R22
    00F3 D1FE      RCALL	push_gset2
    00F4 01B8      MOVW	R22,R16
FILE: G:\单片机\源程序\串行1602\595_1602_Example\RD_LCD1602B.h
(0001) #ifndef _Use_LCD1602B
(0002) #define _Use_LCD1602B
(0003) /********************************************************
(0004) *  函数库说明:LCD1602B基本驱动函数库                   *
(0005) *  版本:      v2.0                                     *
(0006) *  作者:      傻孩子                                   *
(0007) *  日期:      2005年9月6日                             *
(0008) *  修改:      傻孩子                                   *
(0009) *  修改日期:  2006年1月20日                            *
(0010) *                                                       *
(0011) *  说明:                                               *
(0012) *              1、需要底层硬件驱动函数支持              *
(0013) *                 基本的宏定义:                        *
(0014) *                 LCD_RS   LCD_RW   LCD_E               *
(0015) *                 LCD_SetWriteData  LCD_SetReadData     *
(0016) *                 LCD_SendHalfCharHigh(a)               *
(0017) *                 LCD_SendHalfCharLow(a)                *
(0018) *                 当处于串行状态下时,只定义LCD_RS      *
(0019) *                 LCD_E LCD_LCD_SendHalfCharHigh(a)     *
(0020) *                 LCD_SendHalfCharLow(a)                *
(0021) *              2、自带基本的延时函数。需要外部提供毫秒  *
(0022) *                 单向增加的两个计数器用于特效显示:    *
(0023) *                 FlashTimeCounter  RunTimeCounter      *
(0024) *              3、需要修改引用宏定义来指定底层硬件驱动  *
(0025) *                 函数库。                              *
(0026) *              4、本库驱动下的LCD显示支持1602的各种连   *
(0027) *                 接方法。当使用只写模式是请在引用该头  *
(0028) *                 文件之前加上宏定义:                  *
(0029) *                 # define _Use_LCDOnlyWrite            *
(0030) *              5、在调用本库之前,定义RunStringSpeed可  *
(0031) *                 以设置滚屏的速度。通过在引用前定义    *
(0032) *                 FlashTimeOut 和 FlashGIFTimeOut 可以  *
(0033) *                 改变字符闪烁的频率。                  *
(0034) *              6、增加一个GIF字幕特效函数。             *
(0035) *              7、确定没有LCD复位问题。                 *
(0036) *              8、增加对595串行转并行连接的支持。       *
(0037) *                 需要头文件SerialToCollateral.h        *
(0038) ********************************************************/
(0039) 
(0040) 
(0041) /***********************
(0042) *    系 统 宏 定 义    *
(0043) ***********************/
(0044) 
(0045) /*---------------------*
(0046) *    常 数 宏 定 义    *
(0047) *---------------------*/
(0048) #ifndef True
(0049)     # define True           0x01
(0050) #endif
(0051) #ifndef False
(0052)     # define False          0x00
(0053) #endif
(0054) 
(0055) #ifndef High
(0056)     # define High           0x01
(0057) #endif
(0058) #ifndef Low
(0059)     # define Low            0x00
(0060) #endif
(0061) 
(0062) #ifndef RunStringSpeed
(0063)     # define RunStringSpeed 100
(0064) #endif
(0065) 
(0066) #ifndef FlashTimeOut
(0067)     # define FlashTimeOut   500
(0068) #endif
(0069) #ifndef FlashGIFTimeOut
(0070)     # define FlashGIFTimeOut  1000
(0071) #endif
(0072) 
(0073) # define LCD_Write          0x00
(0074) # define LCD_Read           0x01
(0075) # define LCD_Command        0x00
(0076) # define LCD_Data           0x01
(0077) # define LCD_CMD_Init       0x28
(0078) # define LCD_CMD_DispCtr    0x0c
(0079) # define LCD_CMD_CLS        0x01
(0080) # define LCD_CMD_EnterSet   0x06
(0081) # define LCD_CMD_IconShow   0x0f
(0082) # define LCD_CMD_IconHide   0x0c
(0083) # define LCD_CMD_NotMove    0b00010100
(0084) /*---------------------*
(0085) *    动 作 宏 定 义    *
(0086) *---------------------*/
(0087) 
(0088) #ifndef LCD_SetWriteData
(0089)     # define LCD_SetWriteData
(0090) #endif
(0091) #ifndef LCD_SetReadData
(0092)     # define LCD_SetReadData
(0093) #endif
(0094) #ifndef LCD_RW
(0095)     # define LCD_RW   LCD_Temp 
(0096) #endif
(0097) #ifndef LCD_BF
(0098) 	# define LCD_BF   LCD_Temp
(0099) #endif
(0100) 
(0101) #ifndef _Use_LCD1602B_Serial
(0102)     # define SetReadState       LCD_SetReadData;LCD_RS = LCD_Command;LCD_RW = LCD_Read;
(0103)     # define SetRead            LCD_SetReadData;LCD_RW = LCD_Read;
(0104)     # define SetWrite           LCD_SetWriteData;LCD_RW = LCD_Write;
(0105)     # define SetCommand         LCD_RS = LCD_Command;
(0106)     # define SetData            LCD_RS = LCD_Data;
(0107) #else
(0108)     # define _Use_LCDOnlyWrite
(0109)     # define SetReadState
(0110) 	# define SetRead
(0111) 	# define SetWrite
(0112) 	# define SetCommand         LCD_RS = LCD_Command;refreshVirtualPORT();
(0113) 	# define SetData            LCD_RS = LCD_Data;refreshVirtualPORT();   
(0114) 	# define SetEnable          LCD_E = High;refreshVirtualPORT();
(0115) 	# define SetDisable         LCD_E = Low;refreshVirtualPORT();
(0116) #endif
(0117) 
(0118) # define Print(a)           LCDDisplayString(a);
(0119) # define Locate(x,y)        LCDSetXY(x-1,y-1);
(0120) # define CLS                LCDWaitForReady();LCDSendCommand(LCD_CMD_CLS);LCDWaitForReady();
(0121) # define PrintN(a,b)        LCDDisplayNum((unsigned long)a,b);
(0122) # define ShowIcon           LCDWaitForReady();LCDSendCommand(LCD_CMD_IconShow);LCDWaitForReady();
(0123) # define HideIcon           LCDWaitForReady();LCDSendCommand(LCD_CMD_IconHide);LCDWaitForReady();
(0124) /***********************
(0125) *    全局变量声明区    *
(0126) ***********************/
(0127) const char CHR[16] = {'0','1','2','3','4','5','6','7','8'
(0128)                      ,'9','a','b','c','d','e','f'};
(0129) extern unsigned int FlashTimeCounter;
(0130) extern unsigned int RunTimeCounter;
(0131) extern unsigned int FlashGIFStringCounter;
(0132) char LCD_Temp = 0;
(0133) /***********************
(0134) *    系统函数声明区    *
(0135) ***********************/
(0136) void LCDInit(void);
(0137) void LCDSendCommand(char Command);
(0138) void LCDSendData(char Data);
(0139) void LCDWaitForReady(void);
(0140) void LCDSetXY(char X,char Y);
(0141) void LCDDisplayString(char *String);
(0142) void LCDDisplayNum(unsigned long Num,char BitCount);
(0143) void LCDDelay(unsigned int Time);
(0144) void LCDDelayUs(unsigned int Time);
(0145) void RunString(char *String,char Direction,char Y,char StartX,char EndX);
(0146) void Flash(char *String,char Icon,char X,char Y);
(0147) char StringLength(char *String);
(0148) void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
(0149) #ifdef _Use_LCD1602B_Serial
(0150)     extern void refreshVirtualPORT(void);
(0151) #endif
(0152) /********************************************************
(0153) *  函数说明:LCD驱动类毫秒延时函数                      *
(0154) *  输入:    需要延时的大体毫秒数                       *
(0155) ********************************************************/
(0156) void LCDDelay(unsigned int Time)
(0157) {
(0158)     unsigned int TimeCounter = 0;
    00F5 2744      CLR	R20
    00F6 2755      CLR	R21
(0159) 	
(0160) 	for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
    00F7 C005      RJMP	0x00FD
(0161) 	{
(0162) 	    LCDDelayUs(255);
    00F8 EF0F      LDI	R16,0xFF
    00F9 E010      LDI	R17,0
    00FA D007      RCALL	_LCDDelayUs
    00FB 5F4F      SUBI	R20,0xFF
    00FC 4F5F      SBCI	R21,0xFF
    00FD 1746      CP	R20,R22
    00FE 0757      CPC	R21,R23
    00FF F3C0      BCS	0x00F8
    0100 D1E7      RCALL	pop_gset2
    0101 9508      RET
_LCDDelayUs:
  TimeCounter          --> R20
  Time                 --> R16
    0102 D1F1      RCALL	push_gset1
(0163) 	}
(0164) }
(0165) 
(0166) /********************************************************
(0167) *  函数说明:LCD驱动指令周期延时函数                    *
(0168) *  输入:    需要大体延时Us数                           *
(0169) ********************************************************/
(0170) void LCDDelayUs(unsigned int Time)
(0171) {
(0172)      unsigned int TimeCounter = 0;
    0103 2744      CLR	R20
    0104 2755      CLR	R21
(0173) 	 for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
    0105 C003      RJMP	0x0109
(0174) 	 {
(0175) 	     asm("nop");
    0106 0000      NOP
    0107 5F4F      SUBI	R20,0xFF
    0108 4F5F      SBCI	R21,0xFF
    0109 1740      CP	R20,R16
    010A 0751      CPC	R21,R17
    010B F3D0      BCS	0x0106
    010C D1EA      RCALL	pop_gset1
    010D 9508      RET
(0176) 	 }
(0177) }
(0178) 
(0179) /********************************************************
(0180) *  函数说明:LCD初始化函数                              *
(0181) ********************************************************/
(0182) void LCDInit(void)
(0183) {
(0184)     LCDDelay(15);
_LCDInit:
    010E E00F      LDI	R16,0xF
    010F E010      LDI	R17,0
    0110 DFE2      RCALL	_LCDDelay
(0185) 	
(0186) 	LCDWaitForReady();
    0111 D050      RCALL	_LCDWaitForReady
(0187) 	LCDSendCommand(LCD_CMD_Init);
    0112 E208      LDI	R16,0x28
    0113 D00C      RCALL	_LCDSendCommand
(0188) 	
(0189) 	LCDWaitForReady();
    0114 D04D      RCALL	_LCDWaitForReady
(0190) 	LCDSendCommand(LCD_CMD_DispCtr);
    0115 E00C      LDI	R16,0xC
    0116 D009      RCALL	_LCDSendCommand
(0191) 	
(0192) 	LCDWaitForReady();
    0117 D04A      RCALL	_LCDWaitForReady
(0193) 	LCDSendCommand(LCD_CMD_CLS);
    0118 E001      LDI	R16,1
    0119 D006      RCALL	_LCDSendCommand
(0194) 	LCDDelay(2);
    011A E002      LDI	R16,2
    011B E010      LDI	R17,0
    011C DFD6      RCALL	_LCDDelay
(0195) 	LCDSendCommand(LCD_CMD_EnterSet);
    011D E006      LDI	R16,6
    011E D001      RCALL	_LCDSendCommand
    011F 9508      RET
_LCDSendCommand:
  Command              --> R20
    0120 D1D3      RCALL	push_gset1
    0121 2F40      MOV	R20,R16
    0122 D206      RCALL	<created procedures>
(0196) 	
(0197) }
(0198) #ifndef _Use_LCD1602B_Serial
(0199) /********************************************************
(0200) *  函数说明:向LCD发送指令函数                          *
(0201) *  输入:    需要发送的指令                             *
(0202) ********************************************************/
(0203) void LCDSendCommand(char Command)
(0204) {
(0205) 	SetWrite;
(0206) 	SetCommand;
(0207) 	{
(0208) 	    LCD_E = High;
(0209) 		
(0210) 		LCD_SendHalfCharHigh(Command);
(0211) 		
(0212) 	    LCD_E = Low;
(0213) 	}
(0214) 	{
(0215) 	    LCD_E = High;
(0216) 		
(0217)         LCD_SendHalfCharLow(Command);	
(0218) 		
(0219) 		LCD_E = Low;
(0220) 	}
(0221)     SetRead;		
(0222) 	SetCommand;
(0223) }
(0224) 
(0225) /********************************************************
(0226) *  函数说明:向LCD发送数据函数                          *
(0227) ********************************************************/
(0228) void LCDSendData(char Data)
(0229) {
(0230)     SetWrite;
(0231) 	SetData;
(0232) 	{
(0233) 	    LCD_E = High;
(0234) 		
(0235) 		LCD_SendHalfCharHigh(Data);
(0236) 		
(0237) 	    LCD_E = Low;
(0238) 	}
(0239) 
(0240) 	{
(0241) 	    LCD_E = High;
(0242) 		
(0243)         LCD_SendHalfCharLow(Data);	
(0244) 		
(0245) 		LCD_E = Low;
(0246) 	}
(0247)     SetRead;		
(0248) 	SetCommand;
(0249) }
(0250) 
(0251) /********************************************************
(0252) *  函数说明:等待LCD空闲状态函数                        *
(0253) ********************************************************/
(0254) void LCDWaitForReady(void)
(0255) {
(0256) #ifdef _Use_LCDOnlyWrite
(0257) 	LCDDelayUs(30);
(0258) #else
(0259) 	
(0260) 	SetRead;
(0261) 	SetCommand;
(0262)    
(0263)     LCD_E = High;   
(0264)     
(0265) 	while (LCD_BF == Enable);   //RW=1,读PD7,为0表示空闲;
(0266)    
(0267)     LCD_E = Low;
(0268) 	
(0269) #endif
(0270) }
(0271) #else
(0272) 
(0273) /********************************************************
(0274) *  函数说明:向LCD发送指令函数                          *
(0275) *  输入:    需要发送的指令                             *
(0276) ********************************************************/
(0277) void LCDSendCommand(char Command)
(0278) {
(0279) 	SetCommand;
    0123 7E8F      ANDI	R24,0xEF
    0124 8380      STD	Z+0,R24
    0125 DF95      RCALL	_refreshVirtualPORT
    0126 D202      RCALL	<created procedures>
(0280) 	{
(0281) 	    SetEnable;
    0127 6280      ORI	R24,0x20
    0128 8380      STD	Z+0,R24
    0129 DF91      RCALL	_refreshVirtualPORT
    012A D20A      RCALL	0x0335
(0282) 		
(0283) 		LCD_SendHalfCharHigh(Command);
    012B DF8F      RCALL	_refreshVirtualPORT
    012C D1FC      RCALL	<created procedures>
(0284) 		
(0285) 	    SetDisable;
    012D 7D8F      ANDI	R24,0xDF
    012E 8380      STD	Z+0,R24
    012F DF8B      RCALL	_refreshVirtualPORT
    0130 D1F8      RCALL	<created procedures>
(0286) 	}
(0287) 	{
(0288) 	    SetEnable;
    0131 6280      ORI	R24,0x20
    0132 8380      STD	Z+0,R24
    0133 DF87      RCALL	_refreshVirtualPORT
    0134 D215      RCALL	0x034A
    0135 D20D      RCALL	0x0343
(0289) 		
(0290)         LCD_SendHalfCharLow(Command);	
    0136 DF84      RCALL	_refreshVirtualPORT
    0137 D1F1      RCALL	<created procedures>
(0291) 		
(0292) 		SetDisable;

⌨️ 快捷键说明

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