⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 no.s

📁 ICC编译绝对可用M16的HD7279驱动测试程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -