找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2442|回复: 1
收起左侧

atmega16单片机寄存器配置介绍 这个程序比查看手册方便多了

[复制链接]
ID:342822 发表于 2021-12-26 10:35 | 显示全部楼层 |阅读模式
网上找到的,这个比查看手册方便多了。
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
//#include <iom16v.h>
//#include <macros.h>

void initialize()
{
    // DDRx端口方向寄存器,PORTx数据寄存器,PINx输入引脚寄存器
    // DDRxn相应位为1,引脚为输出否则为输入
    // PORTxn为1时,上拉电阻使能
    DDRA = 0x00;
}

void init_adc()
{
    // ADMUX
    // -----------------------------------------------------------------
    // | REFS1 | REFS0 | ADLAR |  MUX4 |  MUX3 |  MUX2 |  MUX1 |  MUX0 |
    // -----------------------------------------------------------------
    // REFS1 REFS0: 00,使用AREF,内部参考电压关闭
    //              01,AVCC、AREF引脚外加滤波电容
    //                 10,保留
    //                 11,2.56V片内基准电压,AREF引脚外加滤波电容
    // ADLAR: ADC转换结果左对齐
    //  MUX4 ~  MUX0   单端输入  正差分输入   负差分输入   增益
    // 00000 ~ 00111  ADC0~ADC7
    //   01000                   ADC0         ADC0         10x
    //   01001                   ADC1         ADC0         10x
    //   01010                   ADC0         ADC0        200x                  
    //   01011                   ADC1         ADC0        200x
    //   01100                   ADC2         ADC2         10x
    //   01101                   ADC3         ADC2         10x
    //   01110                   ADC2         ADC2        200x
    //   01111                   ADC3         ADC2        200x
    //   10000                   ADC0         ADC1          1x
    //   10001                   ADC1         ADC1          1x
    //   10010                   ADC2         ADC1          1x
    //   10011                   ADC3         ADC1          1x
    //   10100                   ADC4         ADC1          1x
    //   10101                   ADC5         ADC1          1x
    //   10110                   ADC6         ADC1          1x
    //   10111                   ADC7         ADC1          1x
    //   11000                   ADC0         ADC2          1x
    //   11001                   ADC1         ADC2          1x
    //   11010                   ADC2         ADC2          1x
    //   11011                   ADC3         ADC2          1x
    //   11100                   ADC4         ADC2          1x
    //   11101                   ADC5         ADC2          1x
    //   11110       1.23V(VBG)
    //   11111        0V(GND)                                                                                                                                    
     ADMUX = 0;

    // ADCSRA
    // -----------------------------------------------------------------
    // |  ADEN |  ADSC |  ADFR |  ADIF |  ADIE | ADPS2 | ADPS1 | ADPS0 |
    // -----------------------------------------------------------------
    // ADEN:ADC使能,转换过程中禁止ADC则立即中止转换。
    // ADSC:ADC开始转换。在转换过程中ADSC为1直到转换结束。
    // ADFR:是否工作在连续模式,该位写0,停止连续转换模式。
    // ADIF:ADC中断标志。中断服务硬件清零。
    // ADIE:ADC中断使能
    // ADSP2 ~ ADSP0:ADC预分频选择  000:2分频,001到111为2到128分频
    //               ADC在50~200KHz时钟时能获得最大精度
    ADCSRA = 0;

    // ADCC & ADCH
    // ADC转换结果寄存器,差分通道结果以2的补码形式表示,ADC数据必须读过
    // ADCH后才可进行数据更新。对于精度小于8位的左对齐数据可只读ADCH。
    // 数据右对齐(ADLAR = 0)
    // ADCH-------------------------------------------------------------
    // |   -   |   -   |   -   |   -   |   -   |   -   |  ADC9 |  ADC8 |
    // -----------------------------------------------------------------
    // ADCL-------------------------------------------------------------
    // |  ADC7 |  ADC6 |  ADC5 |  ADC4 |  ADC3 |  ADC2 |  ADC1 |  ADC0 |
    // -----------------------------------------------------------------
    //
}

void init_timer()
{

    //SFIOR
    // -----------------------------------------------------------------
    // |  TSM  |   -   |   -   |   -   |  ACME |  PUD  |  PSR0 | PSR321|
    // -----------------------------------------------------------------
    // TSM: T/C同步模式。置位时,PSR0和PSR321保持其数据直到被更新或TSM被清零
    // PSR0:T/C0预分频器复位,置位时使预频器复位,直到为0时表示复位完成
    // PSR321: T/C3、2、1预分频繁器复位,此位读总为0
    // ACME: 模拟比较器使能
    // PUD: 所有端口上拉电阻禁止,置1为禁止
    SFIOR = 0;

}
void init_timer0()
{
    //TCCR0 T/C0控制寄存器
    // -----------------------------------------------------------------
    // |  FOC0 | WGM00 | COM01 | COM00 | WGM01 |  CS02 |  CS01 |  CS00 |
    // -----------------------------------------------------------------
    // FOC0:强制输出比较启动
    // WGM01, WGM00: 工作模式选择
    //              00:普通模式,01:PWM相位修正,
    //              10:比较匹配时清除计数器模式(CTC模式),11:快速PWM
    // COM01, COM00: 比较匹配时的输出模式
    //          WGMxx为普通模式或CTC模式时
    //              00:OC0未连接,
    //              01:OC0取反,
    //              10:OC0清零,
    //              11:OC0置位
    //          WGMxx为相位修正PWM模式
    //              00:OC0未连接,
    //              01:保留,
    //              10:升序匹配时清零OC0;降序匹配时置位OC0,
    //              11:升序匹配时置位OC0;降序匹配时清零OC0
    //          WGMxx为快速PWM模式
    //              00:OC0未连接
    //              01:保留
    //              10:匹配时OC0清零;计数到TOP时OC0置位
    //              11:匹配时OC0置位;计数到TOP时OC0清零
    // CS02,CS01,CS00:T/C0时钟预分频选择
    //              000:无时钟,T/C不工作     001:1/1
    //              010:1/8     011:1/32     100:1/64
    //              101:1/128   110:1/256    111:1/1024
    TCCR0 = 0;

    //TCNT0 T/C0计数寄存器,8位

    //OCR0 输出比较寄存器,8位

    //TIMSK T/C中断屏蔽寄存器
    // -----------------------------------------------------------------
    // | OCIE2 | TOIE2 | TICIE1| OCIE1A| OCIE1B| TOIE1 | OCIE0 | TOIE0 |
    // -----------------------------------------------------------------
    // OCIE2:T/C2输出比较匹配中断使能
    // TOIE2:T/C2溢出中断使能
    // TICIE1:T/C1输入捕捉中断使能
    // OCIE1A:T/C1输出比较A匹配中断使能
    // OCIE1B:T/C1输出比较B匹配中断使能
    // TOIE1:T/C1溢出中断使能
    // OCIE0:T/C0输出比较匹配中断使能
    // TOIE0:T/C0溢出中断使能
    TIMSK = 0;

    //ETIMSK T/C扩展中断屏蔽寄存器
    // -----------------------------------------------------------------
    // |   -   |   -   | TICIE3| OCIE3A| OCIE3B| TOIE3 | OCIE3C| OCIE1C|
    // -----------------------------------------------------------------
    // TICIE3:T/C3输入捕捉中断使能
    // OCIE3A:T/C3输出比较A匹配中断使能
    // OCIE3B:T/C3输出比较B匹配中断使能
    // TOIE3:T/C3溢出中断使能
    // OCIE3C:T/C3输出比较C匹配中断使能
    // OCIE1C:T/C1输出比较C匹配中断使能
//ETIMSK = 0;


    //TIFR T/C中断标志寄存器
    // -----------------------------------------------------------------
    // |  OCF2 |  TOV2 |  ICF1 | OCF1A | OCF1B |  TOV1 |  OCF0 |  TOV0 |
    // -----------------------------------------------------------------
    // OCF2:T/C2输出比较匹配标志
    // TOV2:T/C2溢出标志
    // ICF1:T/C1输入捕捉标志位
    // OCF1A:T/C1输出比较A匹配标志位
    // OCF1B:T/C1输出比较B匹配标志位
    // TOV1:T/C1溢出标志
    // OCF0:T/C0输出比较匹配标志
    // TOV0:T/C0溢出标志


    //ETIFR 扩展的T/C中断标志寄存器
    // -----------------------------------------------------------------
    // |   -   |   -   |  ICF3 | OCF3A | OCF3B |  TOV3 | OCF3C | OCF1C |
    // -----------------------------------------------------------------
    // ICF3:T/C3输入捕捉匹配标志位
    // OCF3A:T/C3输出比较A匹配标志位
    // OCF3B:T/C3输出比较B匹配标志位
    // TOV3:T/C3溢出标志位
    // OCF3C:T/C3输出比较C匹配标志位
    // OCF1C:T/C1输出比较C匹配标志位



    //ASSR T/C0异步状态寄存器
    // -----------------------------------------------------------------
    // |   -   |   -   |   -   |   -   |  AS0  | TCN0UB| OCR0UB| TCR0UB|
    // -----------------------------------------------------------------
    // AS0:T/C0使用外部时钟
    // TCN0UB:TCNT0更新中,写TCNT0时将置位,为0时表明TCNT0可以写入新值
    // OCR0UB:OCR0更新中,写OCR0时将置位,为0表明OCR0可以写入新值
    // TCR0UB:TCCR0更新中,写TCCR0时将置位,为0表明TCCR0可以写入新值
    ASSR = 0;
}

void init_timer2()
{   

    //TCCR2 T/C2控制寄存器
    // -----------------------------------------------------------------
    // |  FOC2 | WGM20 | COM21 | COM20 | WGM21 |  CS22 |  CS21 |  CS20 |
    // -----------------------------------------------------------------
    // FOC2:强制输出比较启动
    // WGM21, WGM20: 工作模式选择
    //              00:普通模式,01:PWM相位修正,
    //              10:比较匹配时清除计数器模式(CTC模式),11:快速PWM
    // COM21, COM20: 比较匹配时的输出模式
    //          WGMxx为普通模式或CTC模式时
    //              00:OC0未连接,
    //              01:OC0取反,
    //              10:OC0清零,
    //              11:OC0置位
    //          WGMxx为相位修正PWM模式
    //              00:OC0未连接,
    //              01:保留,
    //              10:升序匹配时清零OC0;降序匹配时置位OC0,
    //              11:升序匹配时置位OC0;降序匹配时清零OC0
    //          WGMxx为快速PWM模式
    //              00:OC0未连接
    //              01:保留
    //              10:匹配时OC0清零;计数到TOP时OC0置位
    //              11:匹配时OC0置位;计数到TOP时OC0清零
    // CS22,CS21,CS20:T/C0时钟预分频选择
    //              000:无时钟,T/C不工作     001:1/1
    //              010:1/8     011:1/32     100:1/64
    //              101:1/128   110:1/256    111:1/1024
    TCCR2 = 0;

    //TCNT2 T/C2计数寄存器,8位

    //OCR2 T/C2比较寄存器,8位
}

void init_timer1()
{
    //TCCR1A T/C1控制寄存器A
    // -----------------------------------------------------------------
    // | COM1A1| COM1A0| COM1B1| COM1B0| COM1C1| COM1C0| WGM11 | WGM10 |
    // -----------------------------------------------------------------
    //TCCR1B T/C1控制寄存器B
    // -----------------------------------------------------------------
    // | ICNC1 | ICES1 |   -   | WGM13 | WGM12 |  CS12 |  CS11 |  CS10 |
    // -----------------------------------------------------------------
    //TCCR1C T/C1控制寄存器C
    // -----------------------------------------------------------------
    // | FOC1A | FOC1B | FOC1C |   -   |   -   |   -   |   -   |   -   |
    // -----------------------------------------------------------------
    // COM1A1,COM1A0:通道A的比较输出模式
    // COM1B1,COM1B0:通道B的比较输出模式
    // COM1C1,COM1C0:通道C的比较输出模式
    // WGM13,WGM12,WGM11,WGM10:波型发生模式:
    //              比较输出模式(CTC模式),非PWM
    //                  00  普通端口操作,OC1A/OC1B/OC1C未连接
    //                  01  比较匹配时OC1A/OC1B/OC1C电平取反
    //                  10  比较匹配时清零OC1A/OC1B/OC1C(输出低电平)
    //                  11  比较匹配时置位OC1A/OC1B/OC1C(输出高电平)
    //              比较输出模式(CTC模式),快速PWM
    //                  00  普通端口操作,OC1A/OC1B/OC1C未连接
    //                  01  WGM13为0时同上,为1时 比较匹配时 OC1A电平取反,OC1B/OC1C保留
    //                  10  比较匹配时OC1A/OC1B/OC1C清零,在TOP时OC1A/OC1B/OC1C置位
    //                  11  比较匹配时OC1A/OC1B/OC1C置位,在TOP时OC1A/OC1B/OC1C清零
    //              比较输出模式(CTC模式),相位修正及相频修正PWM
    //                  00  普通端口操作,OC1A/OC1B/OC1C未连接
    //                  01  WGM13为0:同上,为1时 比较匹配时 OC1A电平取反,OC1B/OC1C保留
    //                  10  升序计数匹配时将OC1A/OC1B/OC1C清零,降序计数匹配时将OC1A/OC1B/OC1C置位
    //                  11  升序计数匹配时将OC1A/OC1B/OC1C置位,降序计数匹配时将OC1A/OC1B/OC1C清零
    //
    //   模式 WGM1x   工作模式说明     TOP   OCR1x更新时刻  TOVn置位时刻
    //     0   0000       普通模式    0xFFFF        立即            MAX
    //     1   0001   8位相位修正PWM  0x00FF         TOP         BOTTOM
    //     2   0010   9位相位修正PWM  0x01FF         TOP         BOTTOM
    //     3   0011  10位相位修正PWM  0x03FF         TOP         BOTTOM
    //     4   0100              CTC   OCRnA        立即            MAX
    //     5   0101       8位快速PWM  0x00FF         TOP            TOP
    //     6   0110       9位快速PWM  0x01FF         TOP            TOP
    //     7   0111      10位快速PWM  0x03FF         TOP            TOP
    //     8   1000  相位频率修正PWM    ICRn      BOTTOM         BOTTOM
    //     9   1001  相位频率修正PWM   OCRnA      BOTTOM         BOTTOM
    //    10   1010      相位修正PWM    ICRn         TOP         BOTTOM
    //    11   1011      相位修正PWM   OCRnA         TOP         BOTTOM
    //    12   1100              CTC    ICRn        立即            MAX
    //    13   1101             保留      -          -               -
    //    14   1110          快速PWM    ICRn         TOP            TOP
    //    15   1111          快速PWM   OCRnA         TOP            TOP
    // ICNC1:使能/禁止输入捕捉噪声抑制器
    // ICES1:输入捕获触发沿选择,0为下降沿触发,1为上升沿触发
    // CS12,CS11,CS10:T/C0时钟预分频选择
    //              000:无时钟,T/C不工作     001:1/1
    //              010:1/8     011:1/64     100:1/256
    //              101:1/1024  110:外部T1脚下降沿驱动    111:外部T1脚上升沿驱动
    // FOC1A,FOC1B,FOC1C:强制输出比较通道A,B,C
    TCCR1A =0; TCCR1B =0; //TCCR1C = 0;
   //TCNT1H,TCNT1L 定时/计数器1

    //OCR1AH,OCR1AL 输出比较寄存器1A
    //OCR1BH,OCR1BL 输出比较寄存器1B
    //OCR1CH,OCR1CL 输出比较寄存器1C

    //ICR1H,ICR1L 输入捕捉寄存器1

}

