📄 lcd_1602.c
字号:
#include <iom64.h>
#include <intrinsics.h>
//定义延时程序
#define F_CPU 1 //1MHz时钟
#define delay_us(t_nus) __delay_cycles(t_nus*F_CPU)
#define delay_ms(t_nms) __delay_cycles(t_nms*F_CPU*1000)
/************************************************************/
/*LCD_1602显示子程序,直接可以调用以下两个函数 */
/*void lcd_write_char (y坐标,x坐标,单个字符) 显示单个字符*/
/*void lcd_write_string (y坐标,x坐标,字符串) 显示字符串 */
/*使用的端口在下面定义了,转移程序时注意定义端口 */
/*通过IAR_AVR编译 */
/************************************************************/
//LCD1602端口定义,位操作
#define RS PORTD_Bit5 //PD5
#define RW PORTD_Bit6 //PD6
#define EN PORTD_Bit7 //PD7
#define DATA PORTC //PC
#define busy PC7
/************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd_busy为0时,闲,可写指令与数据*/
/************************************************************/
void lcd_busy(void) //LCD忙检测
{
DDRC&=~(1<<busy); //设置busy口为输入
RS=0;
RW=1;
EN=1;
while(PINC&(1<<busy)); //忙等待
EN=0;
DDRC|=(1<<busy); //设置busy口为输出
}
/***********************************************************/
/*写指令数据到LCD,RS=0,RW=0,EN=高脉冲,D0-D7=指令码 */
/*command为指令,wait_en指定是否要检测LCD忙信号 */
/***********************************************************/
void lcd_wcmd(unsigned char command,unsigned char wait_en) //写指令
{
if(wait_en) //若wait_en为1,则要检测LCD忙信号
lcd_busy();
RS=0;
RW=0;
EN=0;
DATA=command;
EN=1;
__delay_cycles(2); //延时两个机器周期
EN=0;
}
/**********************************************************/
/*写显示数据到LCD,RS=1,RW=0,EN=高脉冲,D0-D7=数据 */
/*data为数据 */
/**********************************************************/
void lcd_wdat(unsigned char dat) //写数据
{
lcd_busy();
RS=1;
RW=0;
DATA=dat;
EN=1;
__delay_cycles(2);
EN=0;
}
/*LCD初始化设定*/
void lcd_init(void)
{
DDRC=0xFF; //初始化LCD端口,为输出,值为0
DDRD|=0xE0;
PORTC=0x00;
PORTD&=0x1F;
delay_ms(2); //等待上电稳定
lcd_wcmd(0x38,0); //16*2显示,5*7点阵,8位数据
delay_ms(2);
lcd_wcmd(0x38,0);
delay_ms(2);
lcd_wcmd(0x38,0);
delay_ms(2);
lcd_wcmd(0x0F,1); //显示开,光标闪烁
delay_ms(2);
lcd_wcmd(0x06,1); //移动光标
delay_ms(2);
lcd_wcmd(0x01,1); //清除LCD的显示内容
delay_ms(2);
}
/*显示单个字符*/
void lcd_write_char(unsigned char x,unsigned char y,unsigned char data)
{
switch(y)
{
case 0: //显示第一行时指令码=地址码+0x40
lcd_wcmd(0x80+x,1); //发送地址码
break;
case 1:
lcd_wcmd(0xC0+x,1);
break;
default:
break;
}
lcd_wdat(data|0x30); //写数据,转换为ASSIIC码
}
/*显示字符串*/
void lcd_write_string(unsigned char x,unsigned char y,unsigned char *str)
{
switch(y)
{
case 0:
lcd_wcmd(0x80+x,1);
break;
case 1:
lcd_wcmd(0xC0+x,1);
break;
default:
break;
}
while(*str)
{
lcd_wdat(*str);
str++;
}
}
void main(void)
{
//端口初始化
SFIOR&=0xFB;
PORTA=0xFF;
PORTC=0xFF;
PORTD=0xFF;
PORTE=0xFF;
PORTF=0xFF;
PORTG=0xFF;
lcd_init();
lcd_wcmd(0x01,1);
while(1)
{
lcd_write_char(2,0,8);
lcd_write_string(4,1,"zhangqing");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -