📄 avr+3310lcdtest.c
字号:
3310LCDTest.c
#include <iom48v.h>
#include <macros.h>
#include "lcd.h"
#include "bmp.h"
/*******************************************/
void main(void)
{
OSCCAL=0x99;// 8M系统内部时钟校准
//设置MCU的I/O口
DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI | SPI_CLK| 0X02;
SPSR |= BIT(SPI2X);// 设置SPI时钟倍速
SPCR |= BIT(SPE)|BIT(MSTR);// 使能SPI接口,主机模式,4M时钟
LCD_init(); //初始化LCD模块
LCD_write_String(1,5,"www.527dz.com"); //显示英文字符串”www.527dz.com“
LCD_draw_map(0,2,AVR_bmp,40,24); //显示“AVR”位图
LCD_draw_map(44,3,china_bmp,36,15); //显示”实验室“位图
PORTB |= 0x02; //LED亮
while(1)
{
LCD_move_chi(0, 0, 25); //汉字移动显示
}
}
LCD3310驱动程序:文件名3310LCD.c
#include <iom48v.h>
#include <macros.h>
#include "lcd.h"
#include "6x8.h"
#include "chinese.h"
/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:2004-8-10
最后修改日期:2004-8-10
----------------------------*/
void LCD_init(void)
{
PORTB &= ~LCD_RST;// 产生一个让LCD复位的低电平脉冲
delay_1us();
PORTB |= LCD_RST;
PORTB &= ~LCD_CE ;// 关闭LCD
delay_1us();
PORTB |= LCD_CE;// 使能LCD
delay_1us();
LCD_write_byte(0x21, 0);// 使用扩展命令设置LCD模式
LCD_write_byte(0xc8, 0);// 设置偏置电压
LCD_write_byte(0x06, 0);// 温度校正
LCD_write_byte(0x13, 0);// 1:48
LCD_write_byte(0x20, 0);// 使用基本命令
LCD_clear();// 清屏
LCD_write_byte(0x0c, 0);// 设定显示模式,正常显示
PORTB &= ~LCD_CE ;// 关闭LCD
}
/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函数
编写日期:2004-8-10
最后修改日期:2004-8-10
-----------------------------------------------------------------------*/
void LCD_clear(void)
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
/*-----------------------------------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83
Y:0-5
编写日期:2004-8-10
最后修改日期:2004-8-10
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);// column
LCD_write_byte(0x80 | X, 0);// row
}
/*-----------------------------------------------------------------------
LCD_write_char: 显示英文字符
输入参数:c:显示的字符;
编写日期:2004-8-10
最后修改日期:2004-8-10
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[c][line], 1);
}
/*-----------------------------------------------------------------------
LCD_write_char: 英文字符串显示函数
输入参数:*s:英文字符串指针;
X、Y: 显示字符串的位置
-----------------------------------------------------------------------*/
void LCD_write_String(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
/*-----------------------------------------------------------------------
LCD_write_chi: 在LCD上显示汉字
输入参数:X、Y:显示汉字的起始X、Y坐标;
ch_with :汉字点阵的宽度
num:显示汉字的个数;
line:汉字点阵数组中的起始行数
row:汉字显示的行间距
编写日期:2004-8-11
最后修改日期:2004-8-12
-----------------------------------------------------------------------*/
void LCD_write_chi(unsigned char X, unsigned char Y,
unsigned char ch_with,unsigned char num,
unsigned char line,unsigned char row)
{
unsigned char i,n;
LCD_set_XY(X,Y);//设置初始位置
for (i=0;i<num;)
{
for (n=0; n<ch_with*2; n++)//写一个汉字
{
if (n==ch_with)//写汉字的下半部分
{
if (i==0) LCD_set_XY(X,Y+1);
else
LCD_set_XY((X+(ch_with+row)*i),Y+1);
}
LCD_write_byte(china_char[line+i][n],1);
}
i++;
LCD_set_XY((X+(ch_with+row)*i),Y);
}
}
/*-----------------------------------------------------------------------
LCD_write_chi: 汉字移动
输入参数:X、Y:显示汉字的起始X、Y坐标;
T:移动速度;
编写日期:2004-8-13
最后修改日期:2004-8-13
-----------------------------------------------------------------------*/
void LCD_move_chi(unsigned char X, unsigned char Y, unsigned char T)
{
unsigned char i,n,j=0;
unsigned char buffer_h[84]={0};
unsigned char buffer_l[84]={0};
for (i=0; i<156; i++)
{
buffer_h[83] = china_char[i/12][j];
buffer_l[83] = china_char[i/12][j+12];
j++;
if (j==12) j=0;
for (n=0; n<83; n++)
{
buffer_h[n]=buffer_h[n+1];
buffer_l[n]=buffer_l[n+1];
}
LCD_set_XY(X,Y);
for (n=0; n<83; n++)
{
LCD_write_byte(buffer_h[n],1);
}
LCD_set_XY(X,Y+1);
for (n=0; n<83; n++)
{
LCD_write_byte(buffer_l[n],1);
}
delay_nms(T);
}
}
/*-----------------------------------------------------------------------
LCD_draw_map: 位图绘制函数
输入参数:X、Y:位图绘制的起始X、Y坐标;
*map:位图点阵数据;
Pix_x:位图像素(长)
Pix_y:位图像素(宽)
编写日期:2004-8-13
最后修改日期:2004-8-13
-----------------------------------------------------------------------*/
void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char *map,
unsigned char Pix_x,unsigned char Pix_y)
{
unsigned int i,n;
unsigned char row;
if (Pix_y%8==0) row=Pix_y/8;//计算位图所占行数
else
row=Pix_y/8+1;
for (n=0;n<row;n++)
{
LCD_set_XY(X,Y);
for(i=0; i<Pix_x; i++)
{
LCD_write_byte(map[i+n*Pix_x], 1);
}
Y++;//换行
}
}
/*-----------------------------------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:data:写入的数据;
command :写数据/命令选择;
编写日期:2004-8-10
最后修改日期:2004-8-13
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data, unsigned char command)
{
PORTB &= ~LCD_CE ;// 使能LCD
if (command == 0)
PORTB &= ~LCD_DC ;// 传送命令
else
PORTB |= LCD_DC ;// 传送数据
SPDR = data;// 传送数据到SPI寄存器
while ((SPSR & 0x80) == 0);// 等待数据传送完毕
PORTB |= LCD_CE ;// 关闭LCD
}
延时程序:文件名delay.c
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void)//1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n)//N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void)//1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -