?? ds12887.s
字號:
.module DS12887.C
.area text(rom, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\OK400C.H
.dbfunc e Delayus _Delayus fV
; i -> R20,R21
; US -> R22,R23
.even
_Delayus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 36
; /*******************************************
; 文件:hongwai.C
; 環境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2008年12月10日
; 功能:紅外遙控器數碼管鍵值顯示
; 備注:
; /******************************************/
; #include <D:\開發板\OK400C\程序\avr程序\OK400C.H>
; #include <stdio.h> //標準輸入輸出頭文件
;
; /* 命令常量定義 */
; #define CMD_START_DS12C887 0x20
; /* 開啟時鐘芯片 */
; #define CMD_START_OSCILLATOR 0x70
; /* 開啟振蕩器,處于抑制狀態 */
; #define CMD_CLOSE_DS12C887 0x30
; /* 關掉時鐘芯片 */
; /* 所有的置位使用或操作,清除使用與操作 */
; #define MASK_SETB_SET 0x80
; /* 禁止刷新 */
; #define MASK_CLR_SET 0x7f
; /* 使能刷新 */
; #define MASK_SETB_DM 0x04
; /* 使用HEX格式 */
; #define MASK_CLR_DM 0xfb
; /* 使用BCD碼格式 */
; #define MASK_SETB_2412 0x02
; /* 使用24小時模式 */
; #define MASK_CLR_2412 0xfd
; /* 使用12小時模式 */
; #define MASK_SETB_DSE 0x01
; /* 使用夏令時 */
; #define MASK_CLR_DSE 0xfe
; /* 不使用夏令時 */
;
.dbline 38
; // 寄存器地址通道定義
; #define chSecondsChannel 0X00
ldi R16,5
ldi R17,0
movw R18,R22
xcall empy16s
movw R22,R16
lsr R23
ror R22
lsr R23
ror R22
.dbline 39
clr R20
clr R21
xjmp L5
L2:
.dbline 39
L3:
.dbline 39
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 39
; #define chMinutesChannel 0X02
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 40
; #define chHoursChannel 0X04
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r US 22 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
xcall push_gset2
.dbline -1
.dbline 48
; #define chDofWChannel 0X06
; #define chDateChannel 0X07
; #define chMonthChannel 0X08
; #define chYearChannel 0X09
; #define chCenturyChannel 0X32
; #define chRegA 0X0a
; #define chRegB 0X0b
; #define chRegC 0X0c
.dbline 50
; #define chRegD 0X0d
;
clr R20
clr R21
xjmp L10
L7:
.dbline 51
clr R22
clr R23
xjmp L14
L11:
.dbline 51
L12:
.dbline 51
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 51
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L11
L8:
.dbline 50
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 50
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
.dbline 52
; uchar temp_data1[3] = {0x00,0x00,0x00};
; uchar temp_data2[3] = {0x00,0x00,0x00};
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e Board_init _Board_init fV
.even
_Board_init::
.dbline -1
.dbline 60
; uchar display[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
; /*******************************************
; 函數名稱: LCD1602_portini
; 功 能: 初始化1602液晶用到的IO口
; 參 數: 無
; 返回值 : 無
; /********************************************/
; void LCD1602_portini(void)
.dbline 61
; {
ldi R24,255
out 0x1a,R24
.dbline 62
; LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管腳為輸出
out 0x17,R24
.dbline 63
; LCDa_DATA_DDR |= 0xFF;//配置數據管腳為輸出
out 0x14,R24
.dbline 64
; }
out 0x11,R24
.dbline 66
; /*******************************************
; 函數名稱: LCD1602_readbyte
clr R2
out 0xd,R2
.dbline 68
; 功 能: 從1602液晶讀出一個字節數據或者指令
; 參 數: DatCmd--為iDat時是數據,為iCmd時是指令
sbi 0x15,3
.dbline 69
; 返回值 : dByte--讀回的數據或者指令
cbi 0x15,1
.dbline 70
; /********************************************/
cbi 0x1b,1
.dbline 71
; uchar LCD1602_readbyte(uchar DatCmd)
out 0x18,R24
.dbline 72
; {
sbi 0x1b,5
.dbline 73
; uchar dByte;
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 74
; if (DatCmd == iCmd) //指令操作
cbi 0x1b,5
.dbline 76
; LCDa_CLR_RS;
; else
clr R2
out 0x18,R2
.dbline 77
; LCDa_SET_RS;
sbi 0x1b,6
.dbline 78
;
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 79
; LCDa_SET_RW; //讀操作
cbi 0x1b,6
.dbline 81
; LCDa_SET_E;
; LCDa_DATA_DDR=0x00; //數據總線定義為輸入
ldi R24,255
out 0x18,R24
.dbline 82
; dByte=LCDa_DI; //讀數據或者指令
sbi 0x1b,7
.dbline 83
; Delayms(1); //時序調整
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 84
; LCDa_CLR_E;
cbi 0x1b,7
.dbline 86
; LCDa_DATA_DDR|=0xff; //數據總線還原為輸出
; return dByte;
ldi R24,255
out 0x12,R24
.dbline 87
; }
sbi 0x1b,7
.dbline 88
; /*******************************************
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 89
; 函數名稱: LCD1602_sendbyte
cbi 0x1b,7
.dbline -2
.dbline 92
; 功 能: 向1602液晶寫入一個字節數據或者指令
; 參 數: DatCmd--為iDat時是數據,為iCmd時是指令
; dByte--為寫入1602的數據或者指令
L15:
.dbline 0 ; func end
ret
.dbend
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\OK400C.H
_temp_data1::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\OK400C.H
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\OK400C.H
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.dbsym e temp_data1 _temp_data1 A[3:3]c
_temp_data2::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.dbsym e temp_data2 _temp_data2 A[3:3]c
_display::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.dbsym e display _display A[6:6]c
.area text(rom, con, rel)
.dbfile D:\開發板\OK400C\程序\avr程序\26.ds12c887實時時鐘LCD1602顯示\DS12887.C
.dbfunc e LCD1602_portini _LCD1602_portini fV
.even
_LCD1602_portini::
.dbline -1
.dbline 61
.dbline 62
in R24,0x11
ori R24,112
out 0x11,R24
.dbline 63
in R24,0x1a
ori R24,255
out 0x1a,R24
.dbline -2
.dbline 64
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
; dByte -> R20
; DatCmd -> R20
.even
_LCD1602_readbyte::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 72
.dbline 74
tst R20
brne L18
.dbline 75
cbi 0x12,5
xjmp L19
L18:
.dbline 77
sbi 0x12,5
L19:
.dbline 79
sbi 0x12,6
.dbline 80
sbi 0x12,4
.dbline 81
clr R2
out 0x1a,R2
.dbline 82
in R20,0x19
.dbline 83
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 84
cbi 0x12,4
.dbline 85
in R24,0x1a
ori R24,255
out 0x1a,R24
.dbline 86
mov R16,R20
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dByte 20 c
.dbsym r DatCmd 20 c
.dbend
.dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
; dByte -> R20
; DatCmd -> R22
.even
_LCD1602_sendbyte::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 96
; 返回值 : 無
; /********************************************/
; void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
; {
.dbline 97
; if (DatCmd == iCmd) //指令操作
tst R22
brne L21
.dbline 98
; LCDa_CLR_RS;
cbi 0x12,5
xjmp L22
L21:
.dbline 100
; else
; LCDa_SET_RS; //數據操作
sbi 0x12,5
L22:
.dbline 102
;
; LCDa_CLR_RW; //寫操作操作
cbi 0x12,6
.dbline 103
; LCDa_SET_E;
sbi 0x12,4
.dbline 104
; LCDa_DO = dByte; //寫入數據
out 0x1b,R20
.dbline 105
; Delayms(1);
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 106
; LCDa_CLR_E;
cbi 0x12,4
.dbline -2
.dbline 107
; }
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r dByte 20 c
.dbsym r DatCmd 22 c
.dbend
.dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
; ptString -> R20,R21
.even
_LCD1602_sendstr::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 115
; /*******************************************
; 函數名稱: LCD1602_sendstr
; 功 能: 向1602液晶寫入一個字符串
; 參 數: ptString--字符串指針
; 返回值 : 無
; /********************************************/
; void LCD1602_sendstr(uchar *ptString)
; {
xjmp L25
L24:
.dbline 117
.dbline 118
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,1
xcall _LCD1602_sendbyte
.dbline 119
L25:
.dbline 116
; while((*ptString)!='\0') //字符串未結束就一直寫
movw R30,R20
ldd R2,z+0
tst R2
brne L24
.dbline -2
.dbline 120
; {
; LCD1602_sendbyte(iDat, *ptString++);
; }
; }
L23:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ptString 20 pc
.dbend
.dbfunc e LCD1602_clear _LCD1602_clear fV
.even
_LCD1602_clear::
.dbline -1
.dbline 128
; /*******************************************
; 函數名稱: LCD1602_clear
; 功 能: 1602液晶清屏
; 參 數: 無
; 返回值 : 無
; /********************************************/
; void LCD1602_clear(void)
; {
.dbline 129
; LCD1602_sendbyte(iCmd,LCDa_CLS);//寫入清屏指令
ldi R18,1
clr R16
xcall _LCD1602_sendbyte
.dbline 130
; Delayms(2);// 清屏指令寫入后,2ms 的延時是很必要的!!!
ldi R16,2
ldi R17,0
.dbline -2
.dbline 131
; }
L27:
.dbline 0 ; func end
xjmp _Delayms
.dbend
.dbfunc e LCD1602_readBF _LCD1602_readBF fc
; busy -> R20
.even
_LCD1602_readBF::
xcall push_gset1
.dbline -1
.dbline 139
; /*******************************************
; 函數名稱: LCD1602_readBF
; 功 能: 1602液晶清屏
; 參 數: 無
; 返回值 : busy--為1時是忙狀態,為0時可以接收指令
; /********************************************/
; uchar LCD1602_readBF(void)
; {
.dbline 141
; uchar busy;
; busy=LCD1602_readbyte(iCmd); //讀回BF標志(忙標志)和地址
clr R16
xcall _LCD1602_readbyte
mov R20,R16
.dbline 142
; if(busy&0x80) //如果忙返回正在忙的狀態
sbrs R16,7
rjmp L29
.dbline 143
; busy=1;
ldi R20,1
xjmp L30
L29:
.dbline 145
; else //如果不忙,可以寫入
; busy=0;
clr R20
L30:
.dbline 146
; return busy;
mov R16,R20
.dbline -2
L28:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r busy 20 c
.dbend
.dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
; Col -> R20
; Row -> R22
.even
_LCD1602_gotoXY::
xcall push_gset2
mov R20,R18
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -