📄 testh.lst
字号:
__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 + -