void init_timer3()
{
    //TCCR3A T/C3控制寄存器A
    // -----------------------------------------------------------------
    // | COM3A1| COM3A0| COM3B1| COM3B0| COM3C1| COM3C0| WGM31 | WGM30 |
    // -----------------------------------------------------------------
    //TCCR3B T/C3控制寄存器B
    // -----------------------------------------------------------------
    // | ICNC3 | ICES3 |   -   | WGM33 | WGM32 |  CS32 |  CS31 |  CS30 |
    // -----------------------------------------------------------------
    //TCCR3C T/C3控制寄存器C
    // -----------------------------------------------------------------
    // | FOC3A | FOC3B | FOC3C |   -   |   -   |   -   |   -   |   -   |
    // -----------------------------------------------------------------
    // COM3A1,COM3A0:通道A的比较输出模式
    // COM3B1,COM3B0:通道B的比较输出模式
    // COM3C1,COM3C0:通道C的比较输出模式
    // WGM33,WGM32,WGM31,WGM30:波型发生模式:
    //              比较输出模式(CTC模式),非PWM
    //                  00  普通端口操作,OC3A/OC3B/OC3C未连接
    //                  01  比较匹配时OC3A/OC3B/OC3C电平取反
    //                  10  比较匹配时清零OC3A/OC3B/OC3C(输出低电平)
    //                  11  比较匹配时置位OC3A/OC3B/OC3C(输出高电平)
    //              比较输出模式(CTC模式),快速PWM
    //                  00  普通端口操作,OC3A/OC3B/OC3C未连接
    //                  01  WGM13为0时同上,为1时 比较匹配时 OC3A电平取反,OC3B/OC3C保留
    //                  10  比较匹配时OC3A/OC3B/OC3C清零,在TOP时OC3A/OC3B/OC3C置位
    //                  11  比较匹配时OC3A/OC3B/OC3C置位,在TOP时OC3A/OC3B/OC3C清零
    //              比较输出模式(CTC模式),相位修正及相频修正PWM
    //                  00  普通端口操作,OC3A/OC3B/OC3C未连接
    //                  01  WGM13为0:同上,为1时 比较匹配时 OC3A电平取反,OC3B/OC3C保留
    //                  10  升序计数匹配时将OC3A/OC3B/OC3C清零,降序计数匹配时将OC3A/OC3B/OC3C置位
    //                  11  升序计数匹配时将OC3A/OC3B/OC3C置位,降序计数匹配时将OC3A/OC3B/OC3C清零
    //
    //   模式 WGM3x   工作模式说明     TOP   OCR1x更新时刻  TOVn置位时刻
    //     0   0000       普通模式    0xFFFF        立即            MAX
    //     1   0001   8位相位修正PWM  0x00FF         TOP         BOTTOM
    //     2   0010   9位相位修正PWM  0x01FF         TOP         BOTTOM
    //     3   0011  10位相位修正PWM  0x03FF         TOP         BOTTOM
    //     4   0100              CTC   OCRnA        立即            MAX
    //     5   0101       8位快速PWM  0x00FF         TOP            TOP
    //     6   0110       9位快速PWM  0x01FF         TOP            TOP
    //     7   0111      10位快速PWM  0x03FF         TOP            TOP
    //     8   1000  相位频率修正PWM    ICRn      BOTTOM         BOTTOM
    //     9   1001  相位频率修正PWM   OCRnA      BOTTOM         BOTTOM
    //    10   1010      相位修正PWM    ICRn         TOP         BOTTOM
    //    11   1011      相位修正PWM   OCRnA         TOP         BOTTOM
    //    12   1100              CTC    ICRn        立即            MAX
    //    13   1101             保留      -          -               -
    //    14   1110          快速PWM    ICRn         TOP            TOP
    //    15   1111          快速PWM   OCRnA         TOP            TOP
    // ICNC3:使能/禁止输入捕捉噪声抑制器
    // ICES3:输入捕获触发沿选择,0为下降沿触发,1为上升沿触发
    // CS32,CS31,CS30:T/C0时钟预分频选择
    //              000:无时钟,T/C不工作     001:1/1
    //              010:1/8     011:1/64     100:1/256
    //              101:1/1024  110:外部T1脚下降沿驱动    111:外部T1脚上升沿驱动
    // FOC3A,FOC3B,FOC3C:强制输出比较通道A,B,C
//    TCCR3A = TCCR3B = TCCR3C = 0;

    //TCNT3H,TCNT3L 定时/计数器3

    //OCR3AH,OCR3AL 输出比较寄存器3A
    //OCR3BH,OCR3BL 输出比较寄存器3B
    //OCR3CH,OCR3CL 输出比较寄存器3C

    //ICR3H,ICR3L 输入捕捉寄存器3
}


