📄 ds12887.lst
字号:
__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:\开发板\OK400C\程序\avr程序\OK400C.H
(0001) /*******************************************
(0002) 文件:OK400C.H
(0003) 功能:定义一些OK400C开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PC5 //LED锁存器控制端
(0015) #define SEGLK PC6 //数码管段选锁存器控制端
(0016) #define BITLK PC7 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /******************LED点阵对应io口******************/
(0022) #define SDATA_595 PC5 //串行数据输入
(0023) #define SCLK_595 PC6 //移位时钟脉冲
(0024) #define RCK_595 PC7 //输出锁存器控制脉冲
(0025)
(0026) #define sdat1_595 PC0
(0027) #define sclk1_595 PC1
(0028) #define rck1_595 PC2
(0029) /*******************************************
(0030) 函数名称: Delayus
(0031) 功 能: 延时指定微秒(8M晶振)
(0032) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0033) 返回值 : 无
(0034) /********************************************/
(0035) void Delayus(uint US)
(0036) {
(0037) uint i;
(0038) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
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) 函数名称: Delayms
(0043) 功 能: 延时指定毫秒(8M晶振)
(0044) 参 数: MS--延时的毫秒数
(0045) 返回值 : 无
(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晶振下,通过软件仿真反复实验得到的数值
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) 函数名称: Board_init
(0055) 功 能: 初始化实验板,关闭全部功能
(0056) 参 数: 无
(0057) 返回值 : 无
(0058) /********************************************/
(0059) void Board_init(void)
(0060) {
(0061) DDRA=0xFF; //将四个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)关闭蜂鸣器
009F 9AAB SBI P15,3
(0069) PORTC&=~BIT(PC1); //(RELAY)初始化继电器为常闭连接状态
00A0 98A9 CBI P15,1
(0070) PORTA&=~BIT(PA1); //关闭SPI总线DA
00A1 98D9 CBI P1B,1
(0071) PORTB=0xFF; //关闭LED
00A2 BB88 OUT P18,R24
(0072) PORTA|=BIT(LEDLK); //锁存数据,使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:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
(0001) /*******************************************
(0002) 文件:hongwai.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2008年12月10日
(0006) 功能:红外遥控器数码管键值显示
(0007) 备注:
(0008) /******************************************/
(0009) #include <D:\开发板\OK400C\程序\avr程序\OK400C.H>
(0010) #include <stdio.h> //标准输入输出头文件
(0011)
(0012) /* 命令常量定义 */
(0013) #define CMD_START_DS12C887 0x20
(0014) /* 开启时钟芯片 */
(0015) #define CMD_START_OSCILLATOR 0x70
(0016) /* 开启振荡器,处于抑制状态 */
(0017) #define CMD_CLOSE_DS12C887 0x30
(0018) /* 关掉时钟芯片 */
(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小时模式 */
(0030) #define MASK_CLR_2412 0xfd
(0031) /* 使用12小时模式 */
(0032) #define MASK_SETB_DSE 0x01
(0033) /* 使用夏令时 */
(0034) #define MASK_CLR_DSE 0xfe
(0035) /* 不使用夏令时 */
(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) 函数名称: LCD1602_portini
(0056) 功 能: 初始化1602液晶用到的IO口
(0057) 参 数: 无
(0058) 返回值 : 无
(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;//配置数据管脚为输出
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) 函数名称: LCD1602_readbyte
(0067) 功 能: 从1602液晶读出一个字节数据或者指令
(0068) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0069) 返回值 : dByte--读回的数据或者指令
(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; //数据总线定义为输入
00CF 2422 CLR R2
00D0 BA2A OUT P1A,R2
(0082) dByte=LCDa_DI; //读数据或者指令
00D1 B349 IN R20,P19
(0083) Delayms(1); //时序调整
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; //数据总线还原为输出
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) 函数名称: LCD1602_sendbyte
(0090) 功 能: 向1602液晶写入一个字节数据或者指令
(0091) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0092) dByte--为写入1602的数据或者指令
(0093) 返回值 : 无
(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; //数据操作
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; //写入数据
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) 函数名称: LCD1602_sendstr
(0110) 功 能: 向1602液晶写入一个字符串
(0111) 参 数: ptString--字符串指针
(0112) 返回值 : 无
(0113) /********************************************/
(0114) void LCD1602_sendstr(uchar *ptString)
(0115) {
00F3 C005 RJMP 0x00F9
(0116) while((*ptString)!='\0') //字符串未结束就一直写
(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) 函数名称: LCD1602_clear
(0123) 功 能: 1602液晶清屏
(0124) 参 数: 无
(0125) 返回值 : 无
(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 的延时是很必要的!!!
0103 E002 LDI R16,2
0104 E010 LDI R17,0
(0131) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -