cocoguojia 发表于 2010-11-14 12:56:43

CVAVR 写的 LCD12864(QC12864B 带字库 控制器ST7920)程序

/////////////////////////////////////////////////////////////////////
/*This program was produced by the CodeWizardAVR V1.25.1 Standard*/
/*LCD型号:QC12864B(带汉字库)或兼容型号                           */      
/*控制器 : ST7920                                                */
/*author:cocoguojia                                                */      
/*Chip type         : ATmega16L                                  */
/*Program type      : Application                              */
/*Clock frequency   : 7.372800 MHz                               */
/*Memory model      : Small                                    */
/*External SRAM size: 0                                          */
/*Data Stack size   : 256                                        */
/*                                                               */
/*1~~~20   GND VCC VO RS RW EDB0~DB7PSBNCRSTVOUTAK   */
/*A为背光阳极VO为对比度调节VOUT悬空                            */
/*注意 CQ12864B 的RST是低电平复位,所以显示时要置高                */
/*不同型号复位电平可能不一样                                       */
/////////////////////////////////////////////////////////////////////

//修改自网友资料,但我不知道原作者是谁,在此向他/她致谢
//网上CVAVR写的12864代码比较少,我也是用CVAVR的老菜鸟
//原作者是用ICC写的C代码,我改成CVAVR的,方便广大CVAVR的朋友们参考
//【尊重版权和电子工程师的劳动】
         
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//头文件文件
#include <mega16.h>
#include <delay.h>

///////////////////////////////////////////////////
///////////////////////////////////////////////////
//定义变量区
#define u8   unsigned char
#define u16unsigned int

///////////////////////////////////////////////////
///////////////////////////////////////////////////
//定义IO操作区
#define RS_CLR PORTB.0=0               
#define RS_SET PORTB.0=1
#define RS_DIRECTION_OUT DDRB.0=1
               
#define EN_CLR PORTB.4=0            
#define EN_SET PORTB.4=1
#define EN_DIRECTION_OUT DDRB.4=1

#define RW_CLR PORTB.1=0               
#define RW_SET PORTB.1=1
#define RW_DIRECTION_OUT DDRB.1=1
               
#define RST_CLR PORTB.7=0            
#define RST_SET PORTB.7=1
#define RST_DIRECTION_OUT DDRB.7=1

#define RSB_CLR PORTB.5=0            
#define RSB_SET PORTB.5=1
#define RSB_DIRECTION_OUT DDRB.5=1

#define DB_PORT PORTA            
#define DB_DIRECTION_OUT DDRA=0XFF;

///////////////////////////////////////////////////
///////////////////////////////////////////////////
//IO口初始化子程序
void system_init(void)
{
    RS_DIRECTION_OUT;
    EN_DIRECTION_OUT;
    RW_DIRECTION_OUT;
    RST_DIRECTION_OUT;
    DB_DIRECTION_OUT;
    RSB_DIRECTION_OUT;   
    RW_CLR;//一直是低电平,用硬件置低也可
    RST_SET;//一直是高电平,用硬件置高也可
    RSB_SET;//一直是高电平,用硬件置高也可
    DB_PORT = 0xFF;
}

///////////////////////////////////////////////////
///////////////////////////////////////////////////
// 显示屏命令写入函数
void LCD_write_com(u8 com)
{
    RS_CLR;
    EN_SET;
    DB_PORT = com;
    delay_ms(1);
    EN_CLR;
}

///////////////////////////////////////////////////
///////////////////////////////////////////////////
// 显示屏数据写入函数
void LCD_write_data(u8 data)
{
    RS_SET;
    EN_SET;
    DB_PORT = data;
    delay_ms(1);
    EN_CLR;
}

///////////////////////////////////////////////////
///////////////////////////////////////////////////
//显示屏初始化函数
void LCD_init(void)
{
    LCD_write_com(0x34);      //扩充指令操作/8位数据
    delay_ms(3);
    LCD_write_com(0x30);      //基本指令操作/8位数据
    delay_ms(3);
    //LCD_write_com(0x0f);    //显示开,光标开,允许闪烁
    LCD_write_com(0x0c);      //显示开,光标关
    delay_ms(3);
    LCD_write_com(0x01);      //清除LCD的显示内容
    delay_ms(5);
}


///////////////////////////////////////////////////
///////////////////////////////////////////////////
//显示屏清空显示
void LCD_clear(void)
{   
LCD_write_com(0x30);
LCD_write_com(0x01);
delay_ms(5);
}

///////////////////////////////////////////////////
///////////////////////////////////////////////////
//函数名称:DisplayCgrom
//功能:在屏上地址是addr的地方 显示CGROM里的汉字(*str)
void Display_str(u8 addr,u8 flash *str)
{
LCD_write_com(addr);
      delay_ms(5);
while(*str != '\0')
{
      LCD_write_data(*str);
      str++;
      delay_ms(5);
}
}


///////////////////////////////////////////////////
///////////////////////////////////////////////////
// 主程序
void main(void)
{   
    system_init();                              //系统初始化,设置IO口属性
    LCD_clear();                                  //清屏
    delay_ms(2000);                               //延时待稳定
    LCD_clear();                                  //再清一次屏,做到干干净净 ^_^
    LCD_init();                                 //液晶参数初始化设置
   
    //开始显示信息
    Display_str(0x80,"济南策略电子");
    Display_str(0x88,"旺:cocoguojia");
    Display_str(0x90,"80后天道酬勤");
    Display_str(0x98,"电话:15064016791");
   
    while(1)
    {
      ;//原地踏步
    }
}

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_597822HDFLGW.jpg
实物照片 (原文件名:截图05.jpg)

cuikai12345 发表于 2010-11-14 21:38:08

mark

lsy5110 发表于 2010-11-14 21:54:55

mark

All-Star 发表于 2011-1-4 15:58:50

楼主 你好 我把你的程序放在ICC里面运行,改了相应的宏定义,编译没错,但就是液晶显示不正常,乱码了,是怎么一回事呀?

liangerfan 发表于 2011-1-14 00:42:37

谢谢楼主共享

cocoguojia 发表于 2011-4-27 16:59:08

回复【3楼】All-Star
-----------------------------------------------------------------------

我用的是CVAVR 编译软件

cn_fisher 发表于 2011-4-27 19:11:24

回复【3楼】All-Star
-----------------------------------------------------------------------

你好!我也是用ICC编译,宏定义我也改了,但就是编译出错,就是提示Display_str(0x80,"济南策略电子");这几个显示的句子出错,我找了很久都找不出那么出问题,请楼主指教!!谢谢

cc1102 发表于 2011-8-26 09:17:56

不懂啊。。。。控制器怎么用的啊

cckeke 发表于 2012-8-13 16:55:01

mark    学习了

majiansongok 发表于 2012-12-22 21:20:50

试了,有用,谢谢啊
页: [1]
查看完整版本: CVAVR 写的 LCD12864(QC12864B 带字库 控制器ST7920)程序