📄 display.c
字号:
/*************************************************************
型号: OCM12864-8
编写: hyc
控制IC: ST7565p
E-mail: hyc_sea@mail.sdu.edu.cn
***************************************************************/
///////////////////////////////////////////////
// 9 A---------------VDD
// 8 K----------------GND
// 7 VSS--------------GND
// 6 VDD--------------VDD
// 5 CDA--------------IOB4
// 4 SCK--------------IOB3
// 3 A0 --------------IOB2
// 2 /RES-------------IOB1
// 1 /CS--------------IOB0
/////////////////////////////////////////////////
#include "SPCE061A.H"
#include "char_lib.h"
#include "display.h"
#include "organ.h"
extern int mode; //模式
// mode=0 模式选择
// mode=1 录音
// mode=2 编辑
// mode=3 播放
extern int page; //页
extern int colume; //列
extern int n; //已输入的音符数
// n从1开始,n<=96,n=96时为满屏
extern unsigned char cha[96]; //存储音符的数组
//unsigned char *note;
/***************************************************/
/*125us的延时*/
void delay_nus(int n)//125us
{
while(n--);
*P_Watchdog_Clear=0x0001;
}
/*毫秒级延时*/
void delay_nms(int n)//
{
int i;
for(i=0;i<n;i++)
delay_nus(78);
}
/*写命令到寄存器*/
void send_cmd(unsigned char cmd)
{
unsigned char i;
unsigned char tmp;
LCD_A0_L; //指令通道
LCD_SCK_H; //时钟高,变数据
LCD_CS_L; //片使能
delay_nus(5);
for(i=0;i<8;i++)
{
tmp=cmd&0x0080;
if(tmp)
LCD_CDA_H;
else
LCD_CDA_L;
LCD_SCK_L; //时钟低,送数据
__asm("NOP");
__asm("NOP");
LCD_SCK_H; //上升沿,读数据
__asm("NOP");
__asm("NOP");
cmd<<=1;
}
LCD_CS_H; //片禁能
delay_nus(5);
}
/*写数据到DDRAM*/
void send_dat(unsigned char dat)
{
unsigned char i;
unsigned char tmp;
LCD_A0_H; //数据通道
LCD_SCK_H; //时钟高,变数据
LCD_CS_L; //片使能
delay_nus(5);
for(i=0;i<8;i++)
{
tmp=dat&0x0080;
if(tmp) LCD_CDA_H;
else LCD_CDA_L;
LCD_SCK_L; //时钟低,送数据
__asm("NOP");
__asm("NOP");
__asm("NOP");
__asm("NOP");
LCD_SCK_H; //时钟高,变数据
__asm("NOP");
__asm("NOP");
__asm("NOP");
__asm("NOP");
dat<<=1;
}
LCD_CS_H; //片禁能
delay_nus(5);
}
/*写页地址*/
void set_page_address(unsigned char dat)
{
send_cmd(0xb0|dat);
}
/*写列地址*/
void set_colume_address(unsigned char dat)
{
unsigned char tmp;
tmp=dat>>4;
tmp&=0x00ff;
send_cmd(0x10|tmp); //送列地址高三位
tmp=0x0f&dat;
send_cmd(tmp); //送列地址低四位
}
/*清屏*/
void Clear_S()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
set_page_address(i);
set_colume_address(0x00);
for(j=0;j<0x84;j++)
{
send_dat(0x00);
}
}
}
/*显示汉字*/
void display_cha(unsigned char *cha,int page,int colume)
{
int j;
set_page_address(page);
set_colume_address(colume);
for(j=0;j<16;j++)
{
send_dat(*(cha+j));
}
set_page_address(page+1);
set_colume_address(colume);
for(j=0;j<16;j++)
{
send_dat(*(cha+16+j));
}
}
/*显示音符*/
void display_note(unsigned char *note,int page,int colume)
{
int j;
set_page_address(page);
set_colume_address(colume);
for(j=0;j<8;j++)
{
send_dat(*(note+j));
}
}
/*显示模式选择界面*/
void display_mode_choice(void)
{
send_cmd(0xa6);
display_cha(qing,0,0);
display_cha(xuan,0,16);
display_cha(ze,0,32);
display_cha(gong,0,48);
display_cha(zuo,0,64);
display_cha(mo,0,80);
display_cha(shi,0,96);
display_cha(colon,0,112);
display_cha(num1,2,0);
display_cha(tan,2,16);
display_cha(zou,2,32);
display_cha(num2,4,0);
display_cha(bian,4,16);
display_cha(ji,4,32);
}
void display_mode_1(void)
{
send_cmd(0xa6);
display_cha(num1,0,0);
display_cha(tan,0,16);
display_cha(zou,0,32);
display_cha(mo,0,48);
display_cha(shi,0,64);
display_cha(colon,0,80);
page=1;
colume=0;
}
//根据数字,选择相应音符字模首地址给全局变量*note
/*void choose_note_lib(void)
{
switch(num)
case 1
}
void display_add(void)
{
if(n<96)
{
if(colume!=120)
{
set_colume_address(colume);
set_page_address(page);
display_note(*(note+n+1));
}
else
{
set_colume_address(0);
page++;
set_page_address(page);
display_note(*(note+n+1));
}
}
else
{
display_full();
}
n++;
}
*/
/*初始化*/
void lcd_initial(void)
{
LCD_RES_L;
delay_nus(5);
LCD_RES_H;
delay_nus(5);
send_cmd(0xA2); //LCD bias setting: 1/9
send_cmd(0xA0); //ADC selection: ram-seg normal
send_cmd(0xC8); //Common output mode selection: reverse
// send_cmd(0xDC); //??????????????????
// send_cmd(0xC8);//?????????????????
send_cmd(0x25); //resistor
send_cmd(0x81); //Electonic Volume
send_cmd(0x14);
send_cmd(0x2C); //voltage booster
send_cmd(0x2E); //voltage regulator
send_cmd(0x2F); //voltage follower
send_cmd(0xAF); //LCD display on
send_cmd(0xE0); //Column address increment w+1
send_cmd(0x40); //start line address
Clear_S();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -