为什么要读两次,这是厂家研发时定好的,我们就不要理它了,反正记住就行.
好了,拿到数据后记住将IO设回输出状态, ARM输入输出设置是比51麻烦多了,可能功能越强大就越麻烦吧.
最后,记住给调用它的程式返回一个读出的值.
好了,读出颜色了有办法了,我们就写个代码将字符显示出来吧.其实和上一季的差不多.改动一下就OK了.
以下是全部代码,大家可以改动来玩玩.记住.会改了,就是懂了.
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "FONT.h"
//快速IO
#define LCD_CS_SET GPIOC->BSRR=1<<9 //片选端口 PC9
#define
LCD_RS_SET
GPIOC->BSRR=1<<8 //数据/命令  

C8
#define LCD_WR_SET GPIOC->BSRR=1<<7 //写数据 PC7
#define LCD_RD_SET GPIOC->BSRR=1<<6 //读数据 PC6
#define LCD_CS_CLR GPIOC->BRR=1<<9 //片选端口 PC9
#define
LCD_RS_CLR
GPIOC->BRR=1<<8 //数据/命令  

C8
#define LCD_WR_CLR GPIOC->BRR=1<<7 //写数据 PC7
#define LCD_RD_CLR GPIOC->BRR=1<<6 //读数据 PC6
//慢速IO
#define LCD_CS PCout(9) //片选端口 PC9
#define
LCD_RS
PCout(8) //数据/命令  

C8
#define LCD_WR PCout(7) //写数据 PC7
#define LCD_RD PCout(6) //读数据 PC6
#define LCD_LED PCout(10) //背光
//PB0~15,作为数据线
#define DATAOUT(x) GPIOB->ODR=x; //数据输出
#define DATAIN GPIOB->IDR; //数据输入
#define LCD_WR_DATA(data){\
LCD_RS_SET;\
LCD_CS_CLR;\
DATAOUT(data);\
LCD_WR_CLR;\
LCD_WR_SET;\
LCD_CS_SET;\
}
u16 F_COLOR,B_COLOR;
void LCD_IO_Init(void)
{
RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟
RCC->APB2ENR|=1<<0; //开启辅助时钟
JTAG_Set(SWD_ENABLE); //开启SWD
//PORTC6~10 推挽输出
GPIOC->CRH&=0XFFFFF000;
GPIOC->CRH|=0X00000333;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X07C0;
//PORTB 推挽输出
GPIOB->CRH=0X33333333;
GPIOB->CRL=0X33333333;
GPIOB->ODR=0XFFFF;
}
////正常IO写 寄存器 函数
//void LCD_WR_REG(u8 data)
//{
// LCD_RS=0;//写地址
// LCD_CS=0;
// DATAOUT(data);
// LCD_WR=0;
// LCD_WR=1;
// LCD_CS=1;
//}
//
////正常IO写 8位数据 函数
//void LCD_WR_DATA(u16 data)
//
//{
//LCD_RS=1;
//LCD_CS=0;
//DATAOUT(data);
//LCD_WR=0;
//LCD_WR=1;
//LCD_CS=1;
//}
//写寄存器函数=>快
void LCD_WR_REG(u8 data)
{
LCD_RS_CLR;//写地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
//写寄存器
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
//读寄存器
u16 LCD_ReadReg(u8 LCD_Reg)
{
u16 t;
LCD_WR_REG(LCD_Reg); //写入要读的寄存器号
GPIOB->CRL=0X88888888; //PB0-7 上拉输入
GPIOB->CRH=0X88888888; //PB8-15 上拉输入
GPIOB->ODR=0XFFFF; //全部输出高
LCD_RS=1;
LCD_CS=0;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD=0;
LCD_RD=1;
t=DATAIN;
LCD_CS=1;
GPIOB->CRL=0X33333333; //PB0-7 上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF; //全部输出高
return t;
}
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 t;
LCD_WriteReg(0x0020,x); //X
LCD_WriteReg(0x0021,y); //Y
LCD_WR_REG(0x22); //选择GRAM地址
GPIOB->CRL=0X88888888; //PB0-7 上拉输入
GPIOB->CRH=0X88888888; //PB8-15 上拉输入
GPIOB->ODR=0XFFFF; //全部输出高
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读GRAM时,需要读2次)
LCD_RD_CLR;
LCD_RD_SET;
delay_us(2);//FOR 9320,延时2us
//dummy READ
LCD_RD_CLR;
delay_us(2);//FOR 8989,延时2us
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
GPIOB->CRL=0X33333333; //PB0-7 上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF; //全部输出高
return t;
}
void LCD_init() // LCD ID: 0xB505
{
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x0000,0x0000);
LCD_WriteReg(0x00a4,0x0001);
delay_ms(20);
LCD_WriteReg(0x0060,0x2700);
LCD_WriteReg(0x0008,0x0202);
LCD_WriteReg(0x0030,0x0214);
LCD_WriteReg(0x0031,0x3715);
LCD_WriteReg(0x0032,0x0604);
LCD_WriteReg(0x0033,0x0e16);
LCD_WriteReg(0x0034,0x2211);
LCD_WriteReg(0x0035,0x1500);
LCD_WriteReg(0x0036,0x8507);
LCD_WriteReg(0x0037,0x1407);
LCD_WriteReg(0x0038,0x1403);
LCD_WriteReg(0x0039,0x0020);
LCD_WriteReg(0x0090,0x001a);
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x0007);
LCD_WriteReg(0x0012,0x0000);
LCD_WriteReg(0x0013,0x0000);
delay_ms(20);
LCD_WriteReg(0x0010,0x0730);
LCD_WriteReg(0x0011,0x0137);
delay_ms(20);
LCD_WriteReg(0x0012,0x01b8);
delay_ms(20);
LCD_WriteReg(0x0013,0x0f00);
LCD_WriteReg(0x002a,0x0080);
LCD_WriteReg(0x0029,0x0048);
delay_ms(20);
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700);
LCD_WriteReg(0x0003,0x1230);//LCD_WriteReg(0x0003,0x1230);
LCD_WriteReg(0x0008,0x0202);
LCD_WriteReg(0x000a,0x0000);
LCD_WriteReg(0x000c,0x0000);
LCD_WriteReg(0x000d,0x0000);
LCD_WriteReg(0x000e,0x0030);
LCD_WriteReg(0x0050,0x0000);
LCD_WriteReg(0x0051,0x00ef);
LCD_WriteReg(0x0052,0x0000);
LCD_WriteReg(0x0053,0x013f);
LCD_WriteReg(0x0060,0x2700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006a,0x0000);
//LCD_WriteReg(0x0080,0x0000);
//LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0090,0X0011);
LCD_WriteReg(0x0092,0x0600);
LCD_WriteReg(0x0093,0x0402);
LCD_WriteReg(0x0094,0x0002);
delay_ms(20);
LCD_WriteReg(0x0007,0x0001);
delay_ms(20);
LCD_WriteReg(0x0007,0x0061);
LCD_WriteReg(0x0007,0x0173);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x0000);
LCD_WriteReg(0x00,0x22);
LCD_LED=1;
}
//设置一种颜色************************************************************************************************
u16 color(u8 R,u8 G,u8 B)
{
u16 CRGB,RGB0,RGB1,RGB2,RGB3,RGB4;
RGB0=B;
RGB1=G;
RGB2=RGB1<<5;
RGB3=R;
RGB4=RGB3<<11;
CRGB =RGB0|RGB2|RGB4;
return CRGB;
}
//画一个点 ************************************************************************************************
void DrawPoint(u16 x,u16 y)
{
LCD_WriteReg(0x0020,x); //X
LCD_WriteReg(0x0021,y); //Y
LCD_WR_REG(0x22);
LCD_WR_DATA(F_COLOR);
}
//以背景色清屏 ************************************************************************************************
void clear_lcd()
{
u16 i,j;
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(B_COLOR);
}
}
}
//透明背景色的显示字符函数 ***********************************************************************************
void SHOW_char_NBC(u8 Page,u8 List,u8 onechar)
{
u8 i,j;
u16 temp1,temp2,temp3,temp4;
temp1=onechar-' ';
temp3=F_COLOR;
for (i=0;i<16;i++)
{
temp4=asc2_1608[temp1];
for (j=0;j<8;j++)
{
temp2 = temp4;
temp2 &= 0x01;
temp4 >>=1;
if(temp2==0)
{
F_COLOR=LCD_ReadPoint(List*8+j,Page*16+i);
}
else
{
F_COLOR=temp3;
}
LCD_WriteReg(0x0020,List*8+j); //X
LCD_WriteReg(0x0021,Page*16+i); //Y
LCD_WR_REG(0x22);
LCD_WR_DATA(F_COLOR);
}
}
}
//固定前影色和背景色的显示字符函数 ************************************************************************************************
void SHOW_char(u8 Page,u8 List,u8 onechar)
{
u8 i,j;
u16 temp1,temp2,temp3,temp4;
temp1=onechar-' ';
temp3=F_COLOR;
LCD_WriteReg(0x0050,List*8);
LCD_WriteReg(0x0051,(List*8)+7);
LCD_WriteReg(0x0052,Page*16);
LCD_WriteReg(0x0053,(Page*16)+15);
LCD_WriteReg(0x0020,List*8); //X
LCD_WriteReg(0x0021,Page*16); //Y
LCD_WR_REG(0x22);
for (i=0;i<16;i++)
{
temp4=asc2_1608[temp1];
for (j=0;j<8;j++)
{
temp2 = temp4;
temp2 &= 0x01;
temp4 >>=1;
if(temp2==0)
{
F_COLOR=B_COLOR;
}
else
{
F_COLOR=temp3;
}
LCD_WR_DATA(F_COLOR);
}
}
}
// 主函数 ************************************************************************************************
int main(void)
{
u8 k=' ';
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
while (1)
{
B_COLOR=color(7,14,7);
clear_lcd();
B_COLOR = color(30,0,0);
F_COLOR = color(30,60,30);
SHOW_char_NBC(9,14,k); //void SHOW_char(u8 Page,u8 List,u8 onechar)
k=k+1;
if (k-' '>=95)k=' ';
delay_ms(500);
}
}