📄 显示模块2.lst
字号:
__text_start:
__start:
0180 E5CF LDI R28,0x5F
0181 E0D4 LDI R29,4
0182 BFCD OUT 0x3D,R28
0183 BFDE OUT 0x3E,R29
0184 51CE SUBI R28,0x1E
0185 40D0 SBCI R29,0
0186 EA0A LDI R16,0xAA
0187 8308 STD Y+0,R16
0188 2400 CLR R0
0189 EFE8 LDI R30,0xF8
018A E0F2 LDI R31,2
018B E013 LDI R17,3
018C 30E3 CPI R30,3
018D 07F1 CPC R31,R17
018E F011 BEQ 0x0191
018F 9201 ST R0,Z+
0190 CFFB RJMP 0x018C
0191 8300 STD Z+0,R16
0192 E6E7 LDI R30,0x67
0193 E0F0 LDI R31,0
0194 E6A0 LDI R26,0x60
0195 E0B0 LDI R27,0
0196 E012 LDI R17,2
0197 3FEF CPI R30,0xFF
0198 07F1 CPC R31,R17
0199 F021 BEQ 0x019E
019A 95C8 LPM
019B 9631 ADIW R30,1
019C 920D ST R0,X+
019D CFF9 RJMP 0x0197
019E D27A RCALL _main
_exit:
019F CFFF RJMP _exit
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\disp_key.h
(0001) /*********************************************
(0002) *显示键盘头文件
(0003) *支持SPI显示键盘模块
(0004)
(0005)
(0006) SPI接口显示键盘:
(0007) PB0: 键盘
(0008) PB1: SCK
(0009) PB2: RCK
(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
01A0 9310007C STS delay_time_count+1,R17
01A2 9300007B STS delay_time_count,R16
(0049) while(delay_time_count >0);
01A4 940E0534 CALL 0x534
01A6 F7E9 BNE 0x01A4
01A7 2033 TST R3
01A8 F7D9 BNE 0x01A4
01A9 9508 RET
_disp_bit:
bitChoose --> R22
disCodeIndex --> R20
01AA D2F5 RCALL push_gset2
01AB 2F62 MOV R22,R18
01AC 2F40 MOV R20,R16
(0050) }
(0051) /* 显示函数 */
(0052) void disp_bit(char disCodeIndex,char bitChoose) //按位显示
(0053) {
(0054) PORTB &= 0B00000100; //RCK送底电平
01AD B388 IN R24,0x18
01AE 7084 ANDI R24,4
01AF BB88 OUT 0x18,R24
(0055) send_data_disp(bitChoose); //送位选
01B0 2F06 MOV R16,R22
01B1 D00B RCALL _send_data_disp
(0056) send_data_disp(DISCODE[disCodeIndex]); //送段码
01B2 E584 LDI R24,0x54
01B3 E090 LDI R25,0
01B4 940E053A CALL 0x53A
01B6 9104 LPM R16,0(Z)
01B7 D005 RCALL _send_data_disp
(0057) PORTB |= 0B11111011; //RCK送高电平
01B8 B388 IN R24,0x18
01B9 6F8B ORI R24,0xFB
01BA BB88 OUT 0x18,R24
01BB D2DC RCALL pop_gset2
01BC 9508 RET
_send_data_disp:
count --> R20
send_data --> R22
01BD D2E2 RCALL push_gset2
01BE 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++)
01BF 2744 CLR R20
01C0 C012 RJMP 0x01D3
(0063) {
(0064) if(((send_data<<count)&0x80 )==0)
01C1 2F06 MOV R16,R22
01C2 2F14 MOV R17,R20
01C3 D32A RCALL lsl8
01C4 2F80 MOV R24,R16
01C5 7880 ANDI R24,0x80
01C6 F421 BNE 0x01CB
(0065) PORTB &=0B11110111; //送 data
01C7 B388 IN R24,0x18
01C8 7F87 ANDI R24,0xF7
01C9 BB88 OUT 0x18,R24
01CA C001 RJMP 0x01CC
(0066) else
(0067) PORTB |=0B00001000;
01CB 9AC3 SBI 0x18,3
(0068) PORTB |= 0B11111101; //送SCK信号
01CC B388 IN R24,0x18
01CD 6F8D ORI R24,0xFD
01CE BB88 OUT 0x18,R24
(0069) PORTB &= 0B00000010;
01CF B388 IN R24,0x18
01D0 7082 ANDI R24,2
01D1 BB88 OUT 0x18,R24
01D2 9543 INC R20
01D3 3048 CPI R20,0x8
01D4 F360 BCS 0x01C1
01D5 D2C2 RCALL pop_gset2
01D6 9508 RET
(0070) }
(0071) }
(0072) /* 主显示,键值获取 */
(0073) void Disp_key_group(void) //使用时只需对Disp_Buff[] 刷新。
(0074) {
(0075) disp_key_count++;
_Disp_key_group:
01D7 91800068 LDS R24,disp_key_count
01D9 5F8F SUBI R24,0xFF
01DA 93800068 STS disp_key_count,R24
(0076) if(disp_key_count>7) //4个LED的板子(disp_key_count>3)
01DC E087 LDI R24,7
01DD 90200068 LDS R2,disp_key_count
01DF 1582 CP R24,R2
01E0 F418 BCC 0x01E4
(0077) disp_key_count =0;
01E1 2422 CLR R2
01E2 92200068 STS disp_key_count,R2
(0078) disp_bit(Disp_Buff[disp_key_count],1 <<disp_key_count);
01E4 91100068 LDS R17,disp_key_count
01E6 E001 LDI R16,1
01E7 D306 RCALL lsl8
01E8 2F20 MOV R18,R16
01E9 E680 LDI R24,0x60
01EA 940E0512 CALL 0x512
01EC 8100 LDD R16,Z+0
01ED DFBC RCALL _disp_bit
(0079) if((PINB & 1) ==0)
01EE 99B0 SBIC 0x16,0
01EF C006 RJMP 0x01F6
(0080) key_buff[disp_key_count] =1;
01F0 E780 LDI R24,0x70
01F1 940E0512 CALL 0x512
01F3 E081 LDI R24,1
01F4 8380 STD Z+0,R24
01F5 C005 RJMP 0x01FB
(0081) else
(0082) key_buff[disp_key_count] =0;
01F6 E780 LDI R24,0x70
01F7 940E0512 CALL 0x512
01F9 2422 CLR R2
01FA 8220 STD Z+0,R2
01FB 9508 RET
_dec_hex_disp:
temp --> R20
i --> R22
01FC D2A3 RCALL push_gset2
(0083) }
(0084) void dec_hex_disp(void)
(0085) {/* 完整数以HEX显示 */
(0086) unsigned char i;
(0087) int temp;
(0088) temp =disp_code;
01FD 91400069 LDS R20,disp_code
01FF 9150006A LDS R21,disp_code+1
(0089) for(i =0;i <7;i++)
0201 2766 CLR R22
0202 C010 RJMP 0x0213
(0090) Disp_Buff[i] =((temp>>i*4) &0x0f);
0203 E084 LDI R24,4
0204 9F86 MUL R24,R22
0205 0190 MOVW R18,R0
0206 018A MOVW R16,R20
0207 D289 RCALL asr16
0208 01C8 MOVW R24,R16
0209 708F ANDI R24,0xF
020A 7090 ANDI R25,0
020B E6E0 LDI R30,0x60
020C E0F0 LDI R31,0
020D 2FA6 MOV R26,R22
020E 27BB CLR R27
020F 0FAE ADD R26,R30
0210 1FBF ADC R27,R31
0211 938C ST R24,0(X)
0212 9563 INC R22
0213 3067 CPI R22,7
0214 F370 BCS 0x0203
0215 D282 RCALL pop_gset2
0216 9508 RET
(0091) }
(0092) /* 键值处理及去抖 */
(0093) void Key_num(void)
(0094) {
(0095) char i;
(0096) char j =0;
_Key_num:
j --> R16
i --> R18
0217 2700 CLR R16
(0097) for(i =0;i <=7;i++)
0218 2722 CLR R18
0219 C00D RJMP 0x0227
(0098) {
(0099) if(key_buff[i] ==1)
021A E780 LDI R24,0x70
021B E090 LDI R25,0
021C 2FE2 MOV R30,R18
021D 27FF CLR R31
021E 0FE8 ADD R30,R24
021F 1FF9 ADC R31,R25
0220 8180 LDD R24,Z+0
0221 3081 CPI R24,1
0222 F419 BNE 0x0226
(0100) {
(0101) new_key_num =(i);
0223 9320006F STS new_key_num,R18
(0102) j =1;//键盘缓冲区有键值标志
0225 E001 LDI R16,1
0226 9523 INC R18
0227 E087 LDI R24,7
0228 1782 CP R24,R18
0229 F780 BCC 0x021A
(0103) }
(0104) }
(0105) if(j ==0 )
022A 2300 TST R16
022B F419 BNE 0x022F
(0106) new_key_num =0x0f;
022C E08F LDI R24,0xF
022D 9380006F STS new_key_num,R24
(0107) if((old_key_num ==0x0f) && (new_key_num !=0x0f) && (key_delay ==0))//判断按键正按下
022F 9180006E LDS R24,old_key_num
0231 308F CPI R24,0xF
0232 F461 BNE 0x023F
0233 9180006F LDS R24,new_key_num
0235 308F CPI R24,0xF
0236 F041 BEQ 0x023F
0237 9020007A LDS R2,key_delay
0239 2022 TST R2
023A F421 BNE 0x023F
(0108) key_num =new_key_num;
023B 2E28 MOV R2,R24
023C 9220006D STS key_num,R2
023E C029 RJMP 0x0268
(0109) else if ((old_key_num !=0x0f) && (new_key_num ==old_key_num))//判断按键持续按下
023F 9180006E LDS R24,old_key_num
0241 308F CPI R24,0xF
0242 F089 BEQ 0x0254
0243 9030006F LDS R3,new_key_num
0245 1638 CP R3,R24
0246 F469 BNE 0x0254
(0110) {
(0111) key_num =0x0f;//持续按键时不再给出键值,只给出空键值。
0247 E08F LDI R24,0xF
0248 9380006D STS key_num,R24
(0112) key_down_time++;//记录按键持续按下时间
024A 91800078 LDS R24,key_down_time
024C 91900079 LDS R25,key_down_time+1
024E 9601 ADIW R24,1
024F 93900079 STS key_down_time+1,R25
0251 93800078 STS key_down_time,R24
(0113) }
0253 C014 RJMP 0x0268
(0114) else
(0115) {
(0116) if((old_key_num !=0x0f) && (new_key_num ==0x0f))
0254 9180006E LDS R24,old_key_num
0256 308F CPI R24,0xF
0257 F081 BEQ 0x0268
0258 9180006F LDS R24,new_key_num
025A 308F CPI R24,0xF
025B F461 BNE 0x0268
(0117) {
(0118) key_num =0x0f;
025C E08F LDI R24,0xF
025D 9380006D STS key_num,R24
(0119) key_down_time =0;//按键时间变量清零
025F 2422 CLR R2
0260 2433 CLR R3
0261 92300079 STS key_down_time+1,R3
0263 92200078 STS key_down_time,R2
(0120) key_delay=100;//去抖动延时100ms
0265 E684 LDI R24,0x64
0266 9380007A STS key_delay,R24
(0121) }
(0122) }
(0123) old_key_num =new_key_num;
0268 9020006F LDS R2,new_key_num
026A 9220006E STS old_key_num,R2
(0124) if(key_delay >0) //键盘去抖动延时变量
026C 2422 CLR R2
026D 9030007A LDS R3,key_delay
026F 1423 CP R2,R3
0270 F420 BCC 0x0275
(0125) key_delay--;
0271 2D83 MOV R24,R3
0272 5081 SUBI R24,1
0273 9380007A STS key_delay,R24
0275 9508 RET
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\display_board2.0.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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -