📄 128_lcd.lst
字号:
__start:
__text_start:
07E7 EFCF LDI R28,0xFF
07E8 E1D0 LDI R29,0x10
07E9 BFCD OUT 0x3D,R28
07EA BFDE OUT 0x3E,R29
07EB 51C0 SUBI R28,0x10
07EC 40D0 SBCI R29,0
07ED EA0A LDI R16,0xAA
07EE 8308 STD Y+0,R16
07EF 2400 CLR R0
07F0 E4E8 LDI R30,0x48
07F1 E0F1 LDI R31,1
07F2 E015 LDI R17,5
07F3 35E2 CPI R30,0x52
07F4 07F1 CPC R31,R17
07F5 F011 BEQ 0x07F8
07F6 9201 ST R0,Z+
07F7 CFFB RJMP 0x07F3
07F8 8300 STD Z+0,R16
07F9 E8E6 LDI R30,0x86
07FA E0FF LDI R31,0xF
07FB E0A0 LDI R26,0
07FC E0B1 LDI R27,1
07FD E01F LDI R17,0xF
07FE 3CEE CPI R30,0xCE
07FF 07F1 CPC R31,R17
0800 F021 BEQ 0x0805
0801 95C8 LPM
0802 9631 ADIW R30,1
0803 920D ST R0,X+
0804 CFF9 RJMP 0x07FE
0805 940E087D CALL _main
_exit:
0807 CFFF RJMP _exit
FILE: G:\IccPro\mega128_lcd\lcmdisp.c
(0001) /****************************************************************************************
(0002) * 文件名:LCMDISP.C
(0003) * 功能:GUI测试及演示程序。
(0004) * 作者:黄绍斌
(0005) * 日期:2003.09.09
(0006) ****************************************************************************************/
(0007) #include "config.h"
(0008)
(0009)
(0010) // 一个单色图标的数据,宽度x高度=40x40
(0011) uint8 const ICO1[] =
(0012) {
(0013) 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
(0014) 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x07,0x00,0xE0,0x00,0x00,0x18,
(0015) 0x00,0x18,0x00,0x00,0x30,0x00,0x0C,0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x80,0x00,
(0016) 0x01,0x00,0x01,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0xC0,0x02,0x01,0x81,0x80,
(0017) 0x40,0x04,0x03,0xC3,0xC0,0x20,0x04,0x03,0xC3,0xC0,0x20,0x04,0x03,0xC3,0xC0,0x20,
(0018) 0x08,0x03,0xC3,0xC0,0x10,0x08,0x03,0xC3,0xC0,0x10,0x08,0x01,0x81,0x80,0x10,0x08,
(0019) 0x08,0x00,0x10,0x10,0x08,0x08,0x00,0x10,0x10,0x08,0x10,0x00,0x08,0x10,0x08,0xF0,
(0020) 0x00,0x0F,0x10,0x08,0x08,0x00,0x10,0x10,0x04,0x04,0x00,0x20,0x20,0x04,0x06,0x00,
(0021) 0x60,0x20,0x04,0x03,0x81,0xC0,0x20,0x02,0x01,0x7E,0x80,0x40,0x03,0x00,0x81,0x00,
(0022) 0xC0,0x01,0x00,0x42,0x00,0x80,0x00,0x80,0x3C,0x01,0x00,0x00,0x40,0x00,0x02,0x00,
(0023) 0x00,0x30,0x00,0x0C,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x07,0x00,0xE0,0x00,0x00,
(0024) 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
(0025) 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
(0026) };
(0027) unsigned char KeyNew,KeyDown;
(0028) char* p;
(0029) // 样条曲线的4个端点
(0030) PointXY log_pin[] = { {40, 30},
(0031) {60, 60},
(0032) {80, 30},
(0033) {100, 60}
(0034) };
(0035)
(0036) // 封闭多边形的各个顶点
(0037) uint32 const poly6[] = {750,55, 85,40, 90,45, 100,42, 115,55, 75,55};
(0038) unsigned char hz0[]= //韩
(0039)
(0040) {
(0041) 0x10, 0x20, 0x10, 0x20, 0xfd, 0xfe, 0x10, 0x20, 0x7c, 0x20, 0x44, 0xfc, 0x7c, 0x20, 0x44, 0x20,
(0042) 0x7d, 0xfe, 0x10, 0x22, 0xfe, 0x22, 0x10, 0x22, 0x10, 0x2a, 0x10, 0x24, 0x10, 0x20, 0x10, 0x20
(0043)
(0044) };
(0045)
(0046) WINDOWS *first_win;
(0047)
(0048) void Port_Init()
(0049) {
(0050) PORTD = 0XFF;
_Port_Init:
0808 EF8F LDI R24,0xFF
0809 BB82 OUT 0x12,R24
(0051) DDRD = 0XFF;
080A BB81 OUT 0x11,R24
(0052) PORTB = 0XFF;
080B BB88 OUT 0x18,R24
(0053) DDRB = 0X00;
080C 2422 CLR R2
080D BA27 OUT 0x17,R2
(0054) PORTF = 0x00;
080E 92200062 STS 0x62,R2
(0055) DDRF = 0x1F;
0810 E18F LDI R24,0x1F
0811 93800061 STS 0x61,R24
(0056) PORTE = 0x0F;
0813 E08F LDI R24,0xF
0814 B983 OUT 0x03,R24
(0057) DDRE = 0x00;
0815 B822 OUT 0x02,R2
0816 9508 RET
(0058) }
(0059) //call this routine to initialize all peripherals
(0060) void init_devices(void)
(0061) {
(0062) //stop errant interrupts until set up
(0063) CLI(); //disable all interrupts
_init_devices:
0817 94F8 BCLR 7
(0064) XDIV = 0x00; //xtal divider
0818 2422 CLR R2
0819 BE2C OUT 0x3C,R2
(0065) XMCRA = 0x00; //external memory
081A 9220006D STS 0x6D,R2
(0066) Port_Init();
081C DFEB RCALL _Port_Init
(0067)
(0068) MCUCR = 0x00;
081D 2422 CLR R2
081E BE25 OUT 0x35,R2
(0069) EICRA = 0x00; //extended ext ints
081F 9220006A STS 0x6A,R2
(0070) EICRB = 0x00; //extended ext ints
0821 BE2A OUT 0x3A,R2
(0071) EIMSK = 0x00;
0822 BE29 OUT 0x39,R2
(0072) TIMSK = 0x00; //timer interrupt sources
0823 BE27 OUT 0x37,R2
(0073) ETIMSK = 0x00; //extended timer interrupt sources
0824 9220007D STS 0x7D,R2
(0074) SEI(); //re-enable interrupts
0826 9478 BSET 7
0827 9508 RET
_key_scan:
shift --> Y+1
j --> Y+1
i --> R20
0828 940E3BA9 CALL push_gset1
(0075) //all peripherals are now initialized
(0076) }
(0077) void key_scan(void)
(0078) {
(0079) unsigned char i,j,shift;
(0080)
(0081) //if (key_scan_begin==0) return;
(0082) //key_scan_begin=0;
(0083) PORTE|=0X0f;//UP PULL
082A B183 IN R24,0x03
082B 608F ORI R24,0xF
082C B983 OUT 0x03,R24
(0084) PORTF|=0x1f;//OUT
082D 91800062 LDS R24,0x62
082F 618F ORI R24,0x1F
0830 93800062 STS 0x62,R24
(0085) for (i=0;i<5;i++)
0832 2744 CLR R20
0833 C020 RJMP 0x0854
(0086) {
(0087) PORTF&=~(1<<i); //键盘线扫描
0834 E001 LDI R16,1
0835 2F14 MOV R17,R20
0836 940E3BE9 CALL lsl8
0838 2E20 MOV R2,R16
0839 9420 COM R2
083A 90300062 LDS R3,0x62
083C 2032 AND R3,R2
083D 92300062 STS 0x62,R3
(0088) //delay_us(1);
(0089) KeyNew=PINE&0x0f;//读取键盘扫描信号,屏蔽高四位PC0~3
083F B181 IN R24,0x01
0840 708F ANDI R24,0xF
0841 9380014D STS KeyNew,R24
(0090) if (KeyNew!=0x0f)//如果有键按下,延时10ms消抖
0843 308F CPI R24,0xF
0844 F071 BEQ 0x0853
(0091) {
(0092) //key_up=0;
(0093) KeyDown = 1;
0845 E081 LDI R24,1
0846 9380014C STS KeyDown,R24
(0094) KeyNew=KeyNew<<4;
0848 9180014D LDS R24,KeyNew
084A 708F ANDI R24,0xF
084B 9582 SWAP R24
084C 9380014D STS KeyNew,R24
(0095) KeyNew=KeyNew|i;//get key scan code
084E 2E28 MOV R2,R24
084F 2A24 OR R2,R20
0850 9220014D STS KeyNew,R2
(0096) return;
0852 C003 RJMP 0x0856
0853 9543 INC R20
0854 3045 CPI R20,5
0855 F2F0 BCS 0x0834
0856 940E3BAC CALL pop_gset1
0858 9508 RET
_Hex2Ascii:
ascii --> Y+0
temp --> R20
h --> R16
0859 940E3BA9 CALL push_gset1
085B 9722 SBIW R28,2
(0097) //putchar(KeyNew);
(0098) }
(0099) //memmove(&key_buf[0],&key_buf[1],KEY_BUF_LEN-1);
(0100) }//for (i=0;i<5;i++)
(0101) }
(0102) Hex2Ascii(unsigned char h)
(0103) {
(0104) unsigned char ascii[2];
(0105) unsigned char temp;
(0106)
(0107) temp = (h&0xf0)>>4;
085C 2F40 MOV R20,R16
085D 7F40 ANDI R20,0xF0
085E 9542 SWAP R20
085F 704F ANDI R20,0xF
(0108) if(temp<0x0a){ascii[0] = temp + 0x30;}
0860 304A CPI R20,0xA
0861 F420 BCC 0x0866
0862 2F84 MOV R24,R20
0863 5D80 SUBI R24,0xD0
0864 8388 STD Y+0,R24
0865 C003 RJMP 0x0869
(0109) else {ascii[0] = temp + 0x37;}
0866 2F84 MOV R24,R20
0867 5C89 SUBI R24,0xC9
0868 8388 STD Y+0,R24
(0110)
(0111) temp = h&0x0f;
0869 2F40 MOV R20,R16
086A 704F ANDI R20,0xF
(0112) if(temp<0x0a){ascii[1] = temp + 0x30;}
086B 304A CPI R20,0xA
086C F420 BCC 0x0871
086D 2F84 MOV R24,R20
086E 5D80 SUBI R24,0xD0
086F 8389 STD Y+1,R24
0870 C003 RJMP 0x0874
(0113) else {ascii[1] = temp + 0x37;}
0871 2F84 MOV R24,R20
0872 5C89 SUBI R24,0xC9
0873 8389 STD Y+1,R24
(0114) p = &ascii[0];
0874 01CE MOVW R24,R28
0875 9390014B STS p+1,R25
0877 9380014A STS p,R24
0879 9622 ADIW R28,2
087A 940E3BAC CALL pop_gset1
087C 9508 RET
_main:
win --> Y+2
087D 972E SBIW R28,0xE
(0115) //return (ascii);
(0116) }
(0117) /***********************************************************************
(0118) * 名称:main()
(0119) * 功能:主程序,用于GUI测试及演示。
(0120) ***********************************************************************/
(0121) main(void)
(0122) {
(0123) WINDOWS win={0, 0, 128, 32,"my", "first" };
087E E68C LDI R24,0x6C
087F E091 LDI R25,1
0880 01FE MOVW R30,R28
0881 9632 ADIW R30,2
0882 E00C LDI R16,0xC
0883 E010 LDI R17,0
0884 93FA ST R31,-Y
0885 93EA ST R30,-Y
0886 939A ST R25,-Y
0887 938A ST R24,-Y
0888 940E3BEF CALL asgncblk
(0124) first_win = &win;
088A 01CE MOVW R24,R28
088B 9602 ADIW R24,2
088C 93900149 STS first_win+1,R25
088E 93800148 STS first_win,R24
(0125) init_devices();
0890 DF86 RCALL _init_devices
(0126)
(0127) GUI_Initialize(); // 初始化LCM
0891 940E0A0F CALL _GUI_Initialize
(0128) GUI_SetColor(1, 0); // 设置前景色及背景色
0893 2722 CLR R18
0894 E001 LDI R16,1
0895 940E2A88 CALL _GUI_SetColor
(0129) //LCD_FillAll(0x01);
(0130) //GUI_LoadPic(0,0, (uint8 *)ICO1, 40, 40); // 显示40×40的图标
(0131) //GUI_Spline(log_pin, 4, 1); // 画样条曲线
(0132) //GUI_LineS(poly6, 6, 1); // 画封闭的多边形
(0133) //GUI_FloodFill(0,0, 1); // 填充多边形
(0134) GUI_PutString(0,0,"09:23 01/10/07"); // 显示字符串
0897 E380 LDI R24,0x30
0898 E091 LDI R25,1
0899 8399 STD Y+1,R25
089A 8388 STD Y+0,R24
089B 2722 CLR R18
089C 2733 CLR R19
089D 2700 CLR R16
089E 2711 CLR R17
089F 940E0EA9 CALL _GUI_PutString
(0135) //GUI_PutChar24_32(48,32,'8');
(0136) //GUI_PutChar8_8(0,0,'8');
(0137) //GUI_PutHZ(0,0,hz0,16,16);
(0138) //GUI_PutNoStr(0,0,"3244",4);
(0139) //GUI_WindowsDraw(first_win);
(0140) //while(1);
(0141) //return(0);
(0142) //GUI_PutChar8_8(0,8,'p');
(0143) //GUI_PutChar8_8(0,16,'m');
(0144) //GUI_PutChar8_8(0,24,'s');
(0145) GUI_DrawBat(86,0,0);
08A1 2422 CLR R2
08A2 2433 CLR R3
08A3 8239 STD Y+1,R3
08A4 8228 STD Y+0,R2
08A5 2722 CLR R18
08A6 2733 CLR R19
08A7 E506 LDI R16,0x56
08A8 E010 LDI R17,0
08A9 940E0D82 CALL _GUI_DrawBat
(0146) GUI_PutChar16_16(0,8,'P');
08AB E580 LDI R24,0x50
08AC 8388 STD Y+0,R24
08AD E028 LDI R18,0x8
08AE E030 LDI R19,0
08AF 2700 CLR R16
08B0 2711 CLR R17
08B1 940E3AB5 CALL _GUI_PutChar16_16
(0147) GUI_PutChar16_16(0,24,'M');
08B3 E48D LDI R24,0x4D
08B4 8388 STD Y+0,R24
08B5 E128 LDI R18,0x18
08B6 E030 LDI R19,0
08B7 2700 CLR R16
08B8 2711 CLR R17
08B9 940E3AB5 CALL _GUI_PutChar16_16
(0148) GUI_PutChar16_16(0,40,'S');
08BB E583 LDI R24,0x53
08BC 8388 STD Y+0,R24
08BD E228 LDI R18,0x28
08BE E030 LDI R19,0
08BF 2700 CLR R16
08C0 2711 CLR R17
08C1 940E3AB5 CALL _GUI_PutChar16_16
08C3 C008 RJMP 0x08CC
(0149)
(0150) while(1)
(0151) {
(0152) key_scan();
08C4 DF63 RCALL _key_scan
(0153) if(KeyDown)
08C5 9020014C LDS R2,KeyDown
08C7 2022 TST R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -