📄 no.s
字号:
.module no.c
.area text(rom, con, rel)
.dbfile D:\软件\hd7279disp\no.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 51
; /*------------------------------------------------------------
; ;------------------------------------------------------------
; ; HD7279 LIB
; ; V0.1c
; ; zhongwh
; ; Copyright 2003-2005
; ; Email: hfkj01@163.com
; ; mtel : 13708004895
; ; 2005-9-28 15:38:52
; ; ICC-AVR application builder
; ;-------------------------------------------------------------
; ;-------------------------------------------------------------
; ; Target : M16
; ; Crystal: 8Mhz
; ;-------------------------------------------------------------
; ;-------------------------------------------------------------*/
; #include <iom16v.h>
; #include <macros.h>
; //HD7279_DATA
; #define HD7279_DATA_H PORTB|=BIT(PB0)
; #define HD7279_DATA_L PORTB&=~BIT(PB0)
; //HD7279_CLK
; #define HD7279_CLK_H PORTB|=BIT(PB1)
; #define HD7279_CLK_L PORTB&=~BIT(PB1)
; //HD7279_CS
; #define HD7279_CS_H PORTB|=BIT(PB2)
; #define HD7279_CS_L PORTB&=~BIT(PB2)
; //DDR
; #define HD7279_DDR_H DDRB|=BIT(PB0)
; #define HD7279_DDR_L DDRB&=~BIT(PB0)
; //
; #define HD7279_DATA PINB
; //*** 函数定义 ***
; void long_delay(void); // 长延时
; void short_delay(void); // 短暂延时
; void write7279(unsigned char, unsigned char); // 写入到HD7279
; unsigned char read7279(unsigned char); // 从HD7279读出
; void send_byte(unsigned char); // 发送一个字节
; unsigned char receive_byte(void); // 接收一个字节
; void delay_us(int); // 微秒延时
; void dely_ms(unsigned int); // 毫秒延时
;
; //*** 变量及I/O口定义 ***
; unsigned char digit[8];
; unsigned char j,k,key_number;
; unsigned int tmr;
; unsigned long wait_cnter;
;
; //***I/O***
; void port_init(void)
; {
.dbline 52
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 53
; DDRB = 0x07;
ldi R24,7
out 0x17,R24
.dbline 54
; PORTC = 0x00;
out 0x15,R2
.dbline 55
; DDRC = 0x07;
out 0x14,R24
.dbline 56
; MCUCR = 0x02;
ldi R24,2
out 0x35,R24
.dbline 57
; GICR = 0x40;
ldi R24,64
out 0x3b,R24
.dbline 58
; TIMSK = 0x00; //timer interrupt sources
out 0x39,R2
.dbline 59
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 60
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fI
.even
_main::
.dbline -1
.dbline 81
;
; //****** HD7279A 指令 ******
; #define CMD_RESET 0xa4
; #define CMD_TEST 0xbf
; #define DECODE0 0x80
; #define DECODE1 0xc8
; #define CMD_READ 0x15
; #define UNDECODE 0x90
; #define RTL_CYCLE 0xa3
; #define RTR_CYCLE 0xa2
; #define RTL_UNCYL 0xa1
; #define RTR_UNCYL 0xa0
; #define ACTCTL 0x98
; #define SEGON 0xe0
; #define SEGOFF 0xc0
; #define BLINKCTL 0x88
;
;
; //
; main()
; {
.dbline 82
; port_init();
xcall _port_init
xjmp L4
L3:
.dbline 84
; while (1)
; {
.dbline 85
clr R2
clr R3
sts _tmr+1,R3
sts _tmr,R2
xjmp L9
L6:
.dbline 85
L7:
.dbline 85
lds R24,_tmr
lds R25,_tmr+1
adiw R24,1
sts _tmr+1,R25
sts _tmr,R24
L9:
.dbline 85
; for (tmr=0;tmr<0x2000;tmr++); // 上电延时
lds R24,_tmr
lds R25,_tmr+1
cpi R24,0
ldi R30,32
cpc R25,R30
brlo L6
.dbline 86
; send_byte(CMD_RESET); // 复位HD7279A
ldi R16,164
xcall _send_byte
.dbline 91
;
; //******************************************
; // 测试指令演示
; //******************************************
; send_byte(CMD_TEST); // 测试指令
ldi R16,191
xcall _send_byte
.dbline 92
; for (j=0;j<3;j++) // 延时约3秒
clr R2
sts _j,R2
xjmp L13
L10:
.dbline 93
.dbline 94
ldi R16,100
ldi R17,0
xcall _dely_ms
.dbline 95
L11:
.dbline 92
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
L13:
.dbline 92
lds R24,_j
cpi R24,3
brlo L10
.dbline 96
; {
; dely_ms(100);
; }
; send_byte(CMD_RESET); // 清除显示
ldi R16,164
xcall _send_byte
.dbline 103
;
; //**********************************************
; // 闪烁指令及键盘接口测试
; // 将用户按键的键码显示出来, 如果10秒内无按键
; // 或按S0键即进入下一步演示
; //**********************************************
; wait_cnter=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _wait_cnter+1,R21
sts _wait_cnter,R20
sts _wait_cnter+2+1,R23
sts _wait_cnter+2,R22
.dbline 104
; key_number=0xff;
ldi R24,255
sts _key_number,R24
.dbline 105
; write7279(BLINKCTL,0xfc); // 第1、2两位设为闪烁显示
ldi R18,252
ldi R16,136
xcall _write7279
.dbline 106
; write7279(UNDECODE,0X08); // 在第1位显示下划线'_'
ldi R18,8
ldi R16,144
xcall _write7279
.dbline 107
; write7279(UNDECODE+1,0x08); // 在第2位显示下划线'_'
ldi R18,8
ldi R16,145
xcall _write7279
L14:
.dbline 109
; do
; {
.dbline 110
; if (!(PIND&0x04)) // 如果有键按下
sbic 0x10,2
rjmp L17
.dbline 111
; {
.dbline 112
; key_number=read7279(CMD_READ); // 读出键码
ldi R16,21
xcall _read7279
sts _key_number,R16
.dbline 113
; write7279(DECODE1+1,key_number/16); // 在第2位显示键码高8位
mov R18,R16
swap R18
andi R18,#0x0F
ldi R16,201
xcall _write7279
.dbline 114
; write7279(DECODE1,key_number&0x0f); // 在第1位显示键码低8位
lds R18,_key_number
andi R18,15
ldi R16,200
xcall _write7279
L19:
.dbline 115
L20:
.dbline 115
; while (!(PIND&0x04)); // 等待按键放开
sbis 0x10,2
rjmp L19
.dbline 116
; wait_cnter=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _wait_cnter+1,R21
sts _wait_cnter,R20
sts _wait_cnter+2+1,R23
sts _wait_cnter+2,R22
.dbline 117
; }
L17:
.dbline 118
; wait_cnter++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_wait_cnter+2
lds R5,_wait_cnter+2+1
lds R2,_wait_cnter
lds R3,_wait_cnter+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _wait_cnter+1,R3
sts _wait_cnter,R2
sts _wait_cnter+2+1,R5
sts _wait_cnter+2,R4
.dbline 119
L15:
.dbline 119
; } while (key_number!=0 && wait_cnter<0x30000); // 如果按键为‘0’和超时则进入下一步演示
lds R2,_key_number
tst R2
breq L22
ldi R20,0
ldi R21,0
ldi R22,3
ldi R23,0
lds R4,_wait_cnter+2
lds R5,_wait_cnter+2+1
lds R2,_wait_cnter
lds R3,_wait_cnter+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brsh X1
xjmp L14
X1:
L22:
.dbline 120
; write7279(BLINKCTL,0xff); // 清除闪烁设置
ldi R18,255
ldi R16,136
xcall _write7279
.dbline 125
;
; //******************************************
; // 快速计数演示
; //******************************************
; for (j=0;j<5;j++) // 计数初始值为00000
clr R2
sts _j,R2
xjmp L26
L23:
.dbline 126
.dbline 127
ldi R24,<_digit
ldi R25,>_digit
lds R30,_j
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 128
lds R30,_j
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
lds R16,_j
subi R16,128 ; addi 128
xcall _write7279
.dbline 129
L24:
.dbline 125
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
L26:
.dbline 125
lds R24,_j
cpi R24,5
brlo L23
xjmp L28
L27:
.dbline 131
; {
; digit[j]=0;
; write7279(DECODE0+j,digit[j]);
; }
; while (digit[4]<2) // 如果计数达到20000就停止
; {
.dbline 132
; digit[0]++;
lds R24,_digit
subi R24,255 ; addi 1
sts _digit,R24
.dbline 133
; if (digit[0]>9)
ldi R24,9
lds R2,_digit
cp R24,R2
brsh L31
.dbline 134
; {
.dbline 135
; digit[0]=0;
clr R2
sts _digit,R2
.dbline 136
; digit[1]++;
lds R24,_digit+1
subi R24,255 ; addi 1
sts _digit+1,R24
.dbline 137
; if (digit[1]>9)
ldi R24,9
lds R2,_digit+1
cp R24,R2
brsh L34
.dbline 138
; {
.dbline 139
; digit[1]=0;
clr R2
sts _digit+1,R2
.dbline 140
; digit[2]++;
lds R24,_digit+2
subi R24,255 ; addi 1
sts _digit+2,R24
.dbline 141
; if (digit[2]>9)
ldi R24,9
lds R2,_digit+2
cp R24,R2
brsh L39
.dbline 142
; {
.dbline 143
; digit[2]=0;
clr R2
sts _digit+2,R2
.dbline 144
; digit[3]++;
lds R24,_digit+3
subi R24,255 ; addi 1
sts _digit+3,R24
.dbline 145
; if (digit[3]>9)
ldi R24,9
lds R2,_digit+3
cp R24,R2
brsh L44
.dbline 146
; {
.dbline 147
; digit[3]=0;
clr R2
sts _digit+3,R2
.dbline 148
; digit[4]++;
lds R24,_digit+4
subi R24,255 ; addi 1
sts _digit+4,R24
.dbline 149
; if (digit[4]>9)
ldi R24,9
lds R2,_digit+4
cp R24,R2
brsh L49
.dbline 150
; {
.dbline 151
; digit[4]=0;
clr R2
sts _digit+4,R2
.dbline 152
; }
L49:
.dbline 153
; }
L44:
.dbline 154
; }
L39:
.dbline 155
; }
L34:
.dbline 156
; }
L31:
.dbline 157
; write7279(DECODE0,digit[0]);
lds R18,_digit
ldi R16,128
xcall _write7279
.dbline 158
; if (digit[0]==0)
lds R2,_digit
tst R2
brne L53
.dbline 159
; {
.dbline 160
; write7279(DECODE0+1,digit[1]);
lds R18,_digit+1
ldi R16,129
xcall _write7279
.dbline 161
; if (digit[1]==0)
lds R2,_digit+1
tst R2
brne L56
.dbline 162
; {
.dbline 163
; write7279(DECODE0+2,digit[2]);
lds R18,_digit+2
ldi R16,130
xcall _write7279
.dbline 164
; if (digit[2]==0)
lds R2,_digit+2
tst R2
brne L60
.dbline 165
; {
.dbline 166
; write7279(DECODE0+3,digit[3]);
lds R18,_digit+3
ldi R16,131
xcall _write7279
.dbline 167
; if (digit[3]==0)
lds R2,_digit+3
tst R2
brne L64
.dbline 168
; {
.dbline 169
; write7279(DECODE0+4,digit[4]);
lds R18,_digit+4
ldi R16,132
xcall _write7279
.dbline 170
; }
L64:
.dbline 171
; }
L60:
.dbline 172
; }
L56:
.dbline 173
; }
L53:
.dbline 174
L28:
.dbline 130
lds R24,_digit+4
cpi R24,2
brsh X2
xjmp L27
X2:
.dbline 175
; }
; dely_ms(150);
ldi R16,150
ldi R17,0
xcall _dely_ms
.dbline 176
; send_byte(CMD_RESET); // 清除显示
ldi R16,164
xcall _send_byte
.dbline 181
;
; //*************************************************
; // 下载数据但不译码指令测试
; //*************************************************
; write7279(UNDECODE+7,0x49); // 在第8位按不译码方式显示一字符'三'
ldi R18,73
ldi R16,151
xcall _write7279
.dbline 182
; dely_ms(80);
ldi R16,80
ldi R17,0
xcall _dely_ms
.dbline 188
;
; //*************************************************
; // 循环左/右移测试
; // "三"字向右运动3次,再向左运动3次
; //*************************************************
; for (j=0;j<23;j++)
clr R2
sts _j,R2
xjmp L71
L68:
.dbline 189
.dbline 190
ldi R16,162
xcall _send_byte
.dbline 191
ldi R16,12
ldi R17,0
xcall _dely_ms
.dbline 192
L69:
.dbline 188
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
L71:
.dbline 188
lds R24,_j
cpi R24,23
brlo L68
.dbline 193
; {
; send_byte(RTR_CYCLE); // 循环右移23次
; dely_ms(12);
; }
; for (j=0;j<23;j++)
clr R2
sts _j,R2
xjmp L75
L72:
.dbline 194
.dbline 195
ldi R16,163
xcall _send_byte
.dbline 196
ldi R16,12
ldi R17,0
xcall _dely_ms
.dbline 197
L73:
.dbline 193
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
L75:
.dbline 193
lds R24,_j
cpi R24,23
brlo L72
.dbline 202
; {
; send_byte(RTL_CYCLE); // 循环左移23次
; dely_ms(12);
; }
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -