//=======================================================================================
void lcd_cls(void) //nokia3310清屏,光标复位
{
unsigned int i=0;
DC=0;
lcd_write(128); //光标回到0列
lcd_write(64); //光标回到0行
DC=1; //准备写数据
for(i=0;i<504;i++) //写504个0数据,就是清屏
lcd_write(0);
}
//=======================================================================================
void lcd_init(void) //nokia3310初始化函数
{
RESET_DDRn =1; //设置4个驱动LCD的IO脚为输出
DC_DDRn =1;
SDIN_DDRn =1;
SCLK_DDRn =1;
RESET=0;
RESET=1; //复位结束
DC=0; //准备写指令
lcd_write(32+1); //进入扩展指令
lcd_write(128+38); //设置Vop,相当于亮度
lcd_write(4+3); //设置温度系数,相当于对比度
lcd_write(16+3); //设置偏置,这句要与不要的实际效果好像一样
lcd_write(32+0); //进入基本指令
lcd_write(12); //使能芯片活动/垂直寻址
}
//=======================================================================================
//光标定位,x(0-83)是列地址,y(0-5)是行地址
void lcd_gotoxy(unsigned char x,unsigned char y)
{
DC=0;
lcd_write(x+128);
lcd_write(y+64);
}
//=======================================================================================
void lcd_putchar(unsigned char character) //显示ASCII值的字符
{
unsigned char i=0;
unsigned int No;
No=character-32; //字模数据是由空格开始,空格字符的ASCII的值就是32
No=No*5; //每个字符的字模是5个字节
DC=1;
while(i<5) //一个字符的字模是5个字节,就是5*8点阵
{
lcd_write(data[No]);
i++;
No++;
}
lcd_write(0); //每个字符之间空一列
}
//=====================================================================================
void lcd_put(unsigned char byte_data) //以十进制显示一个字符变量
{
lcd_putchar(byte_data/100+48); //百位数转化为ASCII值再显示
lcd_putchar(byte_data/10%10+48); //十位数转化为ASCII值再显示
lcd_putchar(byte_data%10+48); //个位数转化为ASCII再再显示
}
//=====================================================================================
void lcd_puthex(unsigned char byte_data) //以十六进制显示一个字节变量
{
unsigned char data;
data=byte_data>>4; //求高4位
if(data<10) data+=48; else data+=55; //转化为ASCII值
lcd_putchar(data); //显示
data=byte_data&15; //求低4位
if(data<10) data+=48; else data+=55; //转化为ASCII值
lcd_putchar(data); //显示
}
//=====================================================================================
void lcd_putsf(flash unsigned char *string , unsigned char n) //显示FLASH里面的字符串
{
unsigned char i=0;
while(i<n)
{
lcd_putchar( string[ i ] ); //顺序显示字符
i++;
}
}
//**********************************************************************************
//**********************************************************************************
常用的CRC校验有CRC8、CRC16、CRC32等,DS18B20数字温度器件就是采用CRC8的校验方式,下面是CVAVR集成的CRC8校验函数
#include <mega48.h>
#include <1wire.h>
unsigned char a[]={0x28,0x6D,0x00,0x85,0x00,0x00,0x00,0xCF};
unsigned char crc8;
main()
{
while(1)
{
crc8=w1_dow_crc8(a,7); //求数组a的前7个数的CRC8校验码
}
}
上面的例子中,数组a的8个数据就是我的DS18B20的ID码,0x28是器件的家族码,0x6D,0x00,0x85,0x00,0x00,0x00这6个数就是ID码,0xCF是前面7个数的校验码
用AVR Studio调试上面的程序就可以看到,crc8的结果就是0xCF了
也可以自己写函数,功能与上面的一样
unsigned char crc8(unsigned char *ptr, unsigned char len)
本文关键字:温度计 AVR单片机,单片机-工控设备 - AVR单片机
上一篇:AVR模拟比较器范例