📄 lcd.c
字号:
#include <iom128v.h>
#include <macros.h>
#include "lcd.h"
typedef unsigned char uchar;
typedef unsigned int uint;
void port_init(void)
{
//访问外部ram的总线端口
PORTA = 0x00;
DDRA = 0x00;
PORTC = 0x00;
DDRC = 0xFF;
}
void check_busy(uchar cs)
{
uchar temp;
while(temp)
{
if(cs)
temp=R_staus&0X80; //将忙状态读到temp中进行确定
else
temp=L_staus&0X80;
}
}
void lcdcommand(uchar cs,uchar com)
{
if(cs)
{
check_busy(1);
R_command=com;
}
else
{
check_busy(0);
L_command=com;
}
}
/*************************向LCD写数据函数*************************/
void lcddatas(char cs,uchar dd)
{
if(cs)
{
check_busy(1);
R_data=dd;
}
else
{
check_busy(0);
L_data=dd;
}
}
/**************************** LCD清屏函数*******************************/
void LCD_Clean(void)
{
unsigned char x,y;
for(x=0xb8;x<=0xbf;x++) //一页一页的写
{
lcdcommand(0,x);
lcdcommand(1,x); //设定X方向地址,X地址不能自增。要靠程序加
lcdcommand(0,LCD_Y); //设置Y的初始地址,Y可自加
lcdcommand(1,LCD_Y);
for(y=0;y<64;y++)
{
lcddatas(0,0x00);
lcddatas(1,0x00); //Y地址可以自增
}
}
}
void LCD_Init(void) //LCD初始化子函数
{
/*首先关闭12864的显示*/
check_busy(0); //LCD左半屏正在工作,等待......
L_command=LCD_OFF; //先关闭LCD左半屏的显示
check_busy(1); //LCD右半屏正在工作,等待......
R_command=LCD_OFF; //先关闭LCD右半屏的显示
/*开启12864的显示*/
check_busy(0);
L_command=LCD_ON; //打开LCD左半屏的显示
check_busy(1);
R_command=LCD_ON; //打开LCD右半屏的显示
/*设置LCD显示的起始行*/
check_busy(0);
L_command=LCD_X; //LCD左半屏起始行为0
check_busy(1);
R_command=LCD_X; //LCD右半屏起始行为0
}
void init_devices(void)
{
XMCRA = 0x00; //外部存储器控制
XMCRB = 0x00; //外存储高位地址屏蔽,释放端口C
port_init();
MCUCR = 0x80; //外部SRAM使能
}
/**********************************LCD字符显示函数(8*8)**********************************************/
void displaychar_left(uchar *array,uchar x,uchar y)
{
uchar i;
lcdcommand(0,LCD_PAGE+x);
lcdcommand(0,LCD_Y+y);
for(i=0;i<8;i++)
{
lcddatas(0,*(array+i));
}
}
void displaychar_right(uchar *array,uchar x,uchar y)
{
uchar i;
lcdcommand(1,LCD_PAGE+x);
lcdcommand(1,LCD_Y+y);
for(i=0;i<8;i++)
{
lcddatas(1,*(array+i));
}
}
void display_char(uchar*array1,uchar*array2,uchar zong,uchar heng)
{
if((heng>=0)&&(heng<=7))
{displaychar_left(array1,zong,heng*8); displaychar_left(array2,zong+1,heng*8);}
if((heng>=8)&&(heng<=15))
{displaychar_right(array1,zong,(heng-8)*8); displaychar_right(array2,zong+1,(heng-8)*8);}
}
/****************************** LCD汉字显示函数(8*16)****************************************/
void displayL(uchar*array,uchar x,uchar y) //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
{
uchar i;
lcdcommand(0,0xb8+x); //设置显示本字符的初始地址
lcdcommand(0,0x40+y);
for(i=0;i<16;i++) //每半个字代码为16元素的数组
{
lcddatas(0,*(array+i));
}
}
void displayR(uchar*array,uchar x,uchar y) //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
{
uchar i;
lcdcommand(1,0xb8+x);
lcdcommand(1,0x40+y);
for(i=0;i<16;i++) //每半个字代码为16元素的数组
{
lcddatas(1,*(array+i));
}
}
void display_chinese(uchar*array1,uchar*array2,uchar zong,uchar heng)
{
if((heng>=0)&&(heng<=3)) //左半屏显示
{
displayL(array1,zong*2,heng*16); displayL(array2,zong*2+1,heng*16);
}
if((heng>=4)&&(heng<=7)) //右半屏显示
{
displayR(array1,zong*2,(heng-4)*16); displayR(array2,zong*2+1,(heng-4)*16);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -