📄 ad.lst
字号:
__text_start:
__start:
0040 E5CF LDI R28,0x5F
0041 E0D4 LDI R29,4
0042 BFCD OUT 0x3D,R28
0043 BFDE OUT 0x3E,R29
0044 51C0 SUBI R28,0x10
0045 40D0 SBCI R29,0
0046 EA0A LDI R16,0xAA
0047 8308 STD Y+0,R16
0048 2400 CLR R0
0049 E6E0 LDI R30,0x60
004A E0F0 LDI R31,0
004B E010 LDI R17,0
004C 36E5 CPI R30,0x65
004D 07F1 CPC R31,R17
004E F011 BEQ 0x0051
004F 9201 ST R0,Z+
0050 CFFB RJMP 0x004C
0051 8300 STD Z+0,R16
0052 E8E0 LDI R30,0x80
0053 E0F0 LDI R31,0
0054 E6A0 LDI R26,0x60
0055 E0B0 LDI R27,0
0056 E010 LDI R17,0
0057 38E0 CPI R30,0x80
0058 07F1 CPC R31,R17
0059 F021 BEQ 0x005E
005A 95C8 LPM
005B 9631 ADIW R30,1
005C 920D ST R0,X+
005D CFF9 RJMP 0x0057
005E 940E0383 CALL _main
_exit:
0060 CFFF RJMP _exit
_init_7279:
tmr --> R20
0061 940E044F CALL push_gset1
FILE: D:\AVR\AD\HD7279.C
(0001)
(0002) /*****************************readme.txt***********************************************************
(0003) HD7279.C是AVR Mega16,8MHz的配置文件
(0004)
(0005) 使用前必须先进行宏定义的“管脚配置”、”键值转换配置“
(0006)
(0007) 外部调用主要有四个函数
(0008)
(0009) #:init_7279()为7279初始化函数,在使用HD7279前必须先调用此文件
(0010)
(0011) #:void write7279(unsigned char cmd,unsigned char dta);
(0012) 前一个cmd为指令,可直接调用宏义中“HD7279指令集”
(0013) 后一个dat为数据,输入0x80+i,i为显示的数字
(0014)
(0015) #:unsigned char read7279(void):数据读取函数
(0016) 返回是键盘的原始值,没有进行任何转换
(0017)
(0018) #:unsigned char get_key7279(void):读取一个键值
(0019)
(0020) 调用函数后,等待按键,直到有按键按下并松开,
(0021) 返回一个与键值对应的键值,经过数值转换
(0022)
(0023) 内部函数,不对用户开发;用户只须调用以上上四个函数就可以完成HD7279的基本操作
(0024)
(0025) *****************************************************************************************************/
(0026)
(0027)
(0028) /********************************管脚配置*****************************/
(0029) #define WR7279 PORTC
(0030) #define RD7279 PINC
(0031) #define DR7279 DDRC
(0032)
(0033) #define cs7279 BIT(1) //cs7279定义为PC^5
(0034) #define clk7279 BIT(2) //clk7279定义为PC^4
(0035) #define dat7279 BIT(3) //dat7279定义为PC^3
(0036) #define key7279 BIT(4) //key7279定义为PC^2
(0037)
(0038) /******************************键值转换配置********************************/
(0039) #define ONE 0X03
(0040) #define TWO 0X02
(0041) #define THREE 0X01
(0042) #define FOUR 0X00
(0043) #define FIVE 0X0B
(0044) #define SIX 0X0A
(0045) #define SEVEN 0x09
(0046) #define EIGHT 0X08
(0047) #define NINE 0X13
(0048) #define ZERO 0X12
(0049) #define AAAA 0X11
(0050) #define BBBB 0x10
(0051) #define CCCC 0X1B
(0052) #define DDDD 0X1A
(0053) #define EEEE 0X19
(0054) #define FFFF 0X18
(0055)
(0056) /********************************HD7279指令集***************************/
(0057) #define CMD_RESET 0xa4 //复位(清除)指令
(0058) #define CMD_TEST 0xbf //测试指令
(0059) #define DECODE0 0x80 //方式0译码
(0060) #define DECODE1 0xc8 //方式1译码
(0061) #define CMD_READ 0x15 //读取键盘数据指令
(0062) #define UNDECODE 0x90 //不带小数点显示
(0063) #define RTL_CYCLE 0xa3 //循环左移指令
(0064) #define RTR_CYCLE 0xa2 //循环右移指令
(0065) #define RTL_UNCYL 0xa1 //左移指令
(0066) #define RTR_UNCYL 0xa0 //右移指令
(0067) #define ACTCTL 0x98 //消隐控制
(0068) #define SEGON 0xe0 //段点亮指令
(0069) #define SEGOFF 0xc0 //段关闭指令
(0070) #define BLINKCTL 0x88 //闪烁控制
(0071)
(0072)
(0073) /******************************************外部调用函数申明*********************************************/
(0074)
(0075) /*****************************************************
(0076) 函数名:HD7279初始化函数
(0077) 功 能:初始化HD7279(管脚配置、HD7279复位)
(0078) 输 入:无
(0079) 返 回:无
(0080) 备 注:使用HD7279之前调用此函数,并配置管脚的宏定义
(0081) ******************************************************/
(0082) extern void init_7279(void);
(0083)
(0084) /****************** **********************
(0085) 函数名:HD7279写入函数
(0086) 功 能:对HD7279写数据
(0087) 输 入:cmd为指令数据; dta为数据数据
(0088) 返 回:无
(0089) 备 注:HD7279的控制函数
(0090) ******************************************/
(0091) extern void write7279(unsigned char cmd,unsigned char dta); //写入到HD7279
(0092)
(0093) /****************** **********************
(0094) 函数名:HD7279读取函数
(0095) 功 能:对HD7279读取原始键值
(0096) 输 入:无
(0097) 返 回:键盘原始键值
(0098) 备 注:HD7279的控制函数
(0099) ******************************************/
(0100) extern unsigned char read7279(void);
(0101)
(0102) /****************** **********************
(0103) 函数名:HD7279按键等待接收函数
(0104) 功 能:当完成一次按键,返回键值
(0105) 输 入:无
(0106) 返 回:键盘键值
(0107) 备 注:HD7279的控制函数
(0108) ******************************************/
(0109) extern unsigned char get_key7279(void);
(0110)
(0111) /****************** **********************
(0112) 函数名:HD7279测试函数
(0113) 功 能:对HD7279功能测试
(0114) 输 入:无
(0115) 返 回:无
(0116) 备 注:
(0117) ******************************************/
(0118) extern void test_7279(void);
(0119)
(0120)
(0121)
(0122) /*******************************************内部函数申明***********************************************/
(0123) //长时延函数
(0124) extern void long_delay(void);
(0125) //短时延函数
(0126) extern void short_delay(void);
(0127) //10ms时延函数
(0128) extern void delay10ms(unsigned int);
(0129) //发送一个字节
(0130)
(0131) /****************** **********************
(0132) 函数名:HD7279字节发送函数
(0133) 功 能:HD7279发送一个字节
(0134) 输 入:无
(0135) 返 回:无
(0136) 备 注:HD7279硬件函数
(0137) ******************************************/
(0138) extern void send_byte(unsigned char);
(0139)
(0140) /****************** **********************
(0141) 函数名:HD7279字节接收函数
(0142) 功 能:从HD7279接收一个字节
(0143) 输 入:无
(0144) 返 回:一个字节
(0145) 备 注:HD7279硬件函数
(0146) ******************************************/
(0147) extern unsigned char receive_byte(void);
(0148)
(0149) /****************** **********************
(0150) 函数名:HD7279按键等待接收函数
(0151) 功 能:当完成一次按键,返回键值
(0152) 输 入:无
(0153) 返 回:键盘键值
(0154) 备 注:HD7279的控制函数
(0155) ******************************************/
(0156) extern unsigned char num_change7279 (unsigned char X);
(0157)
(0158)
(0159)
(0160) /******************************************外部调用函数*********************************************/
(0161)
(0162) /*****************************************************
(0163) 函数名:HD7279初始化函数
(0164) 功 能:初始化HD7279(管脚配置、HD7279复位)
(0165) 输 入:无
(0166) 返 回:无
(0167) 备 注:使用先,选配置管脚的宏定义
(0168) ******************************************************/
(0169) extern void init_7279(void)
(0170) {
(0171) unsigned int tmr;
(0172)
(0173) DR7279 |= cs7279; //cs7279定义为输出
0063 9AA1 SBI 0x14,1
(0174) DR7279 |= clk7279; //clk7279定义为输出
0064 9AA2 SBI 0x14,2
(0175) DR7279 |= dat7279; //dat7279定义为输出
0065 9AA3 SBI 0x14,3
(0176) DR7279 &= ~(key7279); //key7279定义为输入
0066 98A4 CBI 0x14,4
(0177)
(0178) WR7279 |= cs7279; //cs7279初始化为1
0067 9AA9 SBI 0x15,1
(0179) WR7279 |= clk7279; //clk7279初始化为1
0068 9AAA SBI 0x15,2
(0180) WR7279 |= dat7279; //dat7279初始化为1
0069 9AAB SBI 0x15,3
(0181) WR7279 |= key7279; //key7279初始化为有弱上拉
006A 9AAC SBI 0x15,4
(0182)
(0183) for(tmr=0;tmr<0xf000;tmr++); //上电延时
006B 2744 CLR R20
006C 2755 CLR R21
006D C002 RJMP 0x0070
006E 5F4F SUBI R20,0xFF
006F 4F5F SBCI R21,0xFF
0070 3040 CPI R20,0
0071 EFE0 LDI R30,0xF0
0072 075E CPC R21,R30
0073 F3D0 BCS 0x006E
(0184)
(0185) send_byte(CMD_RESET); //复位HD7279
0074 EA04 LDI R16,0xA4
0075 D048 RCALL _send_byte
(0186)
(0187) }
0076 940E0452 CALL pop_gset1
0078 9508 RET
_write7279:
dta --> R20
cmd --> R22
0079 940E0466 CALL push_gset2
007B 2F42 MOV R20,R18
007C 2F60 MOV R22,R16
(0188)
(0189) /****************** **********************
(0190) 函数名:HD7279写入函数
(0191) 功 能:对HD7279写数据
(0192) 输 入:cmd为指令数据; dta为数据数据
(0193) 返 回:无
(0194) 备 注:HD7279的控制函数
(0195) ******************************************/
(0196) extern void write7279(unsigned char cmd,unsigned char dta) //写入到HD7279
(0197) {
(0198) send_byte(cmd); //写指令
007D 2F06 MOV R16,R22
007E D03F RCALL _send_byte
(0199) send_byte(dta); //定数据
007F 2F04 MOV R16,R20
0080 D03D RCALL _send_byte
(0200) }
0081 940E0446 CALL pop_gset2
0083 9508 RET
(0201)
(0202) /****************** **********************
(0203) 函数名:HD7279读取函数
(0204) 功 能:对HD7279读取原始键值
(0205) 输 入:无
(0206) 返 回:键盘原始键值
(0207) 备 注:HD7279的控制函数
(0208) ******************************************/
(0209) extern unsigned char read7279(void)
(0210) {
(0211) send_byte(0x15); //发送读取指令
_read7279:
0084 E105 LDI R16,0x15
0085 D038 RCALL _send_byte
(0212) return(receive_byte()); //返回键值
0086 C050 RJMP _receive_byte
_get_key7279:
KeyNum --> R20
0087 940E044F CALL push_gset1
(0213)
(0214) }
(0215)
(0216) /****************** **********************
(0217) 函数名:HD7279按键等待接收函数
(0218) 功 能:当完成一次按键,返回键值
(0219) 输 入:无
(0220) 返 回:键盘键值
(0221) 备 注:HD7279的控制函数
(0222) ******************************************/
(0223) extern unsigned char get_key7279(void)
(0224) {
(0225) unsigned char KeyNum;
(0226) while( (RD7279&key7279) ); //等待有键按下
0089 999C SBIC 0x13,4
008A CFFE RJMP 0x0089
(0227)
(0228) delay10ms(1); //时延100ms
008B E001 LDI R16,1
008C E010 LDI R17,0
008D D018 RCALL _delay10ms
(0229)
(0230) KeyNum=read7279(); //读出键码
008E DFF5 RCALL _read7279
(0231)
(0232) KeyNum=num_change7279(KeyNum); //键码转为十进制
008F D05E RCALL _num_change7279
0090 2F40 MOV R20,R16
(0233)
(0234) delay10ms(1); //时延100ms
0091 E001 LDI R16,1
0092 E010 LDI R17,0
0093 D012 RCALL _delay10ms
(0235)
(0236) while( !(RD7279&key7279) ); //等待按键松开
0094 9B9C SBIS 0x13,4
0095 CFFE RJMP 0x0094
(0237)
(0238) return KeyNum; //返回键值
0096 2F04 MOV R16,R20
0097 940E0452 CALL pop_gset1
0099 9508 RET
(0239) }
(0240)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -