SPI-LCD12864, 单工: ST7920 AIP31020 串口模式
SPI-LCD12864, 单工 : ST7920,AIP31020 串口模式STC8F1K08
#define Write_Command 0xf8#define Write_Data 0xfa#define Read_Command 0xfc#define Read_Data 0xfe#define Setting_Basic_Instruction_Set 0x30#define Setting_Extended_Instruction_Set_Drawing_Off 0x34#define Setting_Extended_Instruction_Set_Drawing_On 0x36#define Clear_Display 0x01#define Entry_Mode_Cursor_Left 0x04#define Entry_Mode_Entire_Right 0x05#define Entry_Mode_Cursor_Right 0x06#define Entry_Mode_Entire_Left 0x07#define Display_Off 0x08#define Display_On_Cursor_Off_Inverse_Off 0x0c#define Display_On_Cursor_Off_Inverse_On 0x0d#define Display_On_Cursor_On_Inverse_Off 0x0e#define Display_On_Cursor_On_Inverse_On 0x0f#define Cursor_Move_Left 0x10#define Cursor_Move_Right 0x14#define Display_Move_Left 0x18#define Display_Move_Right 0x1c
/*----------------------------写1字节命令或数据----------------------------*/void LCD12864_Write_Byte(unsigned char temp){ unsigned char i; for(i=0;i<8;i++) { if((temp<<i)&0x80) LCD12864_SID=1; else LCD12864_SID=0; LCD12864_SCLK=0; LCD12864_SCLK=1; }}
/*----------------------------传送数据或者命令----------------------------*/void LCD12864_Write(unsigned char Command,unsigned char temp){ LCD12864_Write_Byte(Command); LCD12864_Write_Byte(temp&0xf0); LCD12864_Write_Byte((temp<<4)&0xf0);}
/*----------------------------清空GDRAM----------------------------*/void Clear_GDRAM(void){ unsigned char i,j,k; LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off); k=0x80; for(i=0;i<32;i++) { LCD12864_Write(Write_Command,k++); LCD12864_Write(Write_Command,0x80); for(j=0;j<16;j++) { LCD12864_Write(Write_Data,0x00); } } k=0x80; for(i=0;i<32;i++) { LCD12864_Write(Write_Command,k++); LCD12864_Write(Write_Command,0x88); for(j=0;j<16;j++) { LCD12864_Write(Write_Data,0x00); } } LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);}
/*----------------------------整页显示字符----------------------------*/void Display_Text(unsigned char code *addr){ unsigned char i; LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set); LCD12864_Write(Write_Command,0x80); //设置DDRAM地址 Delay_10us(); for(i=0;i<16;i++) { LCD12864_Write(Write_Data,*addr); addr++; } LCD12864_Write(Write_Command,0x90); //设置DDRAM地址 Delay_10us(); for(i=0;i<16;i++) { LCD12864_Write(Write_Data,*addr); addr++; } LCD12864_Write(Write_Command,0x88); //设置DDRAM地址 Delay_10us(); for(i=0;i<16;i++) { LCD12864_Write(Write_Data,*addr); addr++; } LCD12864_Write(Write_Command,0x98); //设置DDRAM地址 Delay_10us(); for(i=0;i<16;i++) { LCD12864_Write(Write_Data,*addr); addr++; }}
/*----------------------------指定位置显示字符----------------------------*/void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2){ LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set); switch(y) { case 0: LCD12864_Write(Write_Command,0x80+x); //设置DDRAM地址 Delay_10us(); LCD12864_Write(Write_Data,Data1); LCD12864_Write(Write_Data,Data2); break; case 1: LCD12864_Write(Write_Command,0x90+x); //设置DDRAM地址 Delay_10us(); LCD12864_Write(Write_Data,Data1); LCD12864_Write(Write_Data,Data2); break; case 2: LCD12864_Write(Write_Command,0x88+x); //设置DDRAM地址 Delay_10us(); LCD12864_Write(Write_Data,Data1); LCD12864_Write(Write_Data,Data2); break; case 3: LCD12864_Write(Write_Command,0x98+x); //设置DDRAM地址 Delay_10us(); LCD12864_Write(Write_Data,Data1); LCD12864_Write(Write_Data,Data2); break; }}
/*----------------------------初始化12864----------------------------*/void LCD12864_Init(void){ Delay_x10ms(4); //40mS延时 LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set); Delay_x10us(10); //100uS延时 LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set); Delay_x10us(4); //40uS延时 LCD12864_Write(Write_Command,Clear_Display); //显示光标闪烁完全关闭 Delay_x10us(10); //100uS延时 LCD12864_Write(Write_Command,Clear_Display); //清除显示 Delay_x10ms(1); //10mS延时 LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right); //光标右移模式 Delay_x10us(10); //100uS延时 LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off); //开显示,无光标,光标不闪烁 Delay_x10us(10); //100uS延时 Clear_GDRAM(); //清空GDRAM Delay_x10us(10); //100uS延时}
声明:该装置正常通过民航安检,没有在起飞降落阶段使用,没有任何锂电池处于充电状态,没有发射无线电信号的功能,没有导体意外接触裸露电极,没有影响其他人员或造成不良后果,请勿模仿。 帮发几个 STC32G/STC8H, SPI/I2C 控制 LCD12864的例子{:4_196:} 你这个是用软件模拟SPI能不能做内部SPI驱动 没有工程文件吗?好麻烦哦
#include "./comm/STC32G.H"
#define MAIN_Fosc 24000000L //?????
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define LCD_Data P2
sbit LCD_RS = P0^1;//????
sbit LCD_RW = P0^2;
sbit LCD_E= P0^3;
sbit PSB = P0^4; //PSB??12864??????????,????8?????,PSB=1
sbit LCD_RESET = P4^5; //17---RESETL-->Enable
#define LCD12864_SID LCD_RW
#define LCD12864_SCLKLCD_E
#define Busy 0x80 //????LCD?????Busy??
#define Write_Command 0xf8
#define Write_Data 0xfa
#define Read_Command 0xfc
#define Read_Data 0xfe
#define Setting_Basic_Instruction_Set 0x30
#define Setting_Extended_Instruction_Set_Drawing_Off 0x34
#define Setting_Extended_Instruction_Set_Drawing_On 0x36
#define Clear_Display 0x01
#define Entry_Mode_Cursor_Left 0x04
#define Entry_Mode_Entire_Right 0x05
#define Entry_Mode_Cursor_Right 0x06
#define Entry_Mode_Entire_Left 0x07
#define Display_Off 0x08
#define Display_On_Cursor_Off_Inverse_Off 0x0c
#define Display_On_Cursor_Off_Inverse_On 0x0d
#define Display_On_Cursor_On_Inverse_Off 0x0e
#define Display_On_Cursor_On_Inverse_On 0x0f
#define Cursor_Move_Left 0x10
#define Cursor_Move_Right 0x14
#define Display_Move_Left 0x18
#define Display_Move_Right 0x1c
void Delay_10us()
{
u32 i;
u16 us = 10;
do {
i = MAIN_Fosc / 13;
while(--i) ; //14T per loop
} while(--us);
}
void Delay_x10us(u16 tm)
{
u16 i = tm;
do {
Delay_10us(); //14T per loop
} while(--i);
}
void Delay_10ms()
{
u16 i;
u16 ms = 10;
do {
i = MAIN_Fosc / 1300;
while(--i) ; //14T per loop
} while(--i);
}
void Delay_x10ms(u16 tm)
{
u16 i = tm;
do {
Delay_10ms(); //14T per loop
} while(--i);
}
/*----------------------------?1???????----------------------------*/
void LCD12864_Write_Byte(unsigned char temp)
{
unsigned char i;
for(i=0; i<8; i++) {
if((temp<<i)&0x80)
LCD12864_SID=1;
else
LCD12864_SID=0;
LCD12864_SCLK=0;
LCD12864_SCLK=1;
}
}
/*----------------------------????????----------------------------*/
void LCD12864_Write(unsigned char Command,unsigned char temp)
{
LCD12864_Write_Byte(Command);
LCD12864_Write_Byte(temp&0xf0);
LCD12864_Write_Byte((temp<<4)&0xf0);
}
/*----------------------------??GDRAM----------------------------*/
void Clear_GDRAM(void)
{
unsigned char i,j,k;
LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off);
k=0x80;
for(i=0; i<32; i++) {
LCD12864_Write(Write_Command,k++);
LCD12864_Write(Write_Command,0x80);
for(j=0; j<16; j++) {
LCD12864_Write(Write_Data,0x00);
}
}
k=0x80;
for(i=0; i<32; i++) {
LCD12864_Write(Write_Command,k++);
LCD12864_Write(Write_Command,0x88);
for(j=0; j<16; j++) {
LCD12864_Write(Write_Data,0x00);
}
}
LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);
}
/*----------------------------??????----------------------------*/
void Display_Text(unsigned char code *addr)
{
unsigned char i;
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
LCD12864_Write(Write_Command,0x80); //??DDRAM??
Delay_10us();
for(i=0; i<16; i++) {
LCD12864_Write(Write_Data,*addr);
addr++;
}
LCD12864_Write(Write_Command,0x90); //??DDRAM??
Delay_10us();
for(i=0; i<16; i++) {
LCD12864_Write(Write_Data,*addr);
addr++;
}
LCD12864_Write(Write_Command,0x88); //??DDRAM??
Delay_10us();
for(i=0; i<16; i++) {
LCD12864_Write(Write_Data,*addr);
addr++;
}
LCD12864_Write(Write_Command,0x98); //??DDRAM??
Delay_10us();
for(i=0; i<16; i++) {
LCD12864_Write(Write_Data,*addr);
addr++;
}
}
/*----------------------------????????----------------------------*/
void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2)
{
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
switch(y) {
case 0:
LCD12864_Write(Write_Command,0x80+x); //??DDRAM??
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
case 1:
LCD12864_Write(Write_Command,0x90+x); //??DDRAM??
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
case 2:
LCD12864_Write(Write_Command,0x88+x); //??DDRAM??
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
case 3:
LCD12864_Write(Write_Command,0x98+x); //??DDRAM??
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
}
}
/*----------------------------???12864----------------------------*/
void LCD12864_Init(void)
{
Delay_x10ms(4); //40mS??
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
Delay_x10us(10); //100uS??
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
Delay_x10us(4); //40uS??
LCD12864_Write(Write_Command,Clear_Display); //??????????
Delay_x10us(10); //100uS??
LCD12864_Write(Write_Command,Clear_Display); //????
Delay_x10ms(1); //10mS??
LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right); //??????
Delay_x10us(10); //100uS??
LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off); //???,???,?????
Delay_x10us(10); //100uS??
Clear_GDRAM(); //??GDRAM
Delay_x10us(10); //100uS??
}
unsigned char code LCD_STR[] = {"HELLO"};
void main(void)
{
P0M1 = 0x00;
P0M0 = 0x00; //???????
P1M1 = 0x00;
P1M0 = 0x00; //???????
P2M1 = 0x00;
P2M0 = 0x00; //???????
P3M1 = 0x00;
P3M0 = 0x00; //???????
P4M1 = 0x00;
P4M0 = 0x00; //???????
P5M1 = 0x00;
P5M0 = 0x00; //???????
P6M1 = 0x00;
P6M0 = 0x00; //???????
P7M1 = 0x00;
P7M0 = 0x00; //???????
LCD12864_Init(); //LCM???
Delay_x10ms(5); //????(???)
while(1) {
Display_Text(LCD_STR);
}
}
不知道为啥,我试了不行。 上面是我的代码和连接图 请问这2条设置指令发送了2次,是因为有时会有发送不成功的现象吗。
RobinHou 发表于 2025-4-1 11:39
请问这2条设置指令发送了2次,是因为有时会有发送不成功的现象吗。
忘记了,可能是数据手册要求的
页:
[1]