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

📄 testh.lst

📁 薔介绍单片机的彩色液晶显示器开发里程。手把手
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    0CB5 E800      LDI	R16,0x80
    0CB6 E011      LDI	R17,1
    0CB7 FF10      SBRS	R17,0
    0CB8 6400      ORI	R16,0x40
    0CB9 BF05      OUT	0x35,R16
    0CBA EFCF      LDI	R28,0xFF
    0CBB E1D0      LDI	R29,0x10
    0CBC BFCD      OUT	0x3D,R28
    0CBD BFDE      OUT	0x3E,R29
    0CBE 50C8      SUBI	R28,0x8
    0CBF 40D0      SBCI	R29,0
    0CC0 EA0A      LDI	R16,0xAA
    0CC1 8308      STD	Y+0,R16
    0CC2 2400      CLR	R0
    0CC3 EEE9      LDI	R30,0xE9
    0CC4 E1F1      LDI	R31,0x11
    0CC5 E113      LDI	R17,0x13
    0CC6 3CEA      CPI	R30,0xCA
    0CC7 07F1      CPC	R31,R17
    0CC8 F011      BEQ	0x0CCB
    0CC9 9201      ST	R0,Z+
    0CCA CFFB      RJMP	0x0CC6
    0CCB 8300      STD	Z+0,R16
    0CCC E8E0      LDI	R30,0x80
    0CCD E1F8      LDI	R31,0x18
    0CCE E0A0      LDI	R26,0
    0CCF E1B1      LDI	R27,0x11
    0CD0 E119      LDI	R17,0x19
    0CD1 36E9      CPI	R30,0x69
    0CD2 07F1      CPC	R31,R17
    0CD3 F021      BEQ	0x0CD8
    0CD4 95C8      LPM
    0CD5 9631      ADIW	R30,1
    0CD6 920D      ST	R0,X+
    0CD7 CFF9      RJMP	0x0CD1
    0CD8 940E1B1F  CALL	_main
_exit:
    0CDA CFFF      RJMP	_exit
