历史上的今天
返回首页

历史上的今天

今天是:2024年10月22日(星期二)

正在发生

2019年10月22日 | ATmeg16单片机+LCD12864温度检测显示程序(并行控制,不带字库)

2019-10-22 来源:51hei

LCD12864温度检测显示程序(ATmega16)

制作出来的实物图如下:

 

单片机源程序如下:

/*---------------------------------------------------------------

ATmega64并行控制不带字库的12864程序

--------------------------------------------------------------- 

实验内容:LCD12864

--------------------------------------------------------------- 


硬件连接:

LCD12864         --------        ATmega64


1.GND            --------        GND

2.VCC            --------        VCC

3.V0             --------        NC

4.RS(CS)         --------        PB0

5.R/W(SID)       --------        PB1

6.E(SCLK)        --------        PB2

7.D0             --------        PA0

8.D1             --------        PA1

9.D2             --------        PA2

10.D3            --------        PA3

11.D4            --------        PA4

12.D5            --------        PA5

13.D6            --------        PA6

14.D7            --------        PA7

15.PSB           --------        VCC

16.NC            --------        NC

17.RST           --------        VCC

18.NC            --------        NC

19.LED+          --------        VCC

20.LED-          --------        GND


编译烧写该程序到ATmega64

上电,如果操作正确,这时您可以看到显示的内容了

---------------------------------------------------------------*/ 

//头文件定义

#include

#include

//#include

//#include

//#include

//宏定义

#define uchar unsigned char

#define uint unsigned int

//LCD12864液晶显示(数据线端口)

#define rs_h PORTB |= BIT(PB0)//数据/命令选择

#define rs_l PORTB &=~BIT(PB0)

#define rw_h PORTB |= BIT(PB1)//读/写选择

#define rw_l PORTB &=~BIT(PB1)

#define en_h PORTB |= BIT(PB2)//使能信号

#define en_l PORTB &=~BIT(PB2)

//温度18b20(数据线端口)

#define tmp (PINB&BIT(PB3))

#define temp_h PORTB |= BIT(PB3)

#define temp_l PORTB &=~BIT(PB3)

#define temp_o DDRB |= BIT(PB3)

#define temp_i DDRB &=~BIT(PB3)

//数组定义

/*

unsigned char dis1[]={"黄俊华,啊蠢。"};

unsigned char dis2[]={"曾志成,啊成。"};

unsigned char dis3[]={"梁毓毅,啊毓。"};

unsigned char dis4[]={"柳艺明,啊明。"};


unsigned char dis1[]={"温度检测"};

unsigned char dis2[]={"℃"};

*/


//温度18b20(变量定义)

unsigned char dat1=0x00;//保存读出的温度 L

unsigned char dat2=0x00;//保存读出的温度 H

unsigned long int dat=0;//保存读出的温度 XS

unsigned char flag=0;//错误标志位

unsigned char keyvalue=0;//返回值变量

unsigned char tempH=30;//温度H

unsigned char tempL=20;//温度L

//按键定义

unsigned char key1=0;

unsigned char key2=0;

//unsigned char key3=0;

//unsigned char key4=0;


//**********************************************************************//

//*************************      IO 端口定义      **********************//

//**********************************************************************//


void IO_init(void)

{          

         DDRA = 0XFF;

         DDRB = 0XFF;

         //DDRC = 0XFF;

         //DDRD = 0XFF; 

        //PORTA = 0X00;

        //PORTB = 0X00;

        //PORTC = 0X00;

        //PORTD = 0X00;

}


//**********************************************************************//

//*************************      延时函数         **********************//

//**********************************************************************//


void delayms(uint z)          //8M晶振下,延时1ms

{

        uint x,y;

        for(x=z;x>0;x--)

                 for(y=1333;y>0;y--);

}


//**********************************************************************//

//*************************      LCD12864         **********************//

//**********************************************************************//

void LCD_clear(void)//清屏函数

{

  write_com(0x01);

  delayms(5);

}

void lcd_en(void)        //en端产生一个高电平脉冲,控制LCD写时序

{

        delayms(5);//延时5ms

        en_h;

    delayms(5);//延时5ms

    en_l;

}

void write_com(uchar com)//向LCD12864写命令

{

        rs_l;

        rw_l;

        en_h;

        delayms(5);//延时5ms

        PORTA=com;

        lcd_en();//写入命令

}

void write_dat(uchar dat)//向LCD12864写数据

{

        rs_h;

        rw_l;

        en_h;

        delayms(5);//延时5ms

        PORTA=dat;

        lcd_en();//写入数据

}

void LCD_init(void)//LCD显示屏初始化函数 

{

        write_com(0x30);//设置8位数据总线,DB7~DB0;

        delayms(5);//延时5ms

        write_com(0x0c);//开显示,光标不显示;

        delayms(5);//延时5ms

        write_com(0x01);//清屏

        delayms(5);//延时5ms

}

void LCD_pos(uchar x,uchar y)//字符显示初始地址设置

{

        uchar pos;

        if(x==0)//第一行显示

        {

                 x=0x80;

        }

        else if(x==1)//第二行显示

        {

                 x=0x90;

        }

        else if(x==2)//第三行显示

        {

                 x=0x88;

        }

        else if(x==3)//第四行显示

        {

                 x=0x98;

        }

        pos=x+y;

        write_com(pos);

}

void LCD_write_str(uchar x,uchar y,uchar *s)//在第X行Y列开始显示,指针*S所指向的字符串

{

        LCD_pos(x,y);//设置初始字符显示地址

        while(*s)//逐次写入显示字符,直到最后一个字符"/0"

        {

                 write_dat(*s);//写入当前字符并显示

                s++;//地址指针加1,指向下一个待写字符

        }

}

void LCD_write_char(uchar x,uchar y,uchar Wdata)//在第X行Y列开始显示Wdata所对应的单个字符

{

        LCD_pos(x,y);//设置初始字符显示地址

        write_dat(Wdata);//写入当前字符并显示

}


//**********************************************************************//

//*************************         18B20         **********************//

//**********************************************************************//


void Ds18b20_reset(void)//DS18B20初始化

{

        uint count;

        temp_o;

        temp_l;

        for(count=700;count>0;count--);//延时480us

        temp_h;

        temp_i;//不须配置PORT内部上拉电阻,MCU输入输出自动切换

        while((tmp==0x08));//&&(i>0)) i--;

        for(count=700;count>0;count--);//延时480us

}

void Ds18b20_write(uchar dat)//向DS18B20写一个字节

{

        uchar count;

        uchar i;

        temp_o;

        for(i=8;i>0;i--)

        {

                temp_l;

                for(count=2;count>0;count--);

                //temp_h;//不能有此语句

                if(dat&0x01==0x01)

                        temp_h;

                else

                        temp_l;

                for(count=120;count>0;count--);//延时60us

                temp_h;

                dat>>=1;        

        }        

}

uchar Ds18b20_read(void)//从DS18B20读一个字节

{

        uchar i,datt;

        uchar count;

        for(i=8;i>0;i--)

        {

                datt>>=1;

                temp_o;

                temp_l;

                for(count=2;count>0;count--);

                temp_h;//此语句必须有,参考datasheet的P15

                for(count=1;count>0;count--);

                temp_i;

                if(tmp==0x08)

推荐阅读

史海拾趣

Component Research Co公司的发展小趣事

在电子行业中,环保问题日益受到关注。Component Research Co积极响应环保号召,将环保理念融入产品研发和生产过程中。公司采用环保材料、推行节能减排措施、加强废弃物处理等,努力降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,还为公司赢得了更多客户的青睐。

Chip Quik公司的发展小趣事

在不断发展壮大的过程中,Chip Quik公司始终注重品牌建设和持续创新。公司加大了对研发部门的投入,不断推出新技术和新产品,以满足市场的不断变化。同时,公司还通过加强品牌宣传和推广,提高了品牌知名度和美誉度,为公司的长远发展奠定了坚实的基础。

这些故事虽然基于假设和一般性的行业趋势,但它们可以反映出一家电子行业中类似公司可能经历的发展路径和挑战。希望这些故事能够为您了解Chip Quik公司或其他电子行业公司的发展提供一定的参考。

AnalogicTech公司的发展小趣事

AnalogicTech深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重客户反馈和需求,不断优化产品和服务,以满足客户的期望和需求。这种对品质的执着追求和对客户的深度关注,使得AnalogicTech赢得了众多客户的信任和忠诚。

Datatronic公司的发展小趣事

随着市场竞争的加剧,Datatronic公司意识到单纯依靠技术创新已不足以保持竞争优势。于是,公司开始调整市场策略,注重与客户的沟通和合作。通过深入了解客户需求,公司能够提供更符合市场需求的定制化产品和服务。同时,公司还加强了与上下游企业的合作,形成了稳定的供应链体系。

GE (General Electric)公司的发展小趣事
包括油泵电机、外磨电机、内磨电机等,这些电机通过自锁电路进行控制,确保电机的稳定运行。
FWBELL公司的发展小趣事
自动调整充电模式以适应电池温度的变化,实现智能化充电管理。

问答坊 | AI 解惑

晒板子28335

28335电力电子与电力传动专用控制板 …

查看全部问答>

1-wire系统中TM卡的单片机等效替换

1 TM卡简介   TM(Touch Memory)卡是美国Dallas公司的专利产品。它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC 卡的廉价性,是当前性价比最优秀的IC卡之一。它的外形类似于一个钮扣(button) ...…

查看全部问答>

浙江大学RF设计(前端系统)(pdf)

第10个附件是一个超外差高频头的实例,很宝贵的资料…

查看全部问答>

说说模拟设计那点事儿和那几本书

我学习模电有一段时间了,向大家推荐几本自认为的\"宝典\",谈下自己使用它们的感受以及在学习模电过程中的体会,供后来者参考: 1. 拉扎维的《模拟CMOS集成电路设计》,我们研二模电课的教材,汪宁老师把这门课讲得可圈可点。当时没意识到有其他 ...…

查看全部问答>

基于Win32 API函数和多线程技术的串行通信编程.pdf

基于Win32 API函数和多线程技术的串行通信编程.pdf…

查看全部问答>

无法收到PBT_TRANSITION消息

在WinCE6下一个应用程序里,使用RequestPowerNotifications(hPowerNotificationMsgs, POWER_NOTIFY_ALL); 去请求power状态改变的通知。可是从开始菜单进入suspend的时候并没有收到任何power消息,但是按Power Button从suspend状态resume回来的时 ...…

查看全部问答>

RAS拨号监视消息

如何在RAS异步拨号时,得到当前拨号的状态,我写的消息和回调函数都可以在PC机上用,但在CE上都不能用(CE只支持消息),代码如下:消息的、 先注册了消息: const   UINT   WM_RASEVENT   =   ::Regist ...…

查看全部问答>

u-boot 的 配置问题.(从NAND启动)

提示的是 bad crc or nand 在网上查了下,应该是env的问题!麻烦各位有经验的朋友,说一下具体怎么改! 我用的是mini2440,page size应该是2048的,但是u-boot启动输出的还是512~已经进行过CONFIG_了…

查看全部问答>

请教高手:如何在扫描输入完成后,光标自动跳到下一个TEXTBOX

我想让程序在扫描输入完成后,光标自动跳到下一个TEXTBOX 可是我在WINCE上捕捉不到扫描键,也不知道如何区分 输入 是由键盘上输入的还是扫描读入的 哪位高手知道的帮帮我,谢谢 啦 …

查看全部问答>

VxWorks嵌入式国际认证培训班

        为满足各大企业及研发机构对嵌入式操作系统VxWorks人才需求,顺应广大学员学习嵌入式操作系统、获得国际认证证书、增强就业竞争力、取得高薪职位的要求,上海双实科技与上海张江信息技术专修学院继续合作举办VxWorks嵌 ...…

查看全部问答>