?? 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 + -