FILE: E:\ais\testh\finalcd.h
(0001) //液晶显示基本函数
(0002) /***********************************************************************
(0003) 公司名称:  泰克通信
(0004) 模 块 名: 液晶显示基本函数                 LCD 型号:NHC-01 
(0005) 创 建 人:        输入输出模块组            日期:2004-03-17
(0006) 修 改 人:        输入输出模块组            日期:2004-03-23 
(0007) 功能描述: 1、液晶的基本读写操作
(0008)            2、画点、线、矩形、圆        
(0009) 其他说明: 本程序在atmag128和nhc-01上调试通过
(0010) 版 本:    alpha 0.01
(0011) **********************************************************************/
(0012) #include "chardata.h"
(0013) #define ada (*(volatile unsigned char*) 0x1118)//外部存储器地址映射,ada是读写地址
(0014) #define adb (*(volatile unsigned char*) 0x111a)//adb是横坐标
(0015) #define adc (*(volatile unsigned char*) 0x1119)//adc是纵坐标
(0016) 
(0017) 
(0018) //延时函数
(0019) void delay_1ms(void);//延时一毫秒
(0020) void delay(unsigned int n);//延时n毫秒
(0021) 
(0022) //液晶读写操作函数
(0023) void write(unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3);//液晶输入程序
(0024) void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3);//读取一个字节位的数据
(0025) 
(0026) //液晶基本的画线、清屏等操作
(0027) void point(unsigned int x,unsigned char y,unsigned char color);// 在任意位置显示一个点的颜色
(0028) void clrall(char color);//清屏操作
(0029) void juxing(char x1,char y1,char x2,char y2,char color);//填充矩形
(0030) void cycle(char x,char y,unsigned int rad,char color);//以(x,y)为圆心,rad为半径,用color填充这个区域
(0031) 
(0032) //画直线算法,包含了两种特殊直线
(0033) void line(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)两点间画直线
(0034) void linex(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)两点间画直线(画船专用直线,可以不覆盖掉经维度线)
(0035) void xuline(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)两点间画虚线
(0036) 
(0037) //液晶上的汉字、字符显示
(0038) void hz_write(char x,char y,const unsigned char *hz,char color);//将输入的黑白格式转换为给lcd可以识别的彩色字模,这里的X值为点的位横作标其值为0~39
(0039) void hanzi(char x,char y,const unsigned char *hz,char color,char bs);//按照列位置显示任意大小颜色的字符,这里的X值为点的位横作标其值为0~39
(0040) void lettershow(char x,char y,char *hz,char color);//按照列位置显示任意大小颜色的字符,这里的X值为点的位横作标其值为0~39
(0041) void showchar(char x,char y,char a,char letter,char color);//在任意位置显示a所表示的值,这里的X值为点的位横作标其值为0~39
(0042) void showchars(char x,char y,char *a,char color);//在任意位置显示字符串a所表示的值,这里的X值为点的位横作标其值为0~39
(0043) void showsmallmun(char x,char y,char *a,char color);//显示4*8的数字串,这里的X值为点的位横作标其值为0~39
(0044) void showallhz(void);//显示液晶上所有的汉字
(0045) 
(0046) 
(0047) /******液晶的基本输入输出,一次写入或读出横向八个点*******/
(0048) 
(0049) void write (unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3)
(0050) { 
(0051)    
(0052)    DDRA=0xff;//a口为输出,即向外部输出数据
_write:
  buffer3              --> Y+4
  buffer2              --> Y+2
  buffer1              --> Y+0
  y                    --> R18
  x                    --> R16
    0CDB EF8F      LDI	R24,0xFF
    0CDC BB8A      OUT	0x1A,R24
(0053)    adb=x;//向外部存储器送横作标地址0~39
    0CDD 9300111A  STS	0x111A,R16
(0054)    adc=y;//向外部存储器送纵作标地址0~239
    0CDF 93201119  STS	0x1119,R18
(0055)    ada=buffer1;//向该点阵写入三个颜色值
    0CE1 8008      LDD	R0,Y+0
    0CE2 92001118  STS	0x1118,R0
(0056)    ada=buffer2;
    0CE4 800A      LDD	R0,Y+2
    0CE5 92001118  STS	0x1118,R0
(0057)    ada=buffer3;
    0CE7 800C      LDD	R0,Y+4
    0CE8 92001118  STS	0x1118,R0
    0CEA 9508      RET
(0058) }
(0059) 
(0060) void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3)
(0061) {
(0062)    DDRA=0x00;//a口为输入,即读取外部数据
_read:
  b3                   --> Y+4
  b2                   --> Y+2
  b1                   --> Y+0
  y                    --> R18
  x                    --> R16
    0CEB 2422      CLR	R2
    0CEC BA2A      OUT	0x1A,R2
(0063)    adb=x;
    0CED 9300111A  STS	0x111A,R16
(0064)    adc=y;
    0CEF 93201119  STS	0x1119,R18
(0065)    *b1=ada;//将该点阵的三个颜色值分别读取出来
    0CF1 90201118  LDS	R2,0x1118
    0CF3 81E8      LDD	R30,Y+0
    0CF4 81F9      LDD	R31,Y+1
    0CF5 8220      STD	Z+0,R2
(0066)    *b2=ada;
    0CF6 90201118  LDS	R2,0x1118
    0CF8 81EA      LDD	R30,Y+2
    0CF9 81FB      LDD	R31,Y+3
    0CFA 8220      STD	Z+0,R2
(0067)    *b3=ada;
    0CFB 90201118  LDS	R2,0x1118
    0CFD 81EC      LDD	R30,Y+4
    0CFE 81FD      LDD	R31,Y+5
    0CFF 8220      STD	Z+0,R2
    0D00 9508      RET
_point:
  buffer3              --> Y+8
  buffer2              --> Y+7
  temp                 --> R12
  buffer1              --> Y+6
  color                --> R10
  y                    --> R22
  x                    --> R20
    0D01 940E1CE3  CALL	push_gset4
    0D03 2F62      MOV	R22,R18
    0D04 01A8      MOVW	R20,R16
    0D05 9729      SBIW	R28,0x9
    0D06 88A9      LDD	R10,Y+17
(0068) }
(0069) 
(0070) /**************画任意坐标上的一个点*******************/
(0071) void point(unsigned int x,unsigned char y,unsigned char color)
(0072) {       unsigned int temp;
(0073)         char buffer1,buffer2,buffer3;
(0074)         temp=x%8;//判断该点是属于该字节位的第几个点
    0D07 01CA      MOVW	R24,R20
    0D08 7087      ANDI	R24,7
    0D09 7090      ANDI	R25,0
    0D0A 016C      MOVW	R12,R24
(0075)         x=x/8;
    0D0B 011A      MOVW	R2,R20
    0D0C 9436      LSR	R3
    0D0D 9427      ROR	R2
    0D0E 9436      LSR	R3
    0D0F 9427      ROR	R2
    0D10 9436      LSR	R3
    0D11 9427      ROR	R2
    0D12 01A1      MOVW	R20,R2
(0076)         read((char)x,y,&buffer1,&buffer2,&buffer3);
    0D13 01CE      MOVW	R24,R28
    0D14 9608      ADIW	R24,0x8
    0D15 839D      STD	Y+5,R25
    0D16 838C      STD	Y+4,R24
    0D17 01CE      MOVW	R24,R28
    0D18 9607      ADIW	R24,7
    0D19 839B      STD	Y+3,R25
    0D1A 838A      STD	Y+2,R24
    0D1B 01CE      MOVW	R24,R28
    0D1C 9606      ADIW	R24,6
    0D1D 8399      STD	Y+1,R25
    0D1E 8388      STD	Y+0,R24
    0D1F 2F26      MOV	R18,R22
    0D20 2D02      MOV	R16,R2
    0D21 DFC9      RCALL	_read
(0077) 
(0078) 	if(temp==0)//该字节位的第一个点,将buffer1最高三位修改为color的值
    0D22 20CC      TST	R12
    0D23 F479      BNE	0x0D33
    0D24 20DD      TST	R13
    0D25 F469      BNE	0x0D33
(0079) 	   {  
(0080) 	      buffer1 &= 0x1f;
    0D26 818E      LDD	R24,Y+6
    0D27 718F      ANDI	R24,0x1F
    0D28 838E      STD	Y+6,R24
(0081) 	      buffer1 |=(color<<5);
    0D29 2C2A      MOV	R2,R10
    0D2A 0C22      LSL	R2
    0D2B 0C22      LSL	R2
    0D2C 0C22      LSL	R2
    0D2D 0C22      LSL	R2
    0D2E 0C22      LSL	R2
    0D2F 2E38      MOV	R3,R24
    0D30 2832      OR	R3,R2
    0D31 823E      STD	Y+6,R3
(0082) 	   }
    0D32 C07F      RJMP	0x0DB2
(0083) 	else if (temp==1)//该字节位的第2个点,将buffer1的3、4、5三位修改为color的值
    0D33 01C6      MOVW	R24,R12
    0D34 3081      CPI	R24,1
    0D35 E0E0      LDI	R30,0
    0D36 079E      CPC	R25,R30
    0D37 F451      BNE	0x0D42
(0084) 	   {
(0085) 	      buffer1 &= 0xe3;
    0D38 818E      LDD	R24,Y+6
    0D39 7E83      ANDI	R24,0xE3
    0D3A 838E      STD	Y+6,R24
(0086) 	      buffer1 |=(color<<2);
    0D3B 2C2A      MOV	R2,R10
    0D3C 0C22      LSL	R2
    0D3D 0C22      LSL	R2
    0D3E 2E38      MOV	R3,R24
    0D3F 2832      OR	R3,R2
    0D40 823E      STD	Y+6,R3
(0087) 	   }
    0D41 C070      RJMP	0x0DB2
(0088) 	else if (temp==2)//该字节位的第3个点,将buffer1最低2位和buffer2的最高位修改为color的值
    0D42 01C6      MOVW	R24,R12
    0D43 3082      CPI	R24,2
    0D44 E0E0      LDI	R30,0
    0D45 079E      CPC	R25,R30
    0D46 F4B9      BNE	0x0D5E
(0089) 	   {
(0090) 	      buffer1 &= 0xfc;
    0D47 818E      LDD	R24,Y+6
    0D48 7F8C      ANDI	R24,0xFC
    0D49 838E      STD	Y+6,R24
(0091) 	      buffer1 |=(color>>1);
    0D4A 2C2A      MOV	R2,R10
    0D4B 9426      LSR	R2
    0D4C 2E38      MOV	R3,R24
    0D4D 2832      OR	R3,R2
    0D4E 823E      STD	Y+6,R3
(0092) 	      buffer2 &= 0x7f;
    0D4F 818F      LDD	R24,Y+7
    0D50 778F      ANDI	R24,0x7F
    0D51 838F      STD	Y+7,R24
(0093) 	      buffer2 |=(color<<7);
    0D52 2C2A      MOV	R2,R10
    0D53 0C22      LSL	R2
    0D54 0C22      LSL	R2
    0D55 0C22      LSL	R2
    0D56 0C22      LSL	R2
    0D57 0C22      LSL	R2
    0D58 0C22      LSL	R2
    0D59 0C22      LSL	R2
    0D5A 2E38      MOV	R3,R24
    0D5B 2832      OR	R3,R2
    0D5C 823F      STD	Y+7,R3
(0094) 	   }
    0D5D C054      RJMP	0x0DB2
(0095) 	else if (temp==3)//该字节位的第4个点,将buffer2的5、6、7三位修改为color的值
    0D5E 01C6      MOVW	R24,R12
    0D5F 3083      CPI	R24,3
    0D60 E0E0      LDI	R30,0
    0D61 079E      CPC	R25,R30
    0D62 F451      BNE	0x0D6D
(0096) 	   {
(0097) 	      buffer2 &= 0x8f;
    0D63 818F      LDD	R24,Y+7
    0D64 788F      ANDI	R24,0x8F
    0D65 838F      STD	Y+7,R24
(0098) 	      buffer2 |=(color<<4);
    0D66 2D8A      MOV	R24,R10
    0D67 708F      ANDI	R24,0xF
    0D68 9582      SWAP	R24
    0D69 802F      LDD	R2,Y+7
    0D6A 2A28      OR	R2,R24
    0D6B 822F      STD	Y+7,R2
(0099) 	   }
    0D6C C045      RJMP	0x0DB2
(0100) 	else if (temp==4)//该字节位的第5个点,将buffer2的2、3、4三位修改为color的值
    0D6D 01C6      MOVW	R24,R12
    0D6E 3084      CPI	R24,4
    0D6F E0E0      LDI	R30,0
    0D70 079E      CPC	R25,R30
    0D71 F449      BNE	0x0D7B
(0101) 	   {
(0102) 	      buffer2 &= 0xf1;
    0D72 818F      LDD	R24,Y+7
    0D73 7F81      ANDI	R24,0xF1
    0D74 838F      STD	Y+7,R24
(0103) 	      buffer2 |=(color<<1);
    0D75 2C2A      MOV	R2,R10
    0D76 0C22      LSL	R2
    0D77 2E38      MOV	R3,R24
    0D78 2832      OR	R3,R2
    0D79 823F      STD	Y+7,R3
(0104) 	   }
    0D7A C037      RJMP	0x0DB2
(0105) 	else if (temp==5)//该字节位的第6个点,将buffer2最低位和buffer3的最高两位修改为color的值
    0D7B 01C6      MOVW	R24,R12
    0D7C 3085      CPI	R24,5
    0D7D E0E0      LDI	R30,0
    0D7E 079E      CPC	R25,R30
    0D7F F4B9      BNE	0x0D97
(0106) 	   {
(0107) 	      buffer2 &= 0xfe;
    0D80 818F      LDD	R24,Y+7
    0D81 7F8E      ANDI	R24,0xFE
    0D82 838F      STD	Y+7,R24
(0108) 	      buffer2 |=(color>>2);
    0D83 2C2A      MOV	R2,R10
    0D84 9426      LSR	R2
    0D85 9426      LSR	R2
    0D86 2E38      MOV	R3,R24
    0D87 2832      OR	R3,R2
    0D88 823F      STD	Y+7,R3
(0109) 	      buffer3 &= 0x3f;
    0D89 8588      LDD	R24,Y+8
    0D8A 738F      ANDI	R24,0x3F
    0D8B 8788      STD	Y+8,R24
(0110) 	      buffer3 |=(color<<6);
    0D8C 2C2A      MOV	R2,R10
    0D8D 0C22      LSL	R2
    0D8E 0C22      LSL	R2
    0D8F 0C22      LSL	R2
    0D90 0C22      LSL	R2
    0D91 0C22      LSL	R2
    0D92 0C22      LSL	R2
    0D93 2E38      MOV	R3,R24
    0D94 2832      OR	R3,R2
    0D95 8638      STD	Y+8,R3
(0111) 	   }
    0D96 C01B      RJMP	0x0DB2
(0112) 	else if (temp==6)//该字节位的第7个点,将buffer3的4、5、6三位修改为color的值
    0D97 01C6      MOVW	R24,R12
    0D98 3086      CPI	R24,6
    0D99 E0E0      LDI	R30,0
    0D9A 079E      CPC	R25,R30
    0D9B F459      BNE	0x0DA7
(0113) 	   {
(0114) 	      buffer3 &= 0xc7;
    0D9C 8588      LDD	R24,Y+8
    0D9D 7C87      ANDI	R24,0xC7
    0D9E 8788      STD	Y+8,R24
(0115) 	      buffer3 |=(color<<3);
    0D9F 2C2A      MOV	R2,R10
    0DA0 0C22      LSL	R2
    0DA1 0C22      LSL	R2
    0DA2 0C22      LSL	R2
    0DA3 2E38      MOV	R3,R24
    0DA4 2832      OR	R3,R2
    0DA5 8638      STD	Y+8,R3
(0116) 	   }
    0DA6 C00B      RJMP	0x0DB2
(0117) 	else if (temp==7)//该字节位的第8个点,将buffer3最低三位修改为color的值
    0DA7 01C6      MOVW	R24,R12
    0DA8 3087      CPI	R24,7
    0DA9 E0E0      LDI	R30,0
    0DAA 079E      CPC	R25,R30
    0DAB F431      BNE	0x0DB2
(0118) 	   {
(0119) 	      buffer3 &= 0xf8;
    0DAC 8588      LDD	R24,Y+8
    0DAD 7F88      ANDI	R24,0xF8
    0DAE 8788      STD	Y+8,R24
(0120) 	      buffer3 |= color;
    0DAF 2E28      MOV	R2,R24
    0DB0 282A      OR	R2,R10
    0DB1 8628      STD	Y+8,R2
(0121) 	   }
(0122)         write ((char)x,y,buffer1,buffer2,buffer3);
    0DB2 8428      LDD	R2,Y+8
    0DB3 822C      STD	Y+4,R2
    0DB4 802F      LDD	R2,Y+7
    0DB5 822A      STD	Y+2,R2
    0DB6 802E      LDD	R2,Y+6
    0DB7 8228      STD	Y+0,R2
    0DB8 2F26      MOV	R18,R22
    0DB9 2F04      MOV	R16,R20
    0DBA DF20      RCALL	_write
    0DBB 9629      ADIW	R28,0x9
    0DBC 940E1CBE  CALL	pop_gset4
    0DBE 9508      RET
_clrall:
  buffer3              --> R20
  buffer1              --> R22
  buffer2              --> R10
  i                    --> R12
  j                    --> R14
  color                --> R12
    0DBF 940E1CE7  CALL	push_gset5
    0DC1 2EC0      MOV	R12,R16
    0DC2 9725      SBIW	R28,5
(0123) }
(0124) 
(0125) 
(0126) 
(0127) /*********************用某种颜色清屏**************/
(0128) 
(0129) 
(0130) void clrall(char color)
(0131) {
(0132)       char buffer1=0,buffer2=0,buffer3=0;
    0DC3 2766      CLR	R22

⌨️ 快捷键说明

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