完整代码下载地址: http://www.51hei.com/f/2402avr.rar
main函数: /* 程序功能:ATMEGA16读写24C02 作者:朱波 时间:2012年1月30日 说明:程序运行后会从0开始自动计数到256(对字节操作的结果) 当复位或者断电时24C02保存断电时的数据,当重新启动后 计数值会从断电时的值开始计数 */ #include#include #include"delay.h" #include"display.h" #include"24C02.h" #define uchar unsigned char #define uint unsigned int uint num;//定义变量用于读取24C02中的数值,注意必须为uint型 void main() { LCD_init(); twi_init(); while(1) { num=IIC_Read(0x00);//从器件中读取(0x00是器件地址) num=num+1;//加1 num=num%1000;//关键语句,没有此句则不工作*/ IIC_Write(num,0x00);//加1后写入器件 display(); } } 延时函数delay.c #include"delay.h" void delay(unsigned int ms) { unsigned int i,j; for(i=0;i #include #include"display.h" #define uchar unsigned char #define uint unsigned int uchar table1[]="0123456789"; uchar table2[]="zhubo-24C02"; uchar table3[]="result:"; extern uint num;//主函数中的值 void write_com(uchar com) { PORTD&=~BIT(4); PORTD&=~BIT(5); PORTB=com; PORTD|=BIT(6); delay(1); PORTD&=~BIT(6); } void write_dat(uchar dat) { PORTD|=BIT(4); PORTD&=~BIT(5); PORTB=dat; PORTD|=BIT(6); delay(1); PORTD&=~BIT(6); } void LCD_init() { DDRB=0XFF; DDRD|=BIT(4)|BIT(5)|BIT(6); PORTD&=~BIT(6); write_com(0X38); delay(5); write_com(0X01); delay(5); write_com(0X0C); delay(5); write_com(0X06); delay(5); } void display() { uint i; write_com(0X80+0); delay(5); for(i=0;i<7;i++) { write_dat(table3[i]); delay(5); } //这是在1602液晶中显示数值的方法 write_com(0X80+8); delay(5); write_dat(table1[num/1000]); delay(5); write_com(0X80+9); delay(5); write_dat(table1[num%1000/100]); delay(5); write_com(0X80+10); delay(5); write_dat(table1[num%100/10]); delay(5); write_com(0X80+11); delay(5); write_dat(table1[num%10]); delay(5); write_com(0X80+0X40);//仿真与实际1602有区别 delay(5); for(i=0;i<11;i++) { write_dat(table2[i]); delay(5); } } 24C02.c: #include #include #include"24C02.h" #define uchar unsigned char #define uint unsigned int //主机模式启动状态码 #define I2C_START 0x08 //启动总线 #define I2C_RESTART 0x10 //重新启动总线 //主机发送模式状态码 #define I2C_MT_SLA_ACK 0x18 //SLA+W写地址已发送,收到应答位 #define I2C_MT_SLA_NACK 0x20 //SLA+W写地址已发送,收到非应答位 #define I2C_MT_DATA_ACK 0x28 //写入数据已发送,收到应答位 #define I2C_MT_DATA_NACK 0x30 //写入数据已发送,收到应答位 #define I2C_MT_ARB_LOST 0x38 //SLA+W或数据仲裁失败 //主机接收模式状态码 #define I2C_MR_ARB_LOST 0x38 //SLA+R或NOT ACK的仲裁失败 #define I2C_MR_SLA_ACK 0x40 //SLA+R已发送,收到应答位 #define I2C_MR_SLA_NACK 0x48 //SLA+R已发送,收到非应答位 #define I2C_MR_DATA_ACK 0x50 //接收到数据,应答位已返回 #define I2C_MR_DATA_NACK 0x58 //接收到数据,非应答位已返回 //从机接收模式状态码 #define I2C_SR_SLA_ACK 0x60 //自己的SLA+W已经被接收ACK已返回 #define I2C_SR_ARB_LOST_SLA_ACK 0x68 //SLA+R/W作为主机的仲裁失败,自己的SLA+W已经被接收ACK已返回 #define I2C_SR_GCALL_ACK 0x70 //接收到广播地址ACK已返回 #define I2C_SR_ARB_LOST_GCALL_ACK 0x78 //SLA+R/W作为主机的仲裁失败,接收到广播地址ACK已返回 #define I2C_SR_DATA_ACK 0x80 //以前以自己的SLA+W被寻址,数据已经被接收ACK已返回 #define I2C_SR_DATA_NACK 0x88 //以前以自己的SLA+W被寻址,数据已经被接收NOT ACK已返回 #define I2C_SR_GCALL_DATA_ACK 0x90 //以前以广播方式被寻址,数据已经被接收ACK已返回 #define I2C_SR_GCALL_DATA_NACK 0x98 //以前以广播方式被寻址,数据已经被接收NOT ACK已返回 #define I2C_SR_STOP 0xA0 //在以从机工作时接收到STOP或重复START //从机发送模式状态码 #define I2C_ST_SLA_ACK 0xA8 //自己的SLA+R已经被接收ACK已返回 #define I2C_ST_ARB_LOST_SLA_ACK 0xB0 //SLA+R/W作为主机的仲裁失败,自己的SLA+R已经被接收ACK已返回 #define I2C_ST_DATA_ACK 0xB8 //TWDR里数据已经被发送接收到ACK #define I2C_ST_DATA_NACK 0xC0 //TWDR里数据已经被发送接收到NOT ACK #define I2C_ST_LAST_DATA 0xC8 //TWDR的一字节数据已经发送(TWAE='0'),接收到ACK //其他状态码 #define I2C_NO_INFO 0xF8 //没有相关的状态信息,TWINT='0' #define I2C_BUS_ERROR 0x00 //由于非法的START或STOP引起的总线错误 //定义SLA中读写控制位极性 #define I2C_READ 1 #define I2C_WRITE 0 #define RD_DEVICE_ADDR 0XA1 //写的器件地址 #define WD_DEVICE_ADDR 0XA0 //读的器件地址 //常用TWI操作(主模式写和读) #define Start() (TWCR=(1<
上一篇:带字库型12864液晶的简单使用
下一篇:51单片机普通IO口模拟串行口之查询方式
推荐阅读最新更新时间:2024-03-16 13:04