📄 lcd12864.h
字号:
/**************************************************************************
THE AMPIRE_12864 GRAPHIC LCD LIB
COPYRIGHT (c) 2007 BY zyg.
-- ALL RIGHTS RESERVED --
File Name: LCD12864.h
Author: zhuyiguo
Created: 2007/4/27
Finish: 2007/5/3
Modified: NO
Revision: 1.0
***************************************************************************/
#ifndef LCD_CHAR_1602_2007_4_27
#define LCD_CHAR_1602_2007_4_27
#include <iom16v.h>
#include <macros.h>
#include "LCD12864_DATA.h"
//*****************************************************************
//控制脚定义
#pragma data:data
#define CSC1_1 asm("sbi 0x15,0")
#define CSC1_0 asm("cbi 0x15,0")
#define CSC2_1 asm("sbi 0x15,1")
#define CSC2_0 asm("cbi 0x15,1")
#define RS_D asm("sbi 0x15,2")
#define RS_I asm("cbi 0x15,2")
#define RW_R asm("sbi 0x15,3")
#define RW_W asm("cbi 0x15,3")
#define E_1 asm("sbi 0x15,4")
#define E_0 asm("cbi 0x15,4")
//****************************************************************
#define uchar unsigned char
#define uint unsigned int
const uchar *p_to_flash; //指向程序存储区的指针,用来指向字模表
uchar hanzi_flag=1,graphy_flag=0,graphy_num=0;
uchar enter=0,flash_flag=0;
uint adc_value;
//*****************************************************************
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x1F;
PORTD = 0x00;
DDRD = 0xe0;
}
//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//*****************************
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF3; //setup
TCNT1L = 0xCB;
//OCR1AH = 0x3D;
//OCR1AL = 0x09;
//OCR1BH = 0x3D;
//OCR1BL = 0x09;
//OCR1CH = $OCR1CH$;
//OCR1CL = $OCR1CL$;
//ICR1H = 0x3D;
//ICR1L = 0x09;
TCCR1A = 0x00;
TCCR1B = 0x04; //start Timer
}
//ADC initialize
// Conversion time: 52uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRA = 0xCD;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
watchdog_init();
timer1_init();
//adc_init();
MCUCR = 0x00;
GICR = 0xc0;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//******************************************************************
//延时函数
void delay_us(int time)//微妙级延时函数
{
WDR();
while(time--)
{
NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
}
}
void delay_ms(int time)//毫秒级延时函数
{
WDR();
while(time--)
{
delay_us(1000);
}
WDR();
}
//********************************************************************
//读LCD12864状态字
unsigned char lcd_read_code(void)
{
unsigned char code;
DDRA=0x00;
RS_I;
NOP();
RW_R;
NOP();
code=PINB;
E_1;
delay_us(1);
E_0;
DDRA=0xff;
return code;
//WDR();
}
//*******************************************************************
//判断LCD是否为忙状态
void judgebusy(void)
{
//unsigned char t;
//t=lcd_read_code();
while(((lcd_read_code())&0x80)==0x80)
{
//t=lcd_read_code();
//if((t&0x80)!=0x80) break;
WDR();
}
}
//写显示数据*******************************************************************
void lcd_write_data(unsigned char data)
{
WDR();
DDRB=0xff;
RS_D;
NOP();
RW_W;
NOP();
PORTB=data;
E_1;
//judgebusy();
delay_us(1);
E_0;
DDRB=0x00;
WDR();
}
//写状态字********************************************************************
void lcd_write_code(unsigned char code)
{
WDR();
DDRB=0xff;
RS_I;
NOP();
RW_W;
NOP();
PORTB=code;
E_1;
//judgebusy();
delay_us(1);
E_0;
DDRB=0x00;
WDR();
}
//**************************************************************
//写一个汉字
void dis_one_zi(uchar x_add,uchar y_add,const uchar *po_to_flash)
{
uchar i,row,column;
row=x_add*2+0xb8;
column=(y_add<4?y_add:y_add-4)*16+0x40; //左右半屏判断,
if(y_add<4)
{
CSC2_1;
}
if(!(y_add<4))
{
CSC1_1;
}
lcd_write_code(row);
lcd_write_code(column);
for(i=0;i<32;i++)
{
if(i==16)
{
lcd_write_code(row+1);
lcd_write_code(column);
}
lcd_write_data(*po_to_flash++);
}
CSC1_0;//使列扫描无效
CSC2_0;
WDR();
}
//**************************************************************
//写一个字母
void dis_one_abc(uchar x_add,uchar y_add,const uchar *po_to_flash)
{
uchar i,row,column;
row=x_add*2+0xb8;
column=(y_add<8?y_add:y_add-8)*8+0x40;
if(y_add<8)
{
CSC2_1;
}
if(!(y_add<8))
{
CSC1_1;
}
lcd_write_code(row);
lcd_write_code(column);
for(i=0;i<16;i++)
{
if(i==8)
{
lcd_write_code(row+1);
lcd_write_code(column);
}
lcd_write_data(*po_to_flash++);
}
CSC1_0;
CSC2_0;
WDR();
}
//写数字K=0,显示前半个字 ******************************************
void dis_one_ban_zi(uchar x_add,uchar y_add,uchar k_add,const uchar *po_to_flash)
{
uchar i,j,w,e;
if(k_add==0){e=0;}
if(k_add==1){e=8;}
j=x_add*2+0xb8;
w=(y_add<4?y_add:y_add-4)*16+0x40; //左右半屏判断
if(y_add<4)
{
CSC2_1;
}
if(!(y_add<4))
{
CSC1_1;
}
lcd_write_code(j);
lcd_write_code(w+e);
for(i=0;i<16;i++)//循环显示内容
{
if(i==8)
{
lcd_write_code(j+1);
lcd_write_code(w+e);
}
lcd_write_data(*po_to_flash++);
}
CSC1_0;
CSC2_0;
WDR();
}
//*****************************************************************
void CLRLCD(void) //清屏
{
uchar n,m;
for(n=0;n<4;n++)
{
for(m=0;m<8;m++)
{
p_to_flash=X26;
dis_one_zi(n,m,p_to_flash);
WDR();
}
}
}
//***********************************************************************
void lcd_init(void) //显示屏初始化 ,写入初始化命令字
{
delay_ms(100);
lcd_write_code(0x3f);
lcd_write_code(0xc0);
lcd_write_code(0xb8);
lcd_write_code(0x40);
CLRLCD();//清屏
}
//**********************************************************************
//显示图形
void display_graphic(const uchar *po_to_flash)
{
uchar i,row=0xb8,column=0x40,count=0;
for(;row<0xc0;row++)
{
WDR();
CSC2_1;CSC1_0;
lcd_write_code(row);
lcd_write_code(column);
for(i=0;i<64;i++)
{
lcd_write_data(*po_to_flash++);
}
CSC2_0;CSC1_1;//显示右半页
lcd_write_code(row);
lcd_write_code(column);
for(i=0;i<64;i++)
{
lcd_write_data(*po_to_flash++);
}
}
WDR();
CSC2_0;CSC1_0;
}
//清一列子程序(在显示波形时用到)*******************************************************
void clear_column(uchar column)
{
uchar i;
uchar page=0xb8;
for(i=0;i<8;i++)
{
lcd_write_code(page++);
lcd_write_code(column);
lcd_write_data(0x00);
}
}
//显示波形******************************************************
void wave_display(void)
{
uchar d[2]={'0','0'};
uchar i,flag=0,cha_page,cha_dot,cha;
uchar org_dot,page0,page1;
uchar page,column=0x40;
CSC2_1;CSC1_0;
while(1)
{
WDR();
if(hanzi_flag==1) break;
d[1]=d[0];
page1=d[1]/8;
page=0xb8+(7-page1);
org_dot=d[1]%8;//显示上一次坐标中最上端的余值
d[0]=(uchar)adc_value;
page0=d[0]/8;//本次的坐标值中,占用整页数;
cha_dot=d[0]%8;
if(flag%2==0)
{CSC2_1;CSC1_0;}
else{CSC2_0;CSC1_1;}
clear_column(column);
if(page0>page1)//本次占的页数比上一次的多的情况下;
{
lcd_write_code(page);
lcd_write_code(column);
if(org_dot!=7) //如果最上页是满显示的话,就跳过;
{lcd_write_data(0xff>>(org_dot+1));}
cha_page=page0-page1;
page--;
for(i=(cha_page-1);i>0;i--)
{
lcd_write_code(page--);
lcd_write_code(column);
lcd_write_data(0xff);
}
lcd_write_code(page);//显示本次坐标中最上页的余值;
lcd_write_code(column);
{lcd_write_data(0xff<<(7-cha_dot));}
CSC2_0;CSC1_0;
}
if(page0<page1)//本次占的页数比上一次的少的情况下;
{
lcd_write_code(page);//先显示上一次坐标中最上页的余值;
lcd_write_code(column);
lcd_write_data(0xff<<(7-org_dot));
cha_page=page1-page0;
page++;
for(i=(cha_page-1);i>0;i--)//显示所差的页数
{
lcd_write_code(page++);
lcd_write_code(column);
lcd_write_data(0xff);
}
lcd_write_code(page);
lcd_write_code(column);
if(cha_dot!=7)
{lcd_write_data(0xff>>(cha_dot+1));}
CSC2_0;CSC1_0;
}
if(page0==page1)
{
lcd_write_code(page);
lcd_write_code(column);
if(d[0]>d[1])//本次坐标比上一次大
{lcd_write_data((0xff<<(7-cha_dot))&(0xff>>(org_dot+1)));}
else if(d[0]<d[1])//本次坐标比上一次小
{lcd_write_data((0xff<<(7-org_dot))&(0xff>>(cha_dot+1)));}
else if(d[0]==d[1])//如果相等的话,就显示和上次相等;
{
lcd_write_data((0xff<<(7-org_dot))&(0xff>>org_dot));
}
CSC2_0;CSC1_0;
}
column++;
if(column==0x80)
{column=0x40;
flag++;
}
WDR();
}
}
//图片滚屏效果子程序:***********************************************
void scroll(const uchar *po_to_flash)
{
unsigned char i,start;
while(1)
{
WDR();
if(hanzi_flag==1) break;//显示汉字标志位为1则跳出循环;
start=0xc0;
for(i=0;i<64;i++)
{
display_graphic(po_to_flash);//显示完一屏则起始行加1;
lcd_write_code(start);
start++;
}
}
/* while(hanzi_flag==0)//另外一种写法;
{
WDR();
start=0xc0;
for(i=0;i<64;i++)
{
p_to_flash=tu1;display_graphic(p_to_flash);
lcd_write_code(start);
start++;
}
}*/
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -