📄 写字库.lst
字号:
__start:
__text_start:
004D E5CF LDI R28,0x5F
004E E0D4 LDI R29,4
004F BFCD OUT 0x3D,R28
0050 BFDE OUT 0x3E,R29
0051 51CE SUBI R28,0x1E
0052 40D0 SBCI R29,0
0053 EA0A LDI R16,0xAA
0054 8308 STD Y+0,R16
0055 2400 CLR R0
0056 E9E3 LDI R30,0x93
0057 E0F0 LDI R31,0
0058 E010 LDI R17,0
0059 39EE CPI R30,0x9E
005A 07F1 CPC R31,R17
005B F011 BEQ 0x005E
005C 9201 ST R0,Z+
005D CFFB RJMP 0x0059
005E 8300 STD Z+0,R16
005F E6E7 LDI R30,0x67
0060 E0F0 LDI R31,0
0061 E6A0 LDI R26,0x60
0062 E0B0 LDI R27,0
0063 E010 LDI R17,0
0064 39EA CPI R30,0x9A
0065 07F1 CPC R31,R17
0066 F021 BEQ 0x006B
0067 95C8 LPM
0068 9631 ADIW R30,1
0069 920D ST R0,X+
006A CFF9 RJMP 0x0064
006B D2A2 RCALL _main
_exit:
006C CFFF RJMP _exit
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\写字库程序\disp_key.h
(0001) /*********************************************
(0002) *显示键盘头文件
(0003) *支持SPI显示键盘模块
(0004)
(0005)
(0006) SPI接口显示键盘:
(0007) PB0: 键盘
(0008) PB1: RCK
(0009) PB2: SCK
(0010) PB3: DATA
(0011)
(0012) *********************************************/
(0013)
(0014)
(0015) /***************************************************
(0016) 头文件申明
(0017) ****************************************************/
(0018) //#include<iom16v.h>
(0019) //#include <macros.h>
(0020)
(0021) //显示
(0022) const char DISCODE[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0023) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x63};
(0024) char Disp_Buff[]={0,0,0,0,0,0,0,0};
(0025) char disp_key_count =0; //LED扫描计数
(0026) int disp_code =0;
(0027) unsigned int time_count_sys =0; //系统时间计数,1ms为单位
(0028) //按键
(0029) char key_num =0;
(0030) char old_key_num =0;
(0031) char new_key_num =0;
(0032) char key_buff[] ={0,0,0,0,0,0,0,0};
(0033) int key_down_time =1;
(0034) char key_delay =0;
(0035) //基本全局变量
(0036) unsigned int delay_time_count =0;
(0037) //*****************************************************************************
(0038) //按键显示
(0039) void Disp_key_group(void);
(0040) void disp_bit(char disCodeIndex,char bitChoose);
(0041) void send_data_disp(unsigned char send_data);
(0042) void Key_num(void);
(0043) void delay(unsigned int n);
(0044) //****************************************
(0045) /* ms精确延时函数 */
(0046) void delay(unsigned int n)
(0047) {//延时
(0048) delay_time_count =n;
_delay:
n --> R16
006D 9310007C STS delay_time_count+1,R17
006F 9300007B STS delay_time_count,R16
(0049) while(delay_time_count >0);
0071 940E043B CALL 0x43B
0073 F7E9 BNE 0x0071
0074 2033 TST R3
0075 F7D9 BNE 0x0071
0076 9508 RET
_disp_bit:
bitChoose --> R22
disCodeIndex --> R20
0077 D32B RCALL push_gset2
0078 2F62 MOV R22,R18
0079 2F40 MOV R20,R16
(0050) }
(0051) /* 显示函数 */
(0052) void disp_bit(char disCodeIndex,char bitChoose) //按位显示
(0053) {
(0054) PORTB &=0B11111101; //RCK送底电平
007A B388 IN R24,0x18
007B 7F8D ANDI R24,0xFD
007C BB88 OUT 0x18,R24
(0055) send_data_disp(bitChoose); //送位选
007D 2F06 MOV R16,R22
007E D00B RCALL _send_data_disp
(0056) send_data_disp(DISCODE[disCodeIndex]); //送段码
007F E584 LDI R24,0x54
0080 E090 LDI R25,0
0081 2FE4 MOV R30,R20
0082 27FF CLR R31
0083 0FE8 ADD R30,R24
0084 1FF9 ADC R31,R25
0085 9104 LPM R16,0(Z)
0086 D003 RCALL _send_data_disp
(0057) PORTB |=0B00000010; //RCK送高电平
0087 9AC1 SBI 0x18,1
0088 D312 RCALL pop_gset2
0089 9508 RET
_send_data_disp:
count --> R20
send_data --> R22
008A D318 RCALL push_gset2
008B 2F60 MOV R22,R16
(0058) }
(0059) void send_data_disp(unsigned char send_data) //向595送数据串
(0060) {
(0061) unsigned char count;
(0062) for(count =0;count<8;count++)
008C 2744 CLR R20
008D C010 RJMP 0x009E
(0063) {
(0064) if(((send_data<<count)&0x80 )==0)
008E 2F06 MOV R16,R22
008F 2F14 MOV R17,R20
0090 D359 RCALL lsl8
0091 2F80 MOV R24,R16
0092 7880 ANDI R24,0x80
0093 F421 BNE 0x0098
(0065) PORTB &=0B11110111; //送 data
0094 B388 IN R24,0x18
0095 7F87 ANDI R24,0xF7
0096 BB88 OUT 0x18,R24
0097 C001 RJMP 0x0099
(0066) else
(0067) PORTB |=0B00001000;
0098 9AC3 SBI 0x18,3
(0068) PORTB |= 0B00000100; //送SCK信号
0099 9AC2 SBI 0x18,2
(0069) PORTB &= 0B11111011;
009A B388 IN R24,0x18
009B 7F8B ANDI R24,0xFB
009C BB88 OUT 0x18,R24
009D 9543 INC R20
009E 3048 CPI R20,0x8
009F F370 BCS 0x008E
00A0 D2FA RCALL pop_gset2
00A1 9508 RET
(0070) }
(0071) }
(0072) /* 主显示,键值获取 */
(0073) void Disp_key_group(void) //使用时只需对Disp_Buff[] 刷新。
(0074) {
(0075) disp_key_count++;
_Disp_key_group:
00A2 91800068 LDS R24,disp_key_count
00A4 5F8F SUBI R24,0xFF
00A5 93800068 STS disp_key_count,R24
(0076) if(disp_key_count>7) //4个LED的板子(disp_key_count>3)
00A7 E087 LDI R24,7
00A8 90200068 LDS R2,disp_key_count
00AA 1582 CP R24,R2
00AB F418 BCC 0x00AF
(0077) disp_key_count =0;
00AC 2422 CLR R2
00AD 92200068 STS disp_key_count,R2
(0078) disp_bit(Disp_Buff[disp_key_count],1 <<disp_key_count);
00AF 91100068 LDS R17,disp_key_count
00B1 E001 LDI R16,1
00B2 D337 RCALL lsl8
00B3 2F20 MOV R18,R16
00B4 E680 LDI R24,0x60
00B5 940E040D CALL 0x40D
00B7 8100 LDD R16,Z+0
00B8 DFBE RCALL _disp_bit
(0079) if((PINB & 1) ==0)
00B9 99B0 SBIC 0x16,0
00BA C006 RJMP 0x00C1
(0080) key_buff[disp_key_count] =1;
00BB E780 LDI R24,0x70
00BC 940E040D CALL 0x40D
00BE E081 LDI R24,1
00BF 8380 STD Z+0,R24
00C0 C005 RJMP 0x00C6
(0081) else
(0082) key_buff[disp_key_count] =0;
00C1 E780 LDI R24,0x70
00C2 940E040D CALL 0x40D
00C4 2422 CLR R2
00C5 8220 STD Z+0,R2
00C6 9508 RET
_dec_hex_disp:
temp --> R20
i --> R22
00C7 D2DB RCALL push_gset2
(0083) }
(0084) void dec_hex_disp(void)
(0085) {/* 完整数以HEX显示 */
(0086) unsigned char i;
(0087) int temp;
(0088) temp =disp_code;
00C8 91400069 LDS R20,disp_code
00CA 9150006A LDS R21,disp_code+1
(0089) for(i =0;i <7;i++)
00CC 2766 CLR R22
00CD C010 RJMP 0x00DE
(0090) Disp_Buff[i] =((temp>>i*4) &0x0f);
00CE E084 LDI R24,4
00CF 9F86 MUL R24,R22
00D0 0190 MOVW R18,R0
00D1 018A MOVW R16,R20
00D2 D2C1 RCALL asr16
00D3 01C8 MOVW R24,R16
00D4 708F ANDI R24,0xF
00D5 7090 ANDI R25,0
00D6 E6E0 LDI R30,0x60
00D7 E0F0 LDI R31,0
00D8 2FA6 MOV R26,R22
00D9 27BB CLR R27
00DA 0FAE ADD R26,R30
00DB 1FBF ADC R27,R31
00DC 938C ST R24,0(X)
00DD 9563 INC R22
00DE 3067 CPI R22,7
00DF F370 BCS 0x00CE
00E0 D2BA RCALL pop_gset2
00E1 9508 RET
(0091) }
(0092) /* 键值处理及去抖 */
(0093) void Key_num(void)
(0094) {
(0095) char i;
(0096) char j =0;
_Key_num:
j --> R16
i --> R18
00E2 2700 CLR R16
(0097) if(key_delay >0) //键盘去抖动延时变量
00E3 2422 CLR R2
00E4 9030007A LDS R3,key_delay
00E6 1423 CP R2,R3
00E7 F410 BCC 0x00EA
00E8 940E0446 CALL 0x446
(0098) key_delay--;
(0099) for(i =0;i <=7;i++)
00EA 2722 CLR R18
00EB C00D RJMP 0x00F9
(0100) {
(0101) if(key_buff[i] ==1)
00EC E780 LDI R24,0x70
00ED E090 LDI R25,0
00EE 2FE2 MOV R30,R18
00EF 27FF CLR R31
00F0 0FE8 ADD R30,R24
00F1 1FF9 ADC R31,R25
00F2 8180 LDD R24,Z+0
00F3 3081 CPI R24,1
00F4 F419 BNE 0x00F8
(0102) {
(0103) new_key_num =(i);
00F5 9320006F STS new_key_num,R18
(0104) j =1;//键盘缓冲区有键值标志
00F7 E001 LDI R16,1
00F8 9523 INC R18
00F9 E087 LDI R24,7
00FA 1782 CP R24,R18
00FB F780 BCC 0x00EC
(0105) }
(0106) }
(0107) if(j ==0 )
00FC 2300 TST R16
00FD F419 BNE 0x0101
(0108) new_key_num =0x0f;
00FE E08F LDI R24,0xF
00FF 9380006F STS new_key_num,R24
(0109) if((old_key_num ==0x0f) && (new_key_num !=0x0f) && (key_delay ==0))//判断按键正按下
0101 9180006E LDS R24,old_key_num
0103 308F CPI R24,0xF
0104 F461 BNE 0x0111
0105 9180006F LDS R24,new_key_num
0107 308F CPI R24,0xF
0108 F041 BEQ 0x0111
0109 9020007A LDS R2,key_delay
010B 2022 TST R2
010C F421 BNE 0x0111
(0110) key_num =new_key_num;
010D 2E28 MOV R2,R24
010E 9220006D STS key_num,R2
0110 C029 RJMP 0x013A
(0111) else if ((old_key_num !=0x0f) && (new_key_num ==old_key_num))//判断按键持续按下
0111 9180006E LDS R24,old_key_num
0113 308F CPI R24,0xF
0114 F089 BEQ 0x0126
0115 9030006F LDS R3,new_key_num
0117 1638 CP R3,R24
0118 F469 BNE 0x0126
(0112) {
(0113) key_num =0x0f;//持续按键时不再给出键值,只给出空键值。
0119 E08F LDI R24,0xF
011A 9380006D STS key_num,R24
(0114) key_down_time++;//记录按键持续按下时间
011C 91800078 LDS R24,key_down_time
011E 91900079 LDS R25,key_down_time+1
0120 9601 ADIW R24,1
0121 93900079 STS key_down_time+1,R25
0123 93800078 STS key_down_time,R24
(0115) }
0125 C014 RJMP 0x013A
(0116) else
(0117) {
(0118) if((old_key_num !=0x0f) && (new_key_num ==0x0f))
0126 9180006E LDS R24,old_key_num
0128 308F CPI R24,0xF
0129 F081 BEQ 0x013A
012A 9180006F LDS R24,new_key_num
012C 308F CPI R24,0xF
012D F461 BNE 0x013A
(0119) {
(0120) key_num =0x0f;
012E E08F LDI R24,0xF
012F 9380006D STS key_num,R24
(0121) key_down_time =0;//按键时间变量清零
0131 2422 CLR R2
0132 2433 CLR R3
0133 92300079 STS key_down_time+1,R3
0135 92200078 STS key_down_time,R2
(0122) key_delay=100;//去抖动延时100ms
0137 E684 LDI R24,0x64
0138 9380007A STS key_delay,R24
(0123) }
(0124) }
(0125) old_key_num =new_key_num;
013A 9020006F LDS R2,new_key_num
013C 9220006E STS old_key_num,R2
013E 9508 RET
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\写字库程序\display_board2.1.c
(0001) /*器件:AVR ATMEGA16、373缩存器、62256K扩展RAM
(0002) I/O定义:
(0003) SPI接口显示键盘:
(0004) PB0: 键盘
(0005) PB1: RCK
(0006) PB2: SCK
(0007) PB3: DATA
(0008) SPI屏幕接口:
(0009) PC7: DATA
(0010) PD3: SCK
(0011) PD4: RCK
(0012) RAM:
(0013) PA0~7: PC0~7 A0~A15地址线
(0014) PC0~6: DATA总线复用
(0015) PD7: ALE
(0016) PD6: WE
(0017) PD5: RE
(0018) 下载:
(0019) PB4~7: SPI通讯和下载端口
(0020) PD0~1: UART通讯口
(0021) 电机:
(0022) PD2: 外中断,电机脉冲
(0023) */
(0024)
(0025) /********************************************************
(0026) 广告屏程序第二次改版----主显示控制模块程序2.0
(0027)
(0028) 1、程序采用模块化构架,提高了可读性
(0029) 2、此程序支持第二套广告屏硬件
(0030) 3、创建时间:2004年11月23日
(0031) 4、作者:西南科技大学 电子设计大赛第8大组
(0032) 注意:需要包括 :<disp_key.h>
(0033)
(0034) ********************************************************/
(0035)
(0036)
(0037)
(0038) /***************************************************
(0039) 头文件申明
(0040) ****************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -