OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9727|回复: 7

学习STM32 玩TFT屏 第八季

[复制链接]

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2012-6-24 03:53:49 | 显示全部楼层 |阅读模式
 这季没啥,都是为触摸屏做准备.我们先完善几个小函数.明天为触摸屏学习做介面.

首先是:

//显示一串字符函数  ************************************************************************************************
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;
 }

}

非常好看,我就不多说了.以下是粉笔擦~~~~~~擦屏用的,不是擦PP的:

//用背景色刷出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 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);

}


以上绿色的这些主要是高位有零不显示的,比如 1238 没理由显示成 01238吧.这些绿色的程式主要是去掉不要的0的.

好了,man()函数我也小改了一下.

// 主函数   ************************************************************************************************
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);
}
}


以下我帖出全部的代码,大家一齐来玩玩.偶觉觉去了.这些准备好了,明天我们来搞触摸屏,主要是玩通那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);
}
}

我的工作就是天天在玩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2011-8-16
在线时间
0 小时
发表于 2012-6-24 07:36:31 | 显示全部楼层
STM32好难……
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-6-24 09:43:35 | 显示全部楼层
不错.呵呵.
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-5-7
在线时间
8 小时
发表于 2012-6-24 19:48:31 | 显示全部楼层
楼主,那么晚还在挑灯夜敲代码啊,太厉害了,注意身体啊……
耐心做事,好好做人。O(∩_∩)O!
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-24 20:28:48 | 显示全部楼层
不是晚,是早~~~~~~~~~~~
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-5-7
在线时间
8 小时
发表于 2012-6-24 21:28:42 | 显示全部楼层
回复【5楼】chinafox:
---------------------------------
楼主你给个邮箱吧,你的编译程序始终有个问题发给你看下,不知可否
耐心做事,好好做人。O(∩_∩)O!
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-25 02:43:43 | 显示全部楼层
200580328@QQ.COM
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-8-25 13:13:01 | 显示全部楼层
学习mark
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 13:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表