1602的CVAVR程序

// 1602显示字符
#include<mega16.h> 
#include<delay.h>

#define lcd_bus    PORTA    // 数据总线
#define  rs        PORTC.0  // 数据&指令选择,H:写数据,L:写指令   
#define  rw        PORTC.1  // 读&写选择,H:read,L:write
#define  e         PORTC.2  // 读写使能
#define  bf        7        // 忙闲状态标志位,PORTA.7,H:内部正执行操作,L:空闲
void chk_busy(void);        // 检测LCD忙闲
void init_lcd(void);        // LCD初始化
void wr_comm(unsigned char comm);   // 写指令
void wr_comm_no(unsigned char comm);// 写指令,不检测忙闲
void wr_data(unsigned char dat);    // 写数据
void wr_str(unsigned char flash *p);      // 显示字符串

void main()
{
  delay_ms(200);
  init_lcd();     //LCD初始化
  wr_comm(0x80);  //第一行第一个字符地址
  wr_str("lcd1602");
  wr_comm(0xc0); // 第二行第一个字符地址
  wr_str("Tai shan Dian Zi");
  while(1);
}
/*------------------LCD初始化-----------------*/
void init_lcd(void)

  PORTA = 0xff;
  PORTC = 0xff;
  DDRC = 0xff;   // PC输出,控制线
  DDRA = 0xff;   // PA输出,数据线
  wr_comm_no(0x38);  //不检测忙闲
  delay_ms(5);
  wr_comm_no(0x38);
  delay_ms(5);
  wr_comm_no(0x38);
  delay_ms(5);
  wr_comm_no(0x38);
  delay_ms(5);
  wr_comm(0x38);  // 设定LCD为16*2显示,5*7点阵,8位数据接口,检测忙信号
  delay_us(11);   // 延时11us
  wr_comm(0x08);  // 关闭显示,检测忙信号
  delay_us(3);
  wr_comm(0x01);  // 显示清屏,检测忙信号
  delay_us(3);
  wr_comm(0x06);  // 显示光标自动右移,整屏不移动,检测忙信号
  delay_us(3);
  wr_comm(0x0c);  //开显示,不显示光标,检测忙信号
  delay_us(3);
}
/*--------------检测LCD忙闲---------------*/
void chk_busy(void)
{
  lcd_bus=0xff;
  rs=0;
  rw=1;
  ;
  e=1;
  DDRA &= ~(1<<bf);  // PA7置为输入
  delay_us(2);
  while((PINA&(1<<bf))==(1<<bf));
  e=0; 
  DDRA |= 1<<bf;    // PA7置为输出
  delay_us(2);
}
/*------------写命令到LCD--------------*/
void wr_comm(unsigned char comm)
{
  chk_busy();
  rs=0;//H:写数据,L:写指令
  rw=0;
  e=0;
  ;
  lcd_bus=comm;//内容
  delay_us(3);
  e=1;
  ;
  e=0;
}
/*------------写命令到LCD不检测忙闲--------------*/
void wr_comm_no(unsigned char comm)
{
  rs=0;//H:写数据,L:写指令
  rw=0;
  e=0;
  ;
  lcd_bus=comm;//内容
  delay_us(3);
  e=1;
  ;
  e=0;
}
/*------------写数据到LCD--------------*/
void wr_data(unsigned char dat)
{
  chk_busy();
  rs=1;//H:写数据,L:写指令
  rw=0;
  e=0;
  ;
  lcd_bus=dat;//内容
  delay_us(3);
  e=1;
  ;
  e=0;
}
/*-------------写字符串----------------*/
void wr_str(unsigned char flash *s)
{
   while(*s>0)   //字符串以0结束
   {
      wr_data(*s);
      s++;
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值