?? ds12887.lst
字號(hào):
__text_start:
__start:
0049 E5CF LDI R28,0x5F
004A E0D4 LDI R29,4
004B BFCD OUT P3D,R28
004C BFDE OUT P3E,R29
004D 51C0 SUBI R28,0x10
004E 40D0 SBCI R29,0
004F EA0A LDI R16,0xAA
0050 8308 STD R16,0+Y
0051 2400 CLR R0
0052 E9E2 LDI R30,0x92
0053 E0F0 LDI R31,0
0054 E010 LDI R17,0
0055 39E2 CPI R30,0x92
0056 07F1 CPC R31,R17
0057 F011 BEQ 0x005A
0058 9201 ST R0,Z+
0059 CFFB RJMP 0x0055
005A 8300 STD R16,0+Z
005B E6E0 LDI R30,0x60
005C E0F0 LDI R31,0
005D E6A0 LDI R26,0x60
005E E0B0 LDI R27,0
005F E010 LDI R17,0
0060 39E2 CPI R30,0x92
0061 07F1 CPC R31,R17
0062 F021 BEQ 0x0067
0063 95C8 LPM
0064 9631 ADIW R30,1
0065 920D ST R0,X+
0066 CFF9 RJMP 0x0060
0067 940E025F CALL _main
_exit:
0069 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
006A 940E02E6 CALL push_gset2
006C 01B8 MOVW R22,R16
FILE: D:\開(kāi)發(fā)板\OK400C\程序\avr程序\OK400C.H
(0001) /*******************************************
(0002) 文件:OK400C.H
(0003) 功能:定義一些OK400C開(kāi)發(fā)板上應(yīng)用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型號(hào)頭文件
(0007) #include <macros.h> //包含"位"操作頭文件
(0008)
(0009) /******************數(shù)據(jù)類型宏定義******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************數(shù)碼管和LED常量******************/
(0014) #define LEDLK PC5 //LED鎖存器控制端
(0015) #define SEGLK PC6 //數(shù)碼管段選鎖存器控制端
(0016) #define BITLK PC7 //數(shù)碼管位選鎖存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /******************LED點(diǎn)陣對(duì)應(yīng)io口******************/
(0022) #define SDATA_595 PC5 //串行數(shù)據(jù)輸入
(0023) #define SCLK_595 PC6 //移位時(shí)鐘脈沖
(0024) #define RCK_595 PC7 //輸出鎖存器控制脈沖
(0025)
(0026) #define sdat1_595 PC0
(0027) #define sclk1_595 PC1
(0028) #define rck1_595 PC2
(0029) /*******************************************
(0030) 函數(shù)名稱: Delayus
(0031) 功 能: 延時(shí)指定微秒(8M晶振)
(0032) 參 數(shù): US--延時(shí)的微秒數(shù)(大約,不是很精確,MS越大越準(zhǔn)確)
(0033) 返回值 : 無(wú)
(0034) /********************************************/
(0035) void Delayus(uint US)
(0036) {
(0037) uint i;
(0038) US=US*5/4; //5/4是在8MHz晶振下,通過(guò)軟件仿真反復(fù)實(shí)驗(yàn)得到的數(shù)值
006D E005 LDI R16,5
006E E010 LDI R17,0
006F 019B MOVW R18,R22
0070 940E02BF CALL empy16s
0072 01B8 MOVW R22,R16
0073 9576 LSR R23
0074 9567 ROR R22
0075 9576 LSR R23
0076 9567 ROR R22
(0039) for( i=0;i<US;i++);
0077 2744 CLR R20
0078 2755 CLR R21
0079 C002 RJMP 0x007C
007A 5F4F SUBI R20,0xFF
007B 4F5F SBCI R21,0xFF
007C 1746 CP R20,R22
007D 0757 CPC R21,R23
007E F3D8 BCS 0x007A
(0040) }
007F 940E02EA CALL pop_gset2
0081 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
0082 940E02E6 CALL push_gset2
(0041) /*******************************************
(0042) 函數(shù)名稱: Delayms
(0043) 功 能: 延時(shí)指定毫秒(8M晶振)
(0044) 參 數(shù): MS--延時(shí)的毫秒數(shù)
(0045) 返回值 : 無(wú)
(0046) /********************************************/
(0047) void Delayms(uint MS)
(0048) {
(0049) uint i,j;
(0050) for( i=0;i<MS;i++)
0084 2744 CLR R20
0085 2755 CLR R21
0086 C00B RJMP 0x0092
(0051) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通過(guò)軟件仿真反復(fù)實(shí)驗(yàn)得到的數(shù)值
0087 2766 CLR R22
0088 2777 CLR R23
0089 C002 RJMP 0x008C
008A 5F6F SUBI R22,0xFF
008B 4F7F SBCI R23,0xFF
008C 3765 CPI R22,0x75
008D E0E4 LDI R30,4
008E 077E CPC R23,R30
008F F3D0 BCS 0x008A
0090 5F4F SUBI R20,0xFF
0091 4F5F SBCI R21,0xFF
0092 1740 CP R20,R16
0093 0751 CPC R21,R17
0094 F390 BCS 0x0087
(0052) }
0095 940E02EA CALL pop_gset2
0097 9508 RET
(0053) /*******************************************
(0054) 函數(shù)名稱: Board_init
(0055) 功 能: 初始化實(shí)驗(yàn)板,關(guān)閉全部功能
(0056) 參 數(shù): 無(wú)
(0057) 返回值 : 無(wú)
(0058) /********************************************/
(0059) void Board_init(void)
(0060) {
(0061) DDRA=0xFF; //將四個(gè)IO口全部配置為輸出
_Board_init:
0098 EF8F LDI R24,0xFF
0099 BB8A OUT P1A,R24
(0062) DDRB=0xFF;
009A BB87 OUT P17,R24
(0063) DDRC=0xFF;
009B BB84 OUT P14,R24
(0064) DDRD=0xFF;
009C BB81 OUT P11,R24
(0065)
(0066) SPCR=0x00; //還原SPI口,使其為正常端口
009D 2422 CLR R2
009E B82D OUT P0D,R2
(0067)
(0068) PORTC|=BIT(PC3);//(BEEP)關(guān)閉蜂鳴器
009F 9AAB SBI P15,3
(0069) PORTC&=~BIT(PC1); //(RELAY)初始化繼電器為常閉連接狀態(tài)
00A0 98A9 CBI P15,1
(0070) PORTA&=~BIT(PA1); //關(guān)閉SPI總線DA
00A1 98D9 CBI P1B,1
(0071) PORTB=0xFF; //關(guān)閉LED
00A2 BB88 OUT P18,R24
(0072) PORTA|=BIT(LEDLK); //鎖存數(shù)據(jù),使LED熄滅
00A3 9ADD SBI P1B,5
(0073) Delayus(5);
00A4 E005 LDI R16,5
00A5 E010 LDI R17,0
00A6 DFC3 RCALL _Delayus
(0074) PORTA&=~BIT(LEDLK);
00A7 98DD CBI P1B,5
(0075)
(0076) PORTB=0x00; //輸出段選
00A8 2422 CLR R2
00A9 BA28 OUT P18,R2
(0077) PORTA|=BIT(SEGLK);
00AA 9ADE SBI P1B,6
(0078) Delayus(50);
00AB E302 LDI R16,0x32
00AC E010 LDI R17,0
00AD DFBC RCALL _Delayus
(0079) PORTA&=~BIT(SEGLK);
00AE 98DE CBI P1B,6
(0080)
(0081) PORTB=0xFF; //輸出位選
00AF EF8F LDI R24,0xFF
00B0 BB88 OUT P18,R24
(0082) PORTA|=BIT(BITLK);
00B1 9ADF SBI P1B,7
(0083) Delayus(50);
00B2 E302 LDI R16,0x32
00B3 E010 LDI R17,0
00B4 DFB5 RCALL _Delayus
(0084) PORTA&=~BIT(BITLK);
00B5 98DF CBI P1B,7
(0085)
(0086) PORTD=0xFF;
00B6 EF8F LDI R24,0xFF
00B7 BB82 OUT P12,R24
(0087) PORTA|=BIT(PA7);
00B8 9ADF SBI P1B,7
(0088) Delayus(50);
00B9 E302 LDI R16,0x32
00BA E010 LDI R17,0
00BB DFAE RCALL _Delayus
(0089) PORTA&=~BIT(PA7);
00BC 98DF CBI P1B,7
(0090)
(0091)
(0092) }
00BD 9508 RET
FILE: D:\開(kāi)發(fā)板\OK400C\程序\avr程序\26.ds12c887實(shí)時(shí)時(shí)鐘LCD1602顯示\DS12887.C
(0001) /*******************************************
(0002) 文件:hongwai.C
(0003) 環(huán)境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2008年12月10日
(0006) 功能:紅外遙控器數(shù)碼管鍵值顯示
(0007) 備注:
(0008) /******************************************/
(0009) #include <D:\開(kāi)發(fā)板\OK400C\程序\avr程序\OK400C.H>
(0010) #include <stdio.h> //標(biāo)準(zhǔn)輸入輸出頭文件
(0011)
(0012) /* 命令常量定義 */
(0013) #define CMD_START_DS12C887 0x20
(0014) /* 開(kāi)啟時(shí)鐘芯片 */
(0015) #define CMD_START_OSCILLATOR 0x70
(0016) /* 開(kāi)啟振蕩器,處于抑制狀態(tài) */
(0017) #define CMD_CLOSE_DS12C887 0x30
(0018) /* 關(guān)掉時(shí)鐘芯片 */
(0019) /* 所有的置位使用或操作,清除使用與操作 */
(0020) #define MASK_SETB_SET 0x80
(0021) /* 禁止刷新 */
(0022) #define MASK_CLR_SET 0x7f
(0023) /* 使能刷新 */
(0024) #define MASK_SETB_DM 0x04
(0025) /* 使用HEX格式 */
(0026) #define MASK_CLR_DM 0xfb
(0027) /* 使用BCD碼格式 */
(0028) #define MASK_SETB_2412 0x02
(0029) /* 使用24小時(shí)模式 */
(0030) #define MASK_CLR_2412 0xfd
(0031) /* 使用12小時(shí)模式 */
(0032) #define MASK_SETB_DSE 0x01
(0033) /* 使用夏令時(shí) */
(0034) #define MASK_CLR_DSE 0xfe
(0035) /* 不使用夏令時(shí) */
(0036)
(0037) // 寄存器地址通道定義
(0038) #define chSecondsChannel 0X00
(0039) #define chMinutesChannel 0X02
(0040) #define chHoursChannel 0X04
(0041) #define chDofWChannel 0X06
(0042) #define chDateChannel 0X07
(0043) #define chMonthChannel 0X08
(0044) #define chYearChannel 0X09
(0045) #define chCenturyChannel 0X32
(0046) #define chRegA 0X0a
(0047) #define chRegB 0X0b
(0048) #define chRegC 0X0c
(0049) #define chRegD 0X0d
(0050)
(0051) uchar temp_data1[3] = {0x00,0x00,0x00};
(0052) uchar temp_data2[3] = {0x00,0x00,0x00};
(0053) uchar display[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
(0054) /*******************************************
(0055) 函數(shù)名稱: LCD1602_portini
(0056) 功 能: 初始化1602液晶用到的IO口
(0057) 參 數(shù): 無(wú)
(0058) 返回值 : 無(wú)
(0059) /********************************************/
(0060) void LCD1602_portini(void)
(0061) {
(0062) LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管腳為輸出
_LCD1602_portini:
00BE B381 IN R24,P11
00BF 6780 ORI R24,0x70
00C0 BB81 OUT P11,R24
(0063) LCDa_DATA_DDR |= 0xFF;//配置數(shù)據(jù)管腳為輸出
00C1 B38A IN R24,P1A
00C2 6F8F ORI R24,0xFF
00C3 BB8A OUT P1A,R24
(0064) }
00C4 9508 RET
_LCD1602_readbyte:
dByte --> R20
DatCmd --> R20
00C5 940E02CF CALL push_gset1
00C7 2F40 MOV R20,R16
(0065) /*******************************************
(0066) 函數(shù)名稱: LCD1602_readbyte
(0067) 功 能: 從1602液晶讀出一個(gè)字節(jié)數(shù)據(jù)或者指令
(0068) 參 數(shù): DatCmd--為iDat時(shí)是數(shù)據(jù),為iCmd時(shí)是指令
(0069) 返回值 : dByte--讀回的數(shù)據(jù)或者指令
(0070) /********************************************/
(0071) uchar LCD1602_readbyte(uchar DatCmd)
(0072) {
(0073) uchar dByte;
(0074) if (DatCmd == iCmd) //指令操作
00C8 2344 TST R20
00C9 F411 BNE 0x00CC
(0075) LCDa_CLR_RS;
00CA 9895 CBI P12,5
00CB C001 RJMP 0x00CD
(0076) else
(0077) LCDa_SET_RS;
00CC 9A95 SBI P12,5
(0078)
(0079) LCDa_SET_RW; //讀操作
00CD 9A96 SBI P12,6
(0080) LCDa_SET_E;
00CE 9A94 SBI P12,4
(0081) LCDa_DATA_DDR=0x00; //數(shù)據(jù)總線定義為輸入
00CF 2422 CLR R2
00D0 BA2A OUT P1A,R2
(0082) dByte=LCDa_DI; //讀數(shù)據(jù)或者指令
00D1 B349 IN R20,P19
(0083) Delayms(1); //時(shí)序調(diào)整
00D2 E001 LDI R16,1
00D3 E010 LDI R17,0
00D4 DFAD RCALL _Delayms
(0084) LCDa_CLR_E;
00D5 9894 CBI P12,4
(0085) LCDa_DATA_DDR|=0xff; //數(shù)據(jù)總線還原為輸出
00D6 B38A IN R24,P1A
00D7 6F8F ORI R24,0xFF
00D8 BB8A OUT P1A,R24
(0086) return dByte;
00D9 2F04 MOV R16,R20
00DA 940E02D2 CALL pop_gset1
00DC 9508 RET
_LCD1602_sendbyte:
dByte --> R20
DatCmd --> R22
00DD 940E02E6 CALL push_gset2
00DF 2F42 MOV R20,R18
00E0 2F60 MOV R22,R16
(0087) }
(0088) /*******************************************
(0089) 函數(shù)名稱: LCD1602_sendbyte
(0090) 功 能: 向1602液晶寫入一個(gè)字節(jié)數(shù)據(jù)或者指令
(0091) 參 數(shù): DatCmd--為iDat時(shí)是數(shù)據(jù),為iCmd時(shí)是指令
(0092) dByte--為寫入1602的數(shù)據(jù)或者指令
(0093) 返回值 : 無(wú)
(0094) /********************************************/
(0095) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0096) {
(0097) if (DatCmd == iCmd) //指令操作
00E1 2366 TST R22
00E2 F411 BNE 0x00E5
(0098) LCDa_CLR_RS;
00E3 9895 CBI P12,5
00E4 C001 RJMP 0x00E6
(0099) else
(0100) LCDa_SET_RS; //數(shù)據(jù)操作
00E5 9A95 SBI P12,5
(0101)
(0102) LCDa_CLR_RW; //寫操作操作
00E6 9896 CBI P12,6
(0103) LCDa_SET_E;
00E7 9A94 SBI P12,4
(0104) LCDa_DO = dByte; //寫入數(shù)據(jù)
00E8 BB4B OUT P1B,R20
(0105) Delayms(1);
00E9 E001 LDI R16,1
00EA E010 LDI R17,0
00EB DF96 RCALL _Delayms
(0106) LCDa_CLR_E;
00EC 9894 CBI P12,4
(0107) }
00ED 940E02EA CALL pop_gset2
00EF 9508 RET
_LCD1602_sendstr:
ptString --> R20
00F0 940E02CF CALL push_gset1
00F2 01A8 MOVW R20,R16
(0108) /*******************************************
(0109) 函數(shù)名稱: LCD1602_sendstr
(0110) 功 能: 向1602液晶寫入一個(gè)字符串
(0111) 參 數(shù): ptString--字符串指針
(0112) 返回值 : 無(wú)
(0113) /********************************************/
(0114) void LCD1602_sendstr(uchar *ptString)
(0115) {
00F3 C005 RJMP 0x00F9
(0116) while((*ptString)!='\0') //字符串未結(jié)束就一直寫
(0117) {
(0118) LCD1602_sendbyte(iDat, *ptString++);
00F4 01FA MOVW R30,R20
00F5 9121 LD R18,Z+
00F6 01AF MOVW R20,R30
00F7 E001 LDI R16,1
00F8 DFE4 RCALL _LCD1602_sendbyte
00F9 01FA MOVW R30,R20
00FA 8020 LDD R2,0+Z
00FB 2022 TST R2
00FC F7B9 BNE 0x00F4
(0119) }
(0120) }
00FD 940E02D2 CALL pop_gset1
00FF 9508 RET
(0121) /*******************************************
(0122) 函數(shù)名稱: LCD1602_clear
(0123) 功 能: 1602液晶清屏
(0124) 參 數(shù): 無(wú)
(0125) 返回值 : 無(wú)
(0126) /********************************************/
(0127) void LCD1602_clear(void)
(0128) {
(0129) LCD1602_sendbyte(iCmd,LCDa_CLS);//寫入清屏指令
_LCD1602_clear:
0100 E021 LDI R18,1
0101 2700 CLR R16
0102 DFDA RCALL _LCD1602_sendbyte
(0130) Delayms(2);// 清屏指令寫入后,2ms 的延時(shí)是很必要的!!!
0103 E002 LDI R16,2
0104 E010 LDI R17,0
(0131) }
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -