LCD1602+44key+UART小程序Word格式文档下载.docx
- 文档编号:21611141
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:9
- 大小:87.50KB
LCD1602+44key+UART小程序Word格式文档下载.docx
《LCD1602+44key+UART小程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LCD1602+44key+UART小程序Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
//液晶显示的坐标值
voidmain(void)
{
unsignedchari=0;
init_USART();
//usart初始化
LCD_init();
//液晶初始化
UCSRB|=(1<
<
RXCIE);
//打开异步串口中断
SEI();
//打开全局中断
LCD_write_string(3,0,"
UARTBYMJP"
);
while
(1)
{i=get_key();
//扫描键盘输入
if(i!
=0x00)
{put_c(i);
//发送键盘输入到pc机上
LCD_write_string(0,0,"
DATAFROMKEY:
"
//液晶上显示发送值
if(x1==15)//如果显示完一行则清除该行显示并重新开始
{x1=0;
LCD_write_string(0,1,"
"
}
LCD_write_char(x1++,y1,i);
//写一个字符后地址自动加1
#pragmainterrupt_handlerRXC_Int:
12
voidRXC_Int(void)
{
DATAFROMPC:
//液晶上显示发送值
if(x2==15)//如果显示完一行则清除该行显示并重新开始
{x2=0;
LCD_write_char(x2++,y2,UDR+48);
//写一个字符后地址自动加1,+48转为ASCII
1602部分:
/*用法:
LCD_init();
LCD_write_string(列,行,"
字符串"
LCD_write_char(列,行,'
字符'
---------------------------------------------------------------
下面是AVR与LCD连接信息
PC4->
RS
PC5->
EN
地
->
RW
PC0->
D4
PC1->
D5
PC2->
D6
PC3->
D7
要使用本驱动,改变下面配置信息即可
-----------------------------------------------------------------*/
#defineLCD_EN_PORT
PORTC
//以下2个要设为同一个口
#defineLCD_EN_DDR
DDRC
#defineLCD_RS_PORT
#defineLCD_RS_DDR
#defineLCD_DATA_PORT
PORTA
//以下3个要设为同一个口
#defineLCD_DATA_DDR
DDRA
//默认情况下连线必须使用高四位端口,如果不是请注意修改
#defineLCD_DATA_PIN
PINA
#defineLCD_RS
(1<
PC6)//0x20
portC6
out
#defineLCD_EN
PC7)//0x40
portC7
#defineLCD_DATA
((1<
PA4)|(1<
PA5)|(1<
PA6)|(1<
PA7))//0xf0
portA4/5/6/7out
/*--------------------------------------------------------------------------------------------------
函数说明
--------------------------------------------------------------------------------------------------*/
voidLCD_init(void);
voidLCD_en_write(void);
voidLCD_write_command(unsigned
charcommand);
voidLCD_write_data(unsignedchardata);
voidLCD_set_xy(unsignedcharx,unsignedchary);
voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s);
voidLCD_write_char(unsignedcharX,unsignedcharY,unsignedchardata);
//-----------------------------------------------------------------------------------------
macros.h>
voidLCD_init(void)
//液晶初始化
LCD_DATA_DDR|=LCD_DATA;
//数据口方向为输出
LCD_EN_DDR|=LCD_EN;
//设置EN方向为输出
LCD_RS_DDR|=LCD_RS;
//设置RS方向为输出
LCD_write_command(0x28);
LCD_en_write();
delay_nus(40);
//4位显示
LCD_write_command(0x0c);
//显示开
LCD_write_command(0x01);
//清屏
delay_nms
(2);
voidLCD_en_write(void)
//液晶使能
LCD_EN_PORT|=LCD_EN;
delay_nus
(1);
LCD_EN_PORT&
=~LCD_EN;
voidLCD_write_command(unsignedcharcommand)//写指令
//连线为高4位的写法
delay_nus(16);
LCD_RS_PORT&
=~LCD_RS;
//RS=0
LCD_DATA_PORT&
=0X0f;
//清高四位
LCD_DATA_PORT|=command&
0xf0;
//写高四位
command=command<
4;
//低四位移到高四位
=0x0f;
//写低四位
/*
//连线为低四位的写法
=0xf0;
LCD_DATA_PORT|=(command>
>
4)&
0x0f;
*/
voidLCD_write_data(unsignedchardata)//写数据
LCD_RS_PORT|=LCD_RS;
//RS=1
LCD_DATA_PORT|=data&
data=data<
//连线为低四位的写法
=0Xf0;
LCD_DATA_PORT|=(data>
voidLCD_set_xy(unsignedcharx,unsignedchary)
//写地址函数
unsignedcharaddress;
if(y==0)address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s)//列x=0~15,行y=0,1
LCD_set_xy(X,Y);
//写地址
while(*s)
//写显示字符
{
LCD_write_data(*s);
s++;
}
voidLCD_write_char(unsignedcharX,unsignedcharY,unsignedchardata)//列x=0~15,行y=0,1
//写地址
LCD_write_data(data);
延迟函数部分:
/*-----------------------------------------------------------------------
延时函数
编译器:
ICC-AVRv6.31A
目标芯片:
M16
时钟:
8.0000Mhz
-----------------------------------------------------------------------*/
#ifndef__delay_h
#define__delay_h
voiddelay_nus(unsignedintn);
voiddelay_nms(unsignedintn);
voiddelay_1us(void);
voiddelay_1ms(void);
voiddelay_1us(void)
//1us延时函数
asm("
nop"
voiddelay_nus(unsignedintn)
//Nus延时函数
unsignedinti=0;
for(i=0;
i<
n;
i++)
delay_1us();
voiddelay_1ms(void)
//1ms延时函数
unsignedinti;
1140;
i++);
voiddelay_nms(unsignedintn)
//Nms延时函数
delay_1ms();
#endif
4×
4键盘部分:
//函数说明
//--------------------------------
unsignedcharget_key(void);
unsignedcharkey_read(void)
unsignedchari;
/*获取列地址*/
DDRB=0xf0;
//高4位输出,低4位输入
PORTB=0x0f;
//高4位输出0,低4位带上拉输入
delay_nms
(1);
i=PINB&
/*获取行地址*/
DDRB=0x0f;
//高4位输入,低4位输出
PORTB=0xf0;
//低4位输出0,高4位带上拉输入
i|=PINB&
switch(i)
case0xff:
return0x00;
case0xee:
return'
0'
;
case0xde:
1'
case0xbe:
2'
case0x7e:
3'
case0xed:
4'
case0xdd:
5'
case0xbd:
6'
case0x7d:
7'
case0xeb:
8'
case0xdb:
9'
case0xbb:
A'
case0x7b:
B'
case0xe7:
C'
case0xd7:
D'
case0xb7:
E'
case0x77:
F'
default:
unsignedcharget_key(void)
{unsignedchari;
staticunsignedcharj;
//按键记录
i=key_read();
if(i==0x00)//无有效按键按下
j=0x00;
//清除按键记录
return0x00;
//程序退出
if(j==0x00)//为新按键
{j=i;
//保存本次采样结果
delay_nms(10);
//去按键颤抖
i=key_read();
if(i==j){returni;
/*上面的写法按下按键只有一个返回值,下面的做法虽然容易理解但是按下按键后可能
会返回多个返回值,故一般采用上面的写法。
unsignedchari;
unsignedcharj;
//按键记录
i=key_read();
if(i==0x00)
//无有效按键按下
return(0x00);
else
//有键按下
j=i;
//保存结果
delay_nms(10);
//去抖动
if(i==j)
return(i);
UART部分:
#defineBAUDRATE
9600
//波特率
#defineF_CPU
7327800
voidinit_USART(void);
voidput_c(unsignedcharc);
voidput_s(unsignedchar*ptr);
unsignedcharget_c(void);
voidput_c(unsignedcharc)
while(!
(UCSRA&
UDRE)));
UDR=c;
voidput_s(unsignedchar*ptr)
while(*ptr)
put_c(*ptr++);
put_c(0x0D);
//换行
//put_c(0x0A);
//回车
unsignedcharget_c(void)
while(!
(UCSRA&
(1<
RXC)));
returnUDR;
}
voidinit_USART(void)//USART初始化
//USART96008,n,1
超级终端等也要设成同样的设置才能通讯
UCSRC=(1<
URSEL)|0x06;
//异步,8位数据,无奇偶校验,一个停止位,无倍速
UBRRL=(F_CPU/BAUDRATE/16-1)%256;
UBRRH=(F_CPU/BAUDRATE/16-1)/256;
UCSRA=0x00;
UCSRB=(1<
RXEN)|(1<
TXEN);
//使能接收,使能发送
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD1602 44 key UART 程序