历史上的今天
今天是: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)
史海拾趣
|
1 TM卡简介 TM(Touch Memory)卡是美国Dallas公司的专利产品。它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC 卡的廉价性,是当前性价比最优秀的IC卡之一。它的外形类似于一个钮扣(button) ...… 查看全部问答> |
|
我学习模电有一段时间了,向大家推荐几本自认为的\"宝典\",谈下自己使用它们的感受以及在学习模电过程中的体会,供后来者参考: 1. 拉扎维的《模拟CMOS集成电路设计》,我们研二模电课的教材,汪宁老师把这门课讲得可圈可点。当时没意识到有其他 ...… 查看全部问答> |
|
在WinCE6下一个应用程序里,使用RequestPowerNotifications(hPowerNotificationMsgs, POWER_NOTIFY_ALL); 去请求power状态改变的通知。可是从开始菜单进入suspend的时候并没有收到任何power消息,但是按Power Button从suspend状态resume回来的时 ...… 查看全部问答> |
|
提示的是 bad crc or nand 在网上查了下,应该是env的问题!麻烦各位有经验的朋友,说一下具体怎么改! 我用的是mini2440,page size应该是2048的,但是u-boot启动输出的还是512~已经进行过CONFIG_了… 查看全部问答> |
|
请教高手:如何在扫描输入完成后,光标自动跳到下一个TEXTBOX 我想让程序在扫描输入完成后,光标自动跳到下一个TEXTBOX 可是我在WINCE上捕捉不到扫描键,也不知道如何区分 输入 是由键盘上输入的还是扫描读入的 哪位高手知道的帮帮我,谢谢 啦 … 查看全部问答> |
|
为满足各大企业及研发机构对嵌入式操作系统VxWorks人才需求,顺应广大学员学习嵌入式操作系统、获得国际认证证书、增强就业竞争力、取得高薪职位的要求,上海双实科技与上海张江信息技术专修学院继续合作举办VxWorks嵌 ...… 查看全部问答> |




