以上绿色的这些主要是高位有零不显示的,比如 1238 没理由显示成 01238吧.这些绿色的程式主要是去掉不要的0的.
好了,man()函数我也小改了一下.
以下我帖出全部的代码,大家一齐来玩玩.偶觉觉去了.这些准备好了,明天我们来搞触摸屏,主要是玩通那AD转换 ADS7843的蕊片.
#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);
}
}
F_COLOR=temp3; //返回颜色值
}
//固定前影色和背景色的显示字符函数 ************************************************************************************************
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);
}
}
F_COLOR=temp3;
LCD_WriteReg(0x0050,0); //开放回窗口
LCD_WriteReg(0x0051,239);
LCD_WriteReg(0x0052,0);
LCD_WriteReg(0x0053,319);
}
//用背景色刷出N个字符位 *****************************************************************************************
void Clear_line(u8 page,u8 list,u8 N)
{
u8 i;
for (i=0;i<N;i++)
{
SHOW_char(page,list,' ');
list=list+1;
}
}
//显示一串字符函数 ************************************************************************************************
void linechar_1608t(u8 Page,u8 List,u8 *pd)
{
u8 temp;
while((*pd)!='\0')
{
temp=*pd;
SHOW_char_NBC(Page,List,temp);
pd++;
List=List+1;
}
}
// 显示数字串 *******************************************************************************************
void count_show(u8 Page,u8 List,u16 input)
{
u16 temp0,temp1,temp2,temp3,temp4,A,B;
temp0=input/10000; //将脉冲个数转换成字符由1602输出
A=input%10000;
temp1=A/1000;
B=A%1000;
temp2=B/100;
A=B%100;
temp3=A/10;
B=A%10;
temp4=B;
if (temp0!=0)
{
SHOW_char_NBC(Page,List,'0'+temp0);
List=List+1;
}
if ((temp1!=0)|(temp0!=0))
{
SHOW_char_NBC(Page,List,'0'+temp1);
List=List+1;
}
if ((temp2!=0)|(temp1!=0)|(temp0!=0))
{
SHOW_char_NBC(Page,List,'0'+temp2);
List=List+1;
}
if ((temp3!=0)|(temp2!=0)|(temp1!=0)|(temp0!=0))
{
SHOW_char_NBC(Page,List,'0'+temp3);
List=List+1;
}
SHOW_char_NBC(Page,List,'0'+temp4);
}
// 主函数 ************************************************************************************************
int main(void)
{
u8 k=' ';
u16 i=0;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
B_COLOR=color(7,14,7);
clear_lcd();
while (1)
{
F_COLOR = color(0,60,0);
linechar_1608t(3,6,"This is char show\0");
count_show(5,12,i);
F_COLOR = color(0,60,0);
SHOW_char_NBC(9,14,k);
k=k+1;
i=i+1;
if (k-' '>=95)k=' ';
if (i==50000)i=0;
delay_ms(50);
B_COLOR=color(7,14,7);
SHOW_char(9,14,' ');
Clear_line(3,6,18);
Clear_line(5,12,5);
delay_ms(50);
}
}