lcd12864程序 avr

谁有lcd12864 AVR的测试程序
2025-01-07 02:37:56
推荐回答(2个)
回答1:

12864液晶常用的有两种一种带字库,一种不带字库。不晓得要那种,两种我都有调试好了的源程序。/* 编 译 器: ICCV7 */
/* 位图取摸方式:横向取模,字节正序. */
/* 单 片 机: ATMega128 */
/* 晶 振: 8M */
/* 液晶控制器:ST7920 */
/* 硬件连接: */
/* LCD DB0~DB7 ---PA0~PA7 */
/* LCD Di ---PC0 */
/* LCD RW ---PC1 */
/* LCD E ---PC2 */
/* LCD PSB ---PC3 */
/* LCD RST ---PC5 */
/* LCD LED ---PC6 (外加硬件控制背光) */
/* LCD 5V供电~~~ */
/* */
/* 版 本:V1.0 程序仅供参考 */
/* 日 期:2011-01-01 */
/* 参考文件: */
/* 维护记录: */
/**************************************************************************/
/************************************************
文件:main.c
用途:系统主函数
注意:系统时钟8M
************************************************/
#include
#include
#include "lcd.h"
#include "displaydata.h"
/*************************主函数***************************/
int main( void )
{ LCD_DIR_PORT = 0xff; //端口A初始化
LCD_OP_PORT = 0xff; //端口A初始化

LCD_EN_DDR |= LCD_EN_BIT; //端口初始化
LCD_RS_CS_DDR |= LCD_RS_CS_BIT; //端口初始化
LCD_PSB_DDR |= LCD_PSB_BIT; //端口初始化
LCD_RW_DDR |= LCD_RW_BIT; //端口初始化
LCD_RW_PORT &= ~LCD_RW_BIT; //端口初始化 LCD_RST_0; //液晶复位
LCD_Delay_ms(100); //延时100ms
LCD_RST_1; //液晶复位
LCD_Delay_ms(100); //延时100ms
LCD_PSB_1; //设置液晶为串口方式
LCD_Delay_ms(20); //延时20ms
LCD_LED_1; //液晶背光开

PORTE = 0x00; //开发板关LED
DDRE = 0xFF; //开发板关LED
PORTE |= (0<<2); //开发板关LED
while(1)
{
Ini_Lcd(); //初始化液晶
Disp_HZ(0x80,line1,8); //显示12864液晶
Disp_HZ(0x90,line2,8); //显示AVR程序
Disp_HZ(0x88,line3,8); //显示cdhadz Disp_HZ(0x98,line4,8); //显示宏安电子

LCD_Delay_ms(5000); //延时5秒
Ini_Lcd(); //初始化液晶
Draw_PM(mycar); //显示12864位图
LCD_Delay_ms(5000); //延时5秒
}
}

回答2:

12864.h#ifndef _12864_H_
#define _12864_H_#define SCLK PORTA.0
#define SID PORTA.4void Write_date(unsigned char date);
void Write_12864(unsigned char type,unsigned char date);
extern void Write_com(unsigned char command);
extern void Write_dat(unsigned char date);
extern void Show_string(unsigned char x_addr,unsigned char y_addr,flash unsigned char *p);//字符串指针
extern void Show_array(unsigned char x_addr,unsigned char y_addr,unsigned char *p);//数组指针
extern void Clear_GDRAM(void);
extern void Paint_12864(unsigned char start_x,unsigned char start_y,unsigned char x,unsigned char y,flash unsigned char *p);
/*
画自定义大小的图或汉字
参数依次为自定义图片起始坐标(start_x,start_y),图片大小x X y,字模指针
取字模方式为阴码(1点亮)、顺向(高位在前)、逐列式
*/
extern void Init_12864(void);#endif 12864.c #include
#include
#include "12864.h"
void Write_date(unsigned char date)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCLK=0;
if((date< SID=1;
else
SID=0;
SCLK=1;
}
}void Write_12864(unsigned char type,unsigned char date)
{
unsigned char temp;
Write_date(type);//发写命令/数据控制字 temp=date&0xf0; //屏蔽低四位,数据格式DDDD0000
Write_date(temp);//发数据高四位 temp=date&0x0f; //屏蔽高四位
temp<<=4; //数据格式DDDD0000
Write_date(temp); //发数据低四位
}void Write_com(unsigned char command)
{
Write_12864(0xf8,command);//写命令
}void Write_dat(unsigned char date)
{
Write_12864(0xfa,date);//写数据
}void Show_string(unsigned char x_addr,unsigned char y_addr,flash unsigned char *p)//字符串指针
{
if(x_addr==1)
Write_com(0x80+y_addr-1);
else if(x_addr==2)
Write_com(0x90+y_addr-1);
else if(x_addr==3)
Write_com(0x88+y_addr-1);
else if(x_addr==4)
Write_com(0x98+y_addr-1);
while(*p)
{
Write_dat(*p);
p++;
}
}
void Show_array(unsigned char x_addr,unsigned char y_addr,unsigned char *p)//数组指针
{
if(x_addr==1)
Write_com(0x80+y_addr-1);
else if(x_addr==2)
Write_com(0x90+y_addr-1);
else if(x_addr==3)
Write_com(0x88+y_addr-1);
else if(x_addr==4)
Write_com(0x98+y_addr-1);
while(*p)
{
Write_dat(*p);
p++;
}
}void Clear_GDRAM()
{
unsigned char i,j;
unsigned char addr;
Write_com(0x34);
addr=0x80;
for(i=0;i<32;i++)
{
Write_com(addr++);
Write_com(0x80);
for(j=0;j<16;j++)
{
Write_dat(0x00);
}
}
addr=0x80;
for(i=0;i<32;i++)
{
Write_com(addr++);
Write_com(0x88);
for(j=0;j<16;j++)
{
Write_dat(0x00);
}
}
Write_com(0x30);
}void Paint_12864(unsigned char start_x,unsigned char start_y,unsigned char x,unsigned char y,flash unsigned char *p)//画自定义大小的图
{
//参数一次为自定义图片歧视坐标(start_x,start_y),图片大小x X y,字模指针
//取字模方式为阴码(1点亮)、顺向(高位在前)、逐列式
unsigned char i,j;
unsigned char addr;
Write_com(0x34);//拓展指令模式,画图显示关
addr=0x80+start_y; //纵坐标起始位置
for(i=0;i {
if((i+start_y)>=0&&(start_y+i)<=31) //如果在上部分
{
Write_com(addr); //先写纵坐标
Write_com(0x80+start_x); //再写x坐标(注意start_x每加1,横坐标跳16格,因为12864为按字节写数据)
}
else //否则
{
Write_com(addr-32); // 先写下部分y坐标(下部分坐标不与上部分连续,仍从0开始)
Write_com(0x88+start_x); //再写下部分x坐标
}
addr++;//纵坐标地址加1
for(j=0;j {
Write_dat(*p);
p++;
}
}
Write_com(0x36);//开画图显示
Write_com(0x30); //回到基本指令模式
}void Init_12864()
{
PORTA|=0x11; //时钟线,数据线均设置为带上拉输出
DDRA|=0x11;
Write_com(0x30);
delay_ms(2);
Write_com(0x0c);//整体显示开,0000 1(整体显示)(游标)(游标位置)
delay_ms(2);
Write_com(0x01);//清屏
delay_ms(2);
}