存档

2007年2月 的存档

AVR单片机驱动I2C(TWI)器件

2007年2月19日

AVR系列单片机内置有TWI控制器,与标准I2C总线兼容。24C256是256K位串行EEPROM芯片,含有32768个字节。

今天调试通了M16的TWI接口,成功从AT24C256器件中写入和读出一个字节内容。程序省略了检验及错误处理部分,为了增强程序健壮性,实际应用中应加入。

主要程序清单及注释:

(程序仅从发送和接收一个字节为例,连续读写应该也差不多吧)

//发送模式

TWCR=0xa4; //发出START信号

while(!(TWCR & 0×80)); //等待TWINT置位,TWINT置位表示START信号已发出

TWDR=0xa0; //表示将要向从机发送数据,以及从机的地址

TWCR=0×84; //TWINT清零,启动发送地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWDR=0×01; //写入高字节储存器地址

TWCR=0×84; //TWINT清零,启动发送储存器地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWDR=0×01; //写入低字节储存器地址

TWCR=0×84; //TWINT清零,启动发送储存器地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWDR=0×55; //写入要储存的数据

TWCR=0×84; //TWINT清零,启动发送数据

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWCR=0×94; //发出STOP信号,数据开始写入储存器

//接受模式

TWCR=0xa4; //发出START信号

while(!(TWCR & 0×80)); //等待TWINT置位,TWINT置位表示START信号已发出

TWDR=0xa0; //发出伪写操作,及从机地址

TWCR=0×84; //TWINT清零,启动发送地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWDR=0×01; //写入要读取的高字节储存器地址

TWCR=0×84; //TWINT清零,启动发送储存器地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWDR=0×01; //写入要读取的低字节储存器地址

TWCR=0×84; //TWINT清零,启动发送储存器地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWCR=0xa4; //再次发出START信号

while(!(TWCR & 0×80)); //等待TWINT置位,TWINT置位表示START信号已发出

TWDR=0xa1; //发出读操作,及从机地址

TWCR=0×84; //TWINT清零,启动发送地址

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

TWCR=0×84; //要求从机发送数据

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示从机已发出数据

RECEIVE=TWDR; //读出数据

TWCR=0×94; //发出STOP信号,数据开始写入储存器

注:

连续写的时候只要多次循环下面三句即可:

TWDR=0×55; //写入要储存的数据

TWCR=0×84; //TWINT清零,启动发送数据

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出

连续读的时候要多次循环这个:

TWCR=0xc4; //要求从机发送数据

while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示从机已发出数据

RECEIVE=TWDR; //读出数据

Jacob 技术

液晶屏显示数字的算法。。。

2007年2月14日

折腾了这么多天的itoa,ftoa什么的,忽然发现了一个最简单的算法。这个算法就是。。。。全国计算机上机考试出现频率最高的那种题目,我考了4次抽了4次的题目,关于四位数运算的。其中把四位数显示在屏幕上用了这么几句:

int b=1234;
char a[4];
a[1]=b/1000;
a[2]=b/100%10;
a[3]=b/10%10;
a[4]=b%10;

道理就是这么简单。看来全国三级还是有这么一点用处的。
崩溃了,让itoa玩了整整两天。

Jacob 技术

C语言里的INT to CHAR*

2007年2月11日

c语言中int转成char *的函数itoa,标准c里集成,CVAVR里好像没有

void reverse(char *s)
{
char *c;
int i;
c = s + strlen(s) - 1;
while(s < c) {
i = *s;
*s++ = *c;
*c– = i;
}
}

char *itoa(int n,char *s)
{

int sign;
char *ptr;
ptr = s;
if ((sign = n) < 0) n = -n;
do {
*ptr++ = n % 10 + ‘0′;
} while ((n = n / 10) > 0);
if (sign < 0) *ptr++ = ‘-’;
*ptr = ‘’;
reverse(s);
return s;
}

Jacob 技术

3310手机屏的问题

2007年2月11日

今天用AVR驱动3310手机屏,发现了两个问题:
1。3310屏分辨率是6bank*84bit的,但是在写完一个bank84bit后继续写,不能自动转到下一个bank,会丢失18位的数据,第十九位开始写到下一个bank。
//知道了,可能是屏的问题,从阿莫那儿买的两块屏有一块有这个问题

2。3310说明文档中提到V这个为是控制垂直显示和水平显示的,但是在实际应用中不管是V=0还是V=1都是水平显示。
//这个还不知道,有空试试

以上两个问题不知道是不是属实。有待研究。

关于具体驱动的问题,整理好了再发上来

Jacob 技术