void init_uart(void)
{
    //UDRn USART I/O数据寄存器, 不可用读修改写命令操作, 否则会改变FIFO状态

    //UCSRnA USART控制和状态寄存器A
    // -----------------------------------------------------------------
    // |  RXCn |  TXCn | UDREn |  FEn  |  DORn |  UPEn |  U2Xn | MPCMn |
    // -----------------------------------------------------------------
    // RXCn:USART接收结束标志
    // TXCn:USART发送结束标志,写1可清除
    // UDREn:USART数据寄存器为空标志,只有该标志为1才数据才可写入UDR0
    // FEn:帧错误,未正确收到停止位
    // DORn:数据过速
    // UPEn:奇偶效验错误
    // U2Xn:倍速发送,仅对异步操作有影响
    // MPCMn:多处理器通讯模式

    //UCSRnB USART控制和状态寄存器B
    // -----------------------------------------------------------------
    // | RXCIEn| TXCIEn| UDRIEn| RXENn | TXENn | UCSZn2| RXB8n | TXB8n |
    // -----------------------------------------------------------------
    // RXCIEn:接收结束中断使能
    // TXCIEn:发送结束中断使能
    // UDRIEn:USART数据寄存器空中使能
    // RXENn:接收使能
    // TXENn:发送使能
    // UCSZn2:字符长度,具体见下面
    // RXB8n:接收数据位8
    // TXB8n:发送数据位8

    //UCSRxC USART控制和状态寄存器C
    // -----------------------------------------------------------------
    // |   -   | UMSELn| UPMn1 | UPMn0 | USBSn | UCSZn1| UCXZn0| UCPOLn|
    // -----------------------------------------------------------------
    // UMSELn:模式选择,0为异步操作,1为同步操作
    // UPMn1,UPMn0:奇偶效验模式,00禁止,01保留,10偶效验,11奇校验
    // USBSn:停止位选择,0为1位停止位,1为2位停止位
    // UCSZn2,UCSZn0:字符长度,000为5位, 001为 6位,010为7位, 011为8位
    //                         100为保留,101为保留,110为保留,111为9位
    // UCPOLn:时钟极性,(异步模式应清零)
    //                              UCPOL0   发送数据位置   接收数据位置
    //                                0        XCK0上升沿    XCK0下降沿
    //                                1        XCK0下降沿    XCK0上升沿

    //UBRRnL和UBRRnH USART波特率寄存器, UBRRnH15:12为保留位:
    // -----------------------------------------------------------------
    // |   -   |   -   |   -   |   -   | BIT11 | BIT10 | BIT09 | BIT08 |
    // -----------------------------------------------------------------
    // -----------------------------------------------------------------
    // | BIT07 | BIT06 | BIT05 | BIT04 | BIT03 | BIT02 | BIT01 | BIT00 |
    // -----------------------------------------------------------------

}   



void init_spi(void)
{

    //SPCR SPI控制寄存器
    // -----------------------------------------------------------------
    // |  SPIE |  SPE  |  DORD |  MSTR |  CPOL |  CPHA |  SPR1 | SPR0  |
    // -----------------------------------------------------------------
    // SPIE:SPI中断使能
    // SPE:SPI使能
    // DORD:数据次序,为1时LSB先发送
    // MSTR:是否主机模式,若为主机模式,SS引脚配置为输入,但被拉低则MSTR被清零
    //       SPSR的SPIF位置位。用户必须重新设置MSTR位进入主机模式。
    // CPOL:时钟极性,为1时表示空闲时SCK为高电平,否则为低电平。
    // CPHA:时钟相位,为0时为时钟的起始沿采样数据,否则为终止沿采样数据
    // SPR1,SPR0:SPI时钟速率选择:00  1/4, 01  1/16, 10  1/64, 11  1/128


    //SPSR SPI状态寄存器
    // -----------------------------------------------------------------
    // |  SPIF |  WCOL |   -   |   -   |   -   |   -   |   -   | SPI2X |
    // -----------------------------------------------------------------
    // SPIF:SPI中断标志,串行发送结束后此位置位,对于查询方式,可先读SPSR,紧着
    //       访问SPDR来对SPIF位清零。
    // WCOL:写冲突标志,可通过先读SPSR,紧接着访问SPDR来清零。
    // SPI2X:SPI倍速,若为主机,SCK最高频率可达CPU频率一半,从机则只能保证为1/4


    //SPDR SPI数据寄存器
    // -----------------------------------------------------------------
    // |  MSB  |       |       |       |       |       |       |  LSB  |
    // -----------------------------------------------------------------
    // SPDR为可读写寄存器,写则将启动数据传输,读则读取接收缓冲器

}   

void init_twi(void)
{
    //TWBR TWI比特率寄存器
    // -----------------------------------------------------------------
    // |  BIT7 |  BIT6 |  BIT5 |  BIT4 |  BIT3 |  BIT2 |  BIT1 |  BIT0 |
    // -----------------------------------------------------------------
    // SCL频率 = CUP时钟频率/(16 + 2 * TWBR * 4 ^ TWPS)
    // TWBR值应该不小于10, TWPS为预分频值


    //TWCR TWI控制寄存器
    // -----------------------------------------------------------------
    // | TWINT |  TWEA | TWSTA | TWSTO |  TWWC |  TWEN |   -   |  TWIE |
    // -----------------------------------------------------------------
    // TWINT:TWI中断标志,TWINT标志必须由软件写1清除, 即使在中断服务程序中硬件也不会自动清除
    //        在清除TWI标志前一定要首先完成对TWAR TWSR TWDR的访问, 此位清零后TWI立即开始工作。
    // TWEA:使能TWI应答,此位控制应答脉冲的产生。
    // TWSTA:START状态位,自己想成为主机时置此位,发送START后软件必须清零TWSTA。
    // TWSTO:STOP状态位。主模式下,置此位将在总线上产生STOP状态,后TWSTO自动清零;从机模式下
    //        置此位可使接口从错误状态恢复到未被寻址的状态,此时总线上不会产生STOP状态。
    // TWWC:TWI写冲突标志。每次写TWDR时都将更新此标志。
    // TWEN:TWI使能位。置1时TWI引脚将从IO引脚切换到SCL和SDA引脚。
    // TWIE:TWI中断使能。


    //TWSR TWI状态寄存器
    // -----------------------------------------------------------------
    // |  TWS7 |  TWS6 |  TWS5 |  TWS4 |  TWS3 |   -   | TWPS1 | TWPS0 |
    // -----------------------------------------------------------------
    // TWS7~TWS3:TWI状态
    // TWPS1~TWPS0:TWI预分频值。00:1; 01:1/4; 10:1/16; 11:1/64。


    //TWDR TWI数据寄存器
    // -----------------------------------------------------------------
    // |  BIT7 |  BIT6 |  BIT5 |  BIT4 |  BIT3 |  BIT2 |  BIT1 |  BIT0 |
    // -----------------------------------------------------------------
    // 发送模式,TWDR中包含了要发送的字节,接收模式TWDR包含了接收到的数据。
    // 只要TWINT置位,TWDR的数据就是稳定的。


    //TWAR TWI从机地址寄存器
    // -----------------------------------------------------------------
    // |  TWA6 |  TWA5 |  TWA4 |  TWA3 |  TWA2 |  TWA1 |  TWA0 | TWGCE |
    // -----------------------------------------------------------------
    // TWA6~TWA0:TWI从机地址寄存器
    // TWGCE:使能TWI广播识别


}

    //GICR 通用中断控制寄存器
    // -----------------------------------------------------------------
    // |  INT1 |  INT0 |  INT2 |   -   |   -   |   -   | IVSEL |  IVCE |
    // -----------------------------------------------------------------
    // INT1:使能外部中断1请求
    // INT0:使能外部中断0请求
    // INT2:使能外部中断2请求
    // IVSEL:中断向量选择,为0时中断向量位于FLASH起始地址,为1时位于BOOT区起始地址
    // IVCE:中断向量修改使能。改变IVSEL时IVCE必须置位。

    //MCUCR MCU控制寄存器
    // -----------------------------------------------------------------
    // |  SM2  |   SE  |  SM1  |  SM0  | ISC11 | ISC10 | ISC01 | ISC00 |
    // -----------------------------------------------------------------
    // SM2, SM1, SM0:000:空闲模式  
    //                001:ADC噪声抑制模式
    //                010:掉电模式
    //                011:省电模式
    //                100:保留
    //                101:保留
    //                110:Standby模式
    //                111:扩展Standby模式
    //SE:休眠使能
    //ISC11, ISC10: 00:INT1为低电平时产生中断请求
    //               01:INT1引脚上任意的逻辑电平变化都将引发中断
    //               10:INT1的下降沿产生异步中断请求
    //               11:INT1的上升沿产生异步中断请求
    //ISC01, ISC00:  00:INT0为低电平时产生中断请求
    //               01:INT0引脚上任意的逻辑电平变化都将引发中断
    //               10:INT0的下降沿产生异步中断请求
    //               11:INT0的上升沿产生异步中断请求



    //MCUCSR MCU控制和状态寄存器
    // -----------------------------------------------------------------
    // |  JTD  |   -   |   -   |  JTRF |  WDRF |  BORF | FXTRF |  PORF |
    // -----------------------------------------------------------------
    // JTD:
    // JTRF:JTAG复位标志
    // WDRF:看门狗复位标志
    // BORF:掉电检测复位标志
    // EXTRF:外部复位标志
    // PORF:上电复位标志


    //WDTCR 看门狗定时器控制寄存器
    // -----------------------------------------------------------------
    // |   -   |   -   |   -   |  WDCE |  WDE  |  WDP2 |  WDP1 |  WDP0 |
    // -----------------------------------------------------------------
    // WDCE:看门狗修改使能,清零WDE位时必须先置位WDCE位,否则不能禁止看门狗
    // WDE:看门狗使能,只有WDCE为1时WDE才能清零
    // WDP2~WDP0:看门狗定时器预分频值   WDT振荡周期  VCC=3V时溢出时间  VCC=5V时溢出时间
    //                            000:     16K            14.8ms            14.0ms
    //                            001:     32K            29.6ms            28.1ms
    //                            010:     64K            59.1ms            56.2ms
    //                            011:    128K             0.12s             0.11s
    //                            100:    256K             0.24s             0.22s
    //                            101:    512K             0.47s             0.45s
    //                            110:   1024K             0.95s             0.9s
    //                            111:   2048K             1.9s              1.8s


    //EEARH/EEARL EEPROM地址寄存器
    //EEARH
    // -----------------------------------------------------------------
    // |   -   |   -   |   -   |   -   | EEAR11| EEAR10| EEAR9 | EEAR8 |
    // -----------------------------------------------------------------
    //EEARL
    // -----------------------------------------------------------------
    // | EEAR7 | EEAR6 | EEAR5 | EEAR4 | EEAR3 | EEAR2 | EEAR1 | EEAR0 |
    // -----------------------------------------------------------------
    //EEPROM地址,在访问EEPROM前必须为其赋予正确的数据

    //EEDR EEPROM数据寄存器   
    // -----------------------------------------------------------------
    // |  MSB  |  ...  |  ...  |  ...  |  ...  |  ...  |  ...  |  LSB  |
    // -----------------------------------------------------------------

    //EECR EEPROM控制寄存器
    // -----------------------------------------------------------------
    // |   -   |   -   |   -   |   -   | EERIE | EEMWE |  EEWE |  EERE |
    // -----------------------------------------------------------------
    //EERIE:EEPROM就绪中断使能
    //EEMWE:EEPROM主机写使能,当此位为1时,在4个时钟内EEWE置位,数据将写入EEPROM
    //          EEMWE置位4个时钟后硬件将其清零
    //EEWE:EEPROM写使能
    //EERE:EEPROM读使能。当EEPROM地址设置好后,需置位EERE以便将数据读入EEAR
    //EEPROM写时序:
    //a等待EEWE位为0
    //b等待SPMCSR的SPMEN位为0,此步只在软件包含引导程序,且允许CPU对Flash编程时才有用
    //c将新的EEPROM地址写入EEAR
    //d将新的EEPROM数据写入EEDR
    //e对EECR的EEMWE位写1,同时清零EEWE位
    //f在置位EEMWE位的4个周期内置位EEWE位
int main()
{
   // Write your code here
   while (1)
      ;
   return 0;
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

ID:67925 发表于 2022-1-2 08:26 来自手机 | 显示全部楼层
先抄了,方便一些,不用每个比特位都查手册